UVC协议学习以及UVC摄像头抓包对比UVC协议数据帧

通过BUS Hound抓包得到数据文件如下

UVC 架构学习 uvc协议详解_UVC 架构学习

先看第一行,CTL意为“USB control transfer”,即控制传输,熟悉USB通信的朋友应该都知道USB有四种数据传输方式,其中“控制传输”为仅有的双向传输方式,USB枚举过程中就是用的控制传输方式与USB从机的端点0进行通信的,Device那一列“19.0”,表示通信端点为UVC设备的端点0。

UVC摄像头插入PC后,PC向其端点0发送了8个Byte的数据:80 06 00 01  00 00 12 00,第四字节“01”与第七字节“12”代表PC请求UVC设备发送“设备描述符至主机,设备描述符长度为18Byte”。

再看第二行,“IN”表示数据传输方向为输入,即PC接收UVC摄像头返回的18Byte数据:12 01 00 02  ef 02 01 40  93 69 14 b0  01 00 01 02  00 01,关于这18Byte的定义,UVC官方文档给出了很详细的解释,如下图所示,其中PC就是通过画红圈的那三个字节数据知道该设备为UVC设备的。接下来我们关注第三第四字节即“bcdUSB”,由于USB传输是低字节先传输,故我们知道我们采用的为USB2.0协议。

UVC 架构学习 uvc协议详解_字段_02

接下来继续往下看

UVC 架构学习 uvc协议详解_描述符_03

PC收到UVC摄像头返回的18Byte配置描述符后,紧接着又发出了第二条控制命令:

80 06 00 02  00 00 09 00,第四字节“02”与第七字节“09”表示“请求UVC发送自己的配置描述符至PC,数据长度9Byte”。

随后UVC摄像头返回了9Byte数据至PC:09 02 8c 01  02 01 00 80  fa,关于配置描述符的详细信息,UVC官方文档给出了如下描述。

UVC 架构学习 uvc协议详解_字段_04

其中,我们暂时先关注下第3、4字节,即“wTotalLength”参数,由于USB传输是低字节先传输,故我们知道,该配置描述符以及其下所有的接口描述符和端点描述符的总字节长度为0x18c字节。

紧接着,PC开始向UVC摄像头端点0发送第三次控制命令啦:80 06 00 02  00 00 8c 01,第7、8字节是不是很眼熟啊?没错,第4字节还是“02”,PC这次还是发送的读取UVC设备“配置描述符”命令,但是这次读取的字节长度是“0x18c”字节,那这次就是将“接口描述符”和“端点描述符”全都读出来啦!数据量比较大,如下图所示。

UVC 架构学习 uvc协议详解_UVC 架构学习_05

接下来我们就要对“接口描述符”和“端点描述符”进行分析了

接下来就要使用UVCview软件了打开软件,抓取摄像头插入时的数据包如下所示

UVC 架构学习 uvc协议详解_描述符_06

软件已经帮我们把描述符进行解析了

首先我们要先看IAD描述符IAD是“Interface Association Descriptor”的简写,译为“接口联合描述符”,一个配置描述符是接口描述符的集合,在UVC中,IAD描述符就是描述一个视频接口集合的,对于每一个设备功能需要一个视频控制接口(VideoControl Interface)和一个或者多个视频流接口(VideoStreaming Interface)。如下图所示

UVC 架构学习 uvc协议详解_字段_07

UVC 架构学习 uvc协议详解_字段_08

对比文档“bInterfaceCount”参数为0x02,可知该配置下有两个视频接口—“VC和VS”。

接下来我们就要细致的看每个“接口描述符“了

首先来看第一个如下图所示

UVC 架构学习 uvc协议详解_描述符_09

 

UVC 架构学习 uvc协议详解_字段_10

此描述符为VC端口描述符,可知VC的接口为0x0E,VS的接口为0x01

UVC 架构学习 uvc协议详解_描述符_11

