从UVC摄像头配置描述符的长度区别来理解USB接口关联描述符IAD
对于如下的UVC摄像头,其在设备管理器中如下图所示:
其硬件ID分别为:
- USB\VID_33F1&PID_1035&REV_0409
- USB\VID_33F1&PID_1035&REV_0409&MI_00
可以看到,其根设备是使用的USBCCGP.sys来驱动的,所以是USB通用驱动程序,其兼容ID为USB\COMPOSITE
而子设备是USB摄像头本身,其兼容ID为USB\Class_0e&SubClass_03&Prot_00,故其对应的驱动程序为usbvideo.sys
我们这里分别对这2个节点加其过滤驱动,通过获取该设备的USB配置描述符,其内容分别为:
这里使用本站的https://www.usbzh.com/tool/usb.html 对其配置功述符分析和对比
ffff800e`be1d6010 09 02 ec 0a 02 01 04 c0 00 08 0b 00 02 0e 03 00 ................
ffff800e`be1d6020 05 09 04 00 00 01 0e 01 00 05 0d 24 01 00 01 71 ...........$...q
ffff800e`be1d6030 00 00 6c dc 02 01 01 12 24 02 01 01 02 00 00 00 ..l.....$.......
ffff800e`be1d6040 00 00 00 00 00 03 0e 1e 00 0b 24 05 02 01 00 40 ..........$....@
ffff800e`be1d6050 02 7f 17 00 1f 24 06 03 41 76 9e a2 04 de e3 47 .....$..Av.....G
ffff800e`be1d6060 8b 2b f4 34 1a ff 00 3b 0e 01 02 06 ff ff ff ff .+.4...;........
ffff800e`be1d6070 ff ff 00 1f 24 06 04 f2 5d bd a8 98 1a 4e 47 8d ....$...]....NG.
ffff800e`be1d6080 d0 d9 26 72 d1 94 fa 06 01 03 06 ff ff ff ff ff ..&r............
0x09, // bLength
0x02, // bDescriptorType (Configuration)
0xEC, 0x0A, // wTotalLength 2796
0x02, // bNumInterfaces 2
0x01, // bConfigurationValue
0x04, // iConfiguration (String Index)
0xC0, // bmAttributes Self Powered
0x00, // bMaxPower 0mA
ffff800e`be6b5010 09 02 e4 0a 02 01 04 c0 00 09 04 00 00 01 0e 01 ................
ffff800e`be6b5020 00 05 0d 24 01 00 01 71 00 00 6c dc 02 01 01 12 ...$...q..l.....
ffff800e`be6b5030 24 02 01 01 02 00 00 00 00 00 00 00 00 03 0e 1e $...............
ffff800e`be6b5040 00 0b 24 05 02 01 00 40 02 7f 17 00 1f 24 06 03 ..$....@.....$..
ffff800e`be6b5050 41 76 9e a2 04 de e3 47 8b 2b f4 34 1a ff 00 3b Av.....G.+.4...;
ffff800e`be6b5060 0e 01 02 06 ff ff ff ff ff ff 00 1f 24 06 04 f2 ............$...
ffff800e`be6b5070 5d bd a8 98 1a 4e 47 8d d0 d9 26 72 d1 94 fa 06 ]....NG...&r....
ffff800e`be6b5080 01 03 06 ff ff ff ff ff ff 00 09 24 03 07 01 01 ...........$....
0x09, // bLength
0x02, // bDescriptorType (Configuration)
0xE4, 0x0A, // wTotalLength 2788
0x02, // bNumInterfaces 2
0x01, // bConfigurationValue
0x04, // iConfiguration (String Index)
0xC0, // bmAttributes Self Powered
0x00, // bMaxPower 0mA
可以看到,其USB配置描述符的总长度为2796-2788=8 多出来的这8个字节正是配置描述符之后的USB接口关联描述符IAD
08 0b 00 02 0e 03 00 05
所以这里从配置述符来看,其内容一样。可见USBCCGP对于USB复合设备,再对齐进行按USB功能拆分其子设备时,就算其子设备是一个复杂的设备(多接口描述符的设备,如UVC,UAC设备),其也会删除其前面的IAD接口关联描述符。
所以这里又回到了USB接口关联描述符的意义上:
UVC 接口关联描述符IAD https://www.usbzh.com/article/detail-2.html 设备必须使用接口关联描述符来描述需要视频控制接口和一个或多个视频流接口的每个设备功能的视频接口集合。标准的VIC接口关联描述符与接口关联描述符ECN中定义的标准接口关联描述符相同,只是有些字段现在具有专用值。
这里我们做个总结:对于USB硬件设备,如果其只有一个功能设备,可以不要接口关描述符述IAD,就算这是一个需要多接口的复杂设备,这个IAD接口关联描述符不是必须的(可要可不要)。但如果是一个多功能的设备即会有2个或2个以个的逻辑设备,并且这些逻辑设备有需要2个或多个接口描述符来描符一个复杂的设备如UAC,UVC,这个复杂的设备前就必须的IAD接口关联描述符。
所以也可以这样说,接口关联描述符是分隔USB硬件设备功能的分隔线。
另外通过USBTreeViewer这个工具是通过USB端口读取的USB配置描述符,所以这里是带IAD的。