UVC协议学习以及UVC摄像头抓包对比UVC协议数据帧
通过BUS Hound抓包得到数据文件如下
先看第一行,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协议。
接下来继续往下看
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官方文档给出了如下描述。
其中,我们暂时先关注下第3、4字节,即“wTotalLength”参数,由于USB传输是低字节先传输,故我们知道,该配置描述符以及其下所有的接口描述符和端点描述符的总字节长度为0x18c字节。
紧接着,PC开始向UVC摄像头端点0发送第三次控制命令啦:80 06 00 02 00 00 8c 01,第7、8字节是不是很眼熟啊?没错,第4字节还是“02”,PC这次还是发送的读取UVC设备“配置描述符”命令,但是这次读取的字节长度是“0x18c”字节,那这次就是将“接口描述符”和“端点描述符”全都读出来啦!数据量比较大,如下图所示。
接下来我们就要对“接口描述符”和“端点描述符”进行分析了
接下来就要使用UVCview软件了打开软件,抓取摄像头插入时的数据包如下所示
软件已经帮我们把描述符进行解析了
首先我们要先看IAD描述符IAD是“Interface Association Descriptor”的简写,译为“接口联合描述符”,一个配置描述符是接口描述符的集合,在UVC中,IAD描述符就是描述一个视频接口集合的,对于每一个设备功能需要一个视频控制接口(VideoControl Interface)和一个或者多个视频流接口(VideoStreaming Interface)。如下图所示
对比文档“bInterfaceCount”参数为0x02,可知该配置下有两个视频接口—“VC和VS”。
接下来我们就要细致的看每个“接口描述符“了
首先来看第一个如下图所示
此描述符为VC端口描述符,可知VC的接口为0x0E,VS的接口为0x01
这个描述符描述了VC输出到主机的USB的通道终端
这个描述符描述了代表CCD传感器(以及相关的A/D转换器)的输入终端,产生的数字视频流通过单个的输出引脚离开输入端。该设备还支持“Auto-Exposure“自动曝光、”Exposure Time“曝光时间、”Zoom“变焦、”Pan“平移功能
该描述符描述处理单元,该处理单元由选择单元传递的视频流数据。此实现支持“Brightness“亮度、”Contrast“对比度、”Saturation“饱和度、”Sharpness“锐度、”White Balance Temperature“白平衡、”Backlight Compensation“背光补偿、”Gain“增益、”Power Line Frequency“频率、”White Balance Temperature, Auto“自动白平衡的调节
此描述符用于状态返回的中断端点,没8ms进行一次判断
此描述符用于描述中断类的特定信息
此描述符为VS接口描述符0x0E为视频类接口0x02为视频流类接口
这个描述符描述了这个接口支持的视频格式数量,以及这个接口中所有类特定的描述符的总大小。
特定颜色匹配描述符
该描述符描述了设备支持的视频格式。设备支持多种(MJPEG)格式,所以有多个格式描述符
特定颜色匹配描述符
标准批量端点描述符
以上就是除了扩展功能的描述符的USB抓包和UVC协议的对比
接下来让我们看看扩展功能描述符的内容
UVC设备厂家为留出设备的调试接口,或者扩展一些UVC以外的特殊功能,会在USB固件中添加一些私有命令,UVC扩展单元(Extension Unit),UVC扩展单元是专门为了给设备厂家提供私有命令的Unit
扩展单元也是一样,如果我们在Extension Unit描述符中打开私有命令属性,则在UVC设备枚举过程中,PC也会发起对Extension Unit的询问。
如上述抓包,UVC摄像头的扩展单元“bNumControls“值为0x06,”bmControls“值为0x3f、0x00。可以分析出该摄像头留了6条私有命令通道,其中用到了6条,bit置1的位即为打开私有命令通道号。
结合抓包信息哦,完成接口描述符和端点描述符的读取后开始进行紧接着开始获取Extension Unit私有命令通道的属性信息,在获取完成后,继续获取Process Unit属性,然后完成枚举。
a1 85 00 01 00 02 02 00 GET LEN命令,第六字节“02“,是因为Extension Unit Id为02,第四字节为“01”,表示这是第一通道,PC分别枚举了1-6,六个通道,这就和bmControls值对应起来了,可以发现bit0对应的私有通道序号为1,即私有通道号是从1开始计数的。
从上图可以看出来PC分别按GET_LEN、GET_INFO、GET_MIN、GET_MAX、GET_RES、GET_DEF的顺序获取通道属性。以通道1为例,GET_LEN获得的反馈为0004,则PC像该通道一次只能写入4Byte数据。
至此UVC报文解析完毕
设置格式请求
Table 4-1 Set Request
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
00100001 |
SET_CUR |
See |
Entity ID and |
Length of |
Parameter |
00100010 |
Endpoint. |
获取格式请求
Table 4-2 Get Request
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
10100001 |
GET_CUR |
See following |
Entity ID and |
Length of |
Parameter |
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为设备能够发送的最大数据包大小。