UVC 架构学习 uvc协议详解_描述符_12

UVC 架构学习 uvc协议详解_UVC 架构学习_13

UVC 架构学习 uvc协议详解_数据_14

这个描述符描述了VC输出到主机的USB的通道终端

UVC 架构学习 uvc协议详解_字段_15

 

UVC 架构学习 uvc协议详解_描述符_16

这个描述符描述了代表CCD传感器(以及相关的A/D转换器)的输入终端,产生的数字视频流通过单个的输出引脚离开输入端。该设备还支持“Auto-Exposure“自动曝光、”Exposure Time“曝光时间、”Zoom“变焦、”Pan“平移功能

UVC 架构学习 uvc协议详解_UVC 架构学习_17

UVC 架构学习 uvc协议详解_描述符_18

该描述符描述处理单元,该处理单元由选择单元传递的视频流数据。此实现支持“Brightness“亮度、”Contrast“对比度、”Saturation“饱和度、”Sharpness“锐度、”White Balance Temperature“白平衡、”Backlight Compensation“背光补偿、”Gain“增益、”Power Line Frequency“频率、”White Balance Temperature, Auto“自动白平衡的调节

UVC 架构学习 uvc协议详解_UVC 架构学习_19

UVC 架构学习 uvc协议详解_数据_20

此描述符用于状态返回的中断端点,没8ms进行一次判断

UVC 架构学习 uvc协议详解_字段_21

UVC 架构学习 uvc协议详解_数据_22

此描述符用于描述中断类的特定信息

UVC 架构学习 uvc协议详解_字段_23

UVC 架构学习 uvc协议详解_UVC 架构学习_24

此描述符为VS接口描述符0x0E为视频类接口0x02为视频流类接口

UVC 架构学习 uvc协议详解_UVC 架构学习_25

UVC 架构学习 uvc协议详解_字段_26

这个描述符描述了这个接口支持的视频格式数量,以及这个接口中所有类特定的描述符的总大小。

UVC 架构学习 uvc协议详解_描述符_27

UVC 架构学习 uvc协议详解_数据_28

特定颜色匹配描述符

UVC 架构学习 uvc协议详解_数据_29

UVC 架构学习 uvc协议详解_字段_30

该描述符描述了设备支持的视频格式。设备支持多种(MJPEG)格式,所以有多个格式描述符

UVC 架构学习 uvc协议详解_描述符_31

UVC 架构学习 uvc协议详解_字段_32

特定颜色匹配描述符

UVC 架构学习 uvc协议详解_UVC 架构学习_33

UVC 架构学习 uvc协议详解_数据_34

标准批量端点描述符

 

以上就是除了扩展功能的描述符的USB抓包和UVC协议的对比

 

接下来让我们看看扩展功能描述符的内容

UVC设备厂家为留出设备的调试接口,或者扩展一些UVC以外的特殊功能,会在USB固件中添加一些私有命令,UVC扩展单元(Extension Unit),UVC扩展单元是专门为了给设备厂家提供私有命令的Unit 

扩展单元也是一样,如果我们在Extension Unit描述符中打开私有命令属性,则在UVC设备枚举过程中,PC也会发起对Extension Unit的询问。

UVC 架构学习 uvc协议详解_UVC 架构学习_35

如上述抓包,UVC摄像头的扩展单元“bNumControls“值为0x06,”bmControls“值为0x3f、0x00。可以分析出该摄像头留了6条私有命令通道,其中用到了6条,bit置1的位即为打开私有命令通道号。

结合抓包信息哦,完成接口描述符和端点描述符的读取后开始进行紧接着开始获取Extension Unit私有命令通道的属性信息,在获取完成后,继续获取Process Unit属性,然后完成枚举。

UVC 架构学习 uvc协议详解_字段_36

