시중에 파는 USB 카메라는 대게 UVC(USB Video Class) 규격을 따른다.
다만 descriptor 응답과 실제 동작이 일치하지 않는 경우가 있지만,
그래도 전반적인 구조와 동작 방식은 UVC 규격을 따르는 편이다.
UVC에 대해 알아보자.
UVC 전체 동작 구조
시스템 계층 관점
[Application]
↓
[UVC Handling Layer]
↓
[USB Transport Layer]
↓
================ USB =================
↓
[UVC Device Firmware]
├─ Control Interface (제어)
└─ Streaming Interface (영상)
↓
[Sensor + ISP + Image Processing]
디바이스 내부 관점
[Image Sensor] ← HW
↓
[ISP / Image Processing] ← HW + FW
↓
[CT / PU] ← FW (UVC control 대응)
↓
[Encoder] ← FW
↓
[Frame Buffer] ← FW
↓
[USB Endpoint] ← HW + FW
UVC 구조
Control Interface (제어 채널)
Host → Device (Control Transfer)
- 저속 (control transfer)
- Descriptor 기반
CT (Camera Terminal)
제어 항목: Exposure, Focus, Zoom, Tilt, ...., Optical 관련 설정
PU (Processing Unit)
제어 항목: Brightness, Contrast, White Balance, Gain, ...., ISP(이미지 신호 처리) 관련 설정
XU (Extension Unit)
제조사 커스텀 기능
VS(Video Streaming) Interface
포맷(MJPEG, YUV 등), 해상도, FPS를 포함한 스트리밍 관련 정보를 통해 디바이스가 지원하는 스트리밍 모드를 파악할 수 있다.
Device → Host (Isochronous / Bulk Transfer)
고속, continuous streaming, bandwidth 중요
Format Descriptor: MJPEG / YUY2 / H264
Frame Descriptor: 해상도 / FPS
EndPoint: 데이터 전송 통로
VideoStreaming Interface
├─ VS_INPUT_HEADER
├─ VS_FORMAT_MJPEG (bFormatIndex = 1)
│ ├─ VS_FRAME_MJPEG (bFrameIndex = 1) → 640x480 + fps 리스트
│ ├─ VS_FRAME_MJPEG (bFrameIndex = 2) → 1280x720 + fps 리스트
│ ├─ VS_FRAME_MJPEG (bFrameIndex = 3) → 1920x1080 + fps 리스트
│
├─ VS_FORMAT_UNCOMPRESSED (bFormatIndex = 2)
│ ├─ VS_FRAME_UNCOMPRESSED (bFrameIndex = 1)
│ ├─ VS_FRAME_UNCOMPRESSED (bFrameIndex = 2)
└─ Endpoint Descriptor
└─ bmAttributes → Iso / Bulk 결정
(전송 방식)
Isochronous
실시간 보장, 데이터 손실 가능, 대부분의 카메라
Bulk
안정성 높음, 지연 있음, 일부 특수 카메라
VS_FRAME_MJPEG (Descriptor) example
bLength 0x1E
bDescriptorType 0x24 (CS_INTERFACE)
bDescriptorSubType 0x07 (VS_FRAME_MJPEG)
bFrameIndex 0x01
bmCapabilities 0x00
wWidth 0x0280 (640)
wHeight 0x01E0 (480)
dwMinBitRate 0x000E1000
dwMaxBitRate 0x002DC6C0
dwMaxVideoFrameBufferSize 0x0004B000
dwDefaultFrameInterval 0x00051615 (333333 → 30fps)
bFrameIntervalType 0x03 (3개 fps)
dwFrameInterval[0] 0x00051615 (333333 → 30fps)
dwFrameInterval[1] 0x000A2C2A (666666 → 15fps)
dwFrameInterval[2] 0x000F4240 (1000000 → 10fps)
USB 디바이스 구조
Device
├─ Configuration
│ ├─ Interface
│ │ ├─ Endpoint
│ │ ├─ Endpoint
│ │
│ ├─ Interface
│ ├─ Endpoint
│
└─ Endpoint 0 (Control) ← 예외 (Device 레벨)
USB 규격에서는 Control Transfer가 Endpoint 0을 통해 이루어지도록 정의되어 있다.
UVC 규격에서도 협상 및 제어를 위해 Control Transfer를 사용하도록 되어 있다.
따라서 CT/PU 제어는 Control Transfer(EP0)를 통해 수행되며,
MJPEG와 같은 비디오 스트리밍은 별도의 Endpoint를 통해 이루어진다.
Endpoint 0 (Control)
디바이스 초기 통신용, UVC control (CT/PU)
나머지 Endpoint
특정 기능용 (video streaming, audio, HID...)
UVC 제어 과정
CT/PU Descriptor
CT/PU Descriptor 기반 제어 요청 및 GET/SET 동작 과정 (다른 Descriptor도 동일한 흐름)
Host (libuvc / libusb)
↓
Descriptor 읽음
↓
bmControls 확인
↓
"아 brightness 지원하네"
↓
UVC control request (GET/SET)
↓
펌웨어 처리
bmControls 값을 비트 단위로 보고 해당 control 지원 여부를 확인
bmControls: 0x17 0x00 (2bytes little Endian)
↓
0x0017 = 23 (10진수)
↓
23 = 0000 0000 0001 0111 (2진수)
bit | 기능 | 값
0 | Brightness | 1
1 | Contrast | 1
2 | Hue | 1
3 | Saturation | 0
4 | Sharpness | 1
PU Descriptor example
bLength 0x0B
bDescriptorType 0x24
bDescriptorSubType 0x05 (PROCESSING_UNIT)
bUnitID 0x02
bSourceID 0x01
wMaxMultiplier 0x0000
bmControls 0x17 0x00
iProcessing 0x00
CT Descriptor example
bLength 0x12
bDescriptorType 0x24
bDescriptorSubType 0x02 (CAMERA_TERMINAL)
bTerminalID 0x01
wTerminalType 0x0201 (Camera)
bAssocTerminal 0x00
iTerminal 0x00
wObjectiveFocalLengthMin 0x0000
wObjectiveFocalLengthMax 0x0000
wOcularFocalLength 0x0000
bControlSize 0x03
bmControls 0x0F 0x00 0x00

'Engineering > system (device, embedded)' 카테고리의 다른 글
| 라플라스 변환, 전달 함수, 특성 방정식, DC gain (0) | 2024.03.01 |
|---|---|
| Shift Register - 74HC595 (0) | 2024.02.19 |
| 아두이노 DAC, PWM (1) | 2024.02.18 |
| I2C Communication (2) | 2024.02.17 |