시중에 파는 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