a1 85 00 01  00 02 02 00 GET LEN命令,第六字节“02“,是因为Extension Unit Id为02,第四字节为“01”,表示这是第一通道,PC分别枚举了1-6,六个通道,这就和bmControls值对应起来了,可以发现bit0对应的私有通道序号为1,即私有通道号是从1开始计数的。

UVC 架构学习 uvc协议详解_描述符_37

从上图可以看出来PC分别按GET_LEN、GET_INFO、GET_MIN、GET_MAX、GET_RES、GET_DEF的顺序获取通道属性。以通道1为例,GET_LEN获得的反馈为0004,则PC像该通道一次只能写入4Byte数据。

至此UVC报文解析完毕

UVC请求格式分析

设置格式请求

Table 4-1 Set Request

bmRequestType

bRequest

wValue

wIndex

wLength

Data

00100001

SET_CUR

See
following
paragraphs.

Entity ID and
Interface.

Length of
parameter
block.

Parameter
block.

00100010

Endpoint.

 

 

 

 

 

获取格式请求

Table 4-2 Get Request

bmRequestType

bRequest

wValue

wIndex

wLength

Data

10100001

GET_CUR
GET_MIN
GET_MAX
GET_RES
GET_LEN
GET_INFO
GET_DEF

See following
paragraphs.

Entity ID and
Interface

Length of
parameter
block

Parameter
block

10100010

Endpoint.

 

 

 

 

 

字段释义

1、bmRequestType字段(1字节)

1)D7,下一步数据的出传输方向

0 = 主机到设备(SET请求)

1 = 设备到主机(GET请求)

 

2)D6-D5,命令的类型

00 = 标准请求命令

01 = 类请求命令(UVC规范中的请求属于类请求命令)

10 = 用户定义的请求命令

11 = 保留

 

3)D4-D0,命令接受者的类型

00000 = 接受者为设备(UVC无此值)

00001 = 接收者为接口(UVC规范中可以理解为VS接口)

00010 = 接受者为端点(UVC规范中可以理解为VS接口的视频数据端点)

00011 = 其他接受者

其他值保留。

 

2、bRequest字段(1字节)

Table A- 8 Video Class-Specific Request Codes

Class-Specific Request Code

Value

RC_UNDEFINED

0x00

SET_CUR

0x01

SET_CUR_ALL

0x11

GET_CUR

0x81

GET_MIN

0x82

GET_MAX

0x83

GET_RES

0x84

GET_LEN

0x85

GET_INFO

0x86

GET_DEF

0x87

GET_CUR_ALL

0x91

GET_MIN_ALL

0x92

GET_MAX_ALL

0x93

GET_RES_ALL

0x94

GET_DEF_ALL

0x97

3、wValue字段(2字节)

UVC中大多数情况下wValue的取值都为控制选择器CS(高字节),低字节为零。CS的取值受限于wIndex字段中的Entity ID。当Entity ID取不同值时则wValue字段取值也会有所不同。wValue主要取值如下:

1)、当Entity ID值为VC Interface时:

Table A- 9 VideoControl Interface Control Selectors

Control Selector

Value

VC _CONTROL_ UNDEFINED

0x00

VC_VIDEO_POWER_MODE_CONTROL

0x01

VC_REQUEST_ERROR_CODE_CONTROL

0x02

Reserved

0x03

2)当Entity ID值为Teminal时:

Table A- 10 Terminal Control Selectors

Control Selector

Value

TE_CONTROL_UNDEFINED

0x00

3)当Entity ID值为Selector Unit时:

Table A- 11 Selector Unit Control Selectors

Control Selector

Value

SU_CONTROL_UNDEFINED

0x00

SU_INPUT_SELECT_CONTROL

0x01

4)当Entity ID值为Processing Unit时:

Table A- 13 Processing Unit Control Selectors

Control Selector

Value

PU_CONTROL_UNDEFINED

0x00

PU_BACKLIGHT_COMPENSATION_CONTROL

0x01

PU_BRIGHTNESS_CONTROL

0x02

PU_CONTRAST_CONTROL

0x03

PU_GAIN_CONTROL

0x04

PU_POWER_LINE_FREQUENCY_CONTROL

0x05

PU_HUE_CONTROL

0x06

PU_SATURATION_CONTROL

0x07

PU_SHARPNESS_CONTROL

0x08

PU_GAMMA_CONTROL

0x09

PU_WHITE_BALANCE_TEMPERATURE_CONTROL

0x0A

PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL

0x0B

PU_WHITE_BALANCE_COMPONENT_CONTROL

0x0C

PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL

0x0D

PU_DIGITAL_MULTIPLIER_CONTROL

0x0E

PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL

0x0F

PU_HUE_AUTO_CONTROL

0x10

PU_ANALOG_VIDEO_STANDARD_CONTROL

0x11

PU_ANALOG_LOCK_STATUS_CONTROL

0x12

PU_CONTRAST_AUTO_CONTROL

0x13

5)当Entity ID值为Camera Terminal时:

Table A- 12 Camera Terminal Control Selectors

Control Selector

Value

CT_CONTROL_UNDEFINED

0x00

CT_SCANNING_MODE_CONTROL

0x01

CT_AE_MODE_CONTROL

0x02

CT_AE_PRIORITY_CONTROL

0x03

CT_EXPOSURE_TIME_ABSOLUTE_CONTROL

0x04

CT_EXPOSURE_TIME_RELATIVE_CONTROL

0x05

CT_FOCUS_ABSOLUTE_CONTROL

0x06

CT_FOCUS_RELATIVE_CONTROL

0x07

CT_FOCUS_AUTO_CONTROL

0x08

CT_IRIS_ABSOLUTE_CONTROL

0x09

CT_IRIS_RELATIVE_CONTROL

0x0A

CT_ZOOM_ABSOLUTE_CONTROL

0x0B

CT_ZOOM_RELATIVE_CONTROL

0x0C

CT_PANTILT_ABSOLUTE_CONTROL

0x0D

CT_PANTILT_RELATIVE_CONTROL

0x0E

CT_ROLL_ABSOLUTE_CONTROL

0x0F

CT_ROLL_RELATIVE_CONTROL

0x10

CT_PRIVACY_CONTROL

0x11

CT_FOCUS_SIMPLE_CONTROL

0x12

CT_WINDOW_CONTROL

0x13

CT_REGION_OF_INTEREST_CONTROL

0x14

6)当Entity ID值为Extension Unit时:

Table A- 15 Extension Unit Control Selectors

Control Selector

Value

XU_CONTROL_UNDEFINED

0x00

 

7)当Entity ID值为VS Interface

Table A- 16 VideoStreaming Interface Control Selectors

Control Selector

Value

VS_CONTROL_UNDEFINED

0x00

VS_PROBE_CONTROL

0x01

VS_COMMIT_CONTROL

0x02

VS_STILL_PROBE_CONTROL

0x03

VS_STILL_COMMIT_CONTROL

0x04

VS_STILL_IMAGE_TRIGGER_CONTROL

0x05

VS_STREAM_ERROR_CODE_CONTROL

0x06

VS_GENERATE_KEY_FRAME_CONTROL

0x07

VS_UPDATE_FRAME_SEGMENT_CONTROL

0x08

VS_SYNCH_DELAY_CONTROL

0x09

4、wIndex字段(2字节)

    Etity ID(高字节),接口或端点(低字节)。Etity ID是由UVC设备开发者指定的,该ID号能标识具体唯一的特定的功能单元,便于Host端的驱动能依次对设备内的不同功能单元进行配置与操作。

5、wLenth字段(2字节)

     传输的数据大小。该字段表示在控制传输中传输数据的大小。主机—>设备时,该字段的值是实际的数据大小,设备—>主机时,wLenth为设备能够发送的最大数据包大小。