UVC摄像头技术笔记
+ -

USB复合设备-UVC摄像头HID设备共存的设计实现

2021-07-12 1696 0

通常做USB设备的开发,我们做的都是单一的功能设备。这种单一的功能设备只实现某种特定的功能,如只实现一个HID鼠标或键盘,只实现一个USB存储功能,或再复杂一点只实现一个UVC音频麦克风和扬声器功能或一个UVC摄像头功能。

但我们在一般的市场上看到的设备通常不只实现一种功能,如UVC摄像头功能还提供一个自定义的HID,用于对此摄像头的功能扩展,或者更有甚至用于该摄像头的固件升级。

对于这种复杂的混合设备,在与我们的PC机连接后,Windows通常使用一个叫做USB通用驱动(usbccgp.sys)来进行驱动,设备的名称叫做“USB Composite Device”,这个驱动下再使用某种规则枚举出我们的功能设备如摄像头、HID设备。
如这里本人手中的一个UVC摄像头,其在Windows下的设备树管理器中的结构如下:

USB通用驱动

可以看到,这个设备下有两个设备,一个为UVC摄像头,另一个自定义HID设备。

那么这种复合设备是怎么实现的呢?
答案是多功能接口的实现。我们知道,USB设备的功能功分是由接口描述符来界定的,对于大部分简单的USB设备,只要出现一个接口描述符,其就代表一个USB设备功能。

如我们可以使用两个接口分别实现键盘、鼠标,这们当这种设备接入PC机后,系统会对这个USB硬件加载USB通用驱动,然后再由USB通用驱动分别枚举出USB键盘和USB鼠标功能。当然以上这种情况只适用于一般的简单设备,对于复杂混合设备就有一点不同了。

如对于UVC摄像头和UAC音频设备,这种设备的功能实现是需要多接口联合才能实现其需要的功能,如对于UVC设备其包括视频控制接口VC和视频流接口VS,对于UAC音频也有其对应的音频流控制AC和音频流接口AS.而这种复合设备功能的组织就是使用一个叫做接口关联描述符来实现的。

如对于以上设备,其各子设备的硬件ID如下:

  • USB\VID_1234&PID_0100&REV_0409 //USB Composite Device
    • USB\VID_1234&PID_0100&REV_0409&MI_01 //CAMERA
    • USB\VID_1234&PID_0100&REV_0409&MI_00 //HID
      • HID\VID_1234&PID_0100&REV_0409&MI_00 //HID

这里硬件ID后的MI_xx其就代表的是其功能接口的ID,对应于配置描述符中的接口描述符ID.
这的的配置描述符结构建组织如下:

关于其它信息如端点描述符这里省略掉。

我们再通过usbtreeview工具打开设备,查看其配置描述符:
这里只选报配置描述符的部分内容:


        ---------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x00
bAlternateSetting        : 0x00
bNumEndpoints            : 0x02 (2 Endpoints)
bInterfaceClass          : 0x03 (HID - Human Interface Device)
bInterfaceSubClass       : 0x00 (None)
bInterfaceProtocol       : 0xFF (reserved)
iInterface               : 0x08 (String Descriptor 8)
Data (HexDump)           : 09 04 00 00 02 03 00 FF 08                        .........

        ------------------- HID Descriptor --------------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x21 (HID Descriptor)
bcdHID                   : 0x0101 (HID Version 1.01)
bCountryCode             : 0x00 (00 = not localized)
bNumDescriptors          : 0x01
Data (HexDump)           : 09 21 01 01 00 01 22 28 00                        .!...."(.
Descriptor 1:
bDescriptorType          : 0x22 (Class=Report)
wDescriptorLength        : 0x0028 (40 bytes)
Error reading descriptor : ERROR_GEN_FAILURE

        ----------------- Endpoint Descriptor -----------------
bLength                  : 0x07 (7 bytes)
bDescriptorType          : 0x05 (Endpoint Descriptor)
bEndpointAddress         : 0x81 (Direction=IN EndpointID=1)
bmAttributes             : 0x03 (TransferType=Interrupt)
wMaxPacketSize           : 0x01F3
 Bits 15..13             : 0x00 (reserved, must be zero)
 Bits 12..11             : 0x00 (0 additional transactions per microframe -> allows 1..1024 bytes per packet)
 Bits 10..0              : 0x1F3 (499 bytes per packet)
bInterval                : 0x01 (1 ms)
Data (HexDump)           : 07 05 81 03 F3 01 01                              .......

        ----------------- Endpoint Descriptor -----------------
bLength                  : 0x07 (7 bytes)
bDescriptorType          : 0x05 (Endpoint Descriptor)
bEndpointAddress         : 0x01 (Direction=OUT EndpointID=1)
bmAttributes             : 0x03 (TransferType=Interrupt)
wMaxPacketSize           : 0x01F3
 Bits 15..13             : 0x00 (reserved, must be zero)
 Bits 12..11             : 0x00 (0 additional transactions per microframe -> allows 1..1024 bytes per packet)
 Bits 10..0              : 0x1F3 (499 bytes per packet)
bInterval                : 0x01 (1 ms)
Data (HexDump)           : 07 05 01 03 F3 01 01                              .......

        ------------------- IAD Descriptor --------------------
bLength                  : 0x08 (8 bytes)
bDescriptorType          : 0x0B
bFirstInterface          : 0x01
bInterfaceCount          : 0x02
bFunctionClass           : 0x0E (Video)
bFunctionSubClass        : 0x03 (Video Interface Collection)
bFunctionProtocol        : 0x00 (PC_PROTOCOL_UNDEFINED protocol)
iFunction                : 0x0A (String Descriptor 10)
Data (HexDump)           : 08 0B 01 02 0E 03 00 0A                           ........

        ---------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x01
bAlternateSetting        : 0x00
bNumEndpoints            : 0x01 (1 Endpoint)
bInterfaceClass          : 0x0E (Video)
bInterfaceSubClass       : 0x01 (Video Control)
bInterfaceProtocol       : 0x00
iInterface               : 0x0A (String Descriptor 10)
Data (HexDump)           : 09 04 01 00 01 0E 01 00 0A                        .........
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

UVC 接口关联描述符IAD
设备必须使用接口关联描述符来描述需要视频控制接口和一个或多个视频流接口的每个设备功能的视频接口集合。标准的VIC接口关联描述符与接口关联描述符ECN中定义的标准接口关联描述符相同,只是有些字段现在具有专用值。说明:如果视频控制接口是视频接口集合的一部分,则接口关联描述符IAD中的iFuncti......
UVC UVC驱动接口关联描述符IAD失踪之迷
先说一下,本人所使用的操作系统是WIN10 x64操作系统Microsoft Windows [版本 10.0.14393](c) 2016 Microsoft Corporation。保留所有权利。这是win10一个相对比较老的版本。新旧的混淆在微软件主的官方文档 USB Interfac......
UAC 接口关联描述
和UVC设备的接口关联描述符的功能一样,UAC的接口关联描述也用于组织UAC的音频控制接接口和UAC的音频流接口描述符及其子描述符。接口关联描述符的结构定义typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR { UCHAR bLengt......
USB复合设备-UVC摄像头HID设备共存的设计实现
通常做USB设备的开发,我们做的都是单一的功能设备。这种单一的功能设备只实现某种特定的功能,如只实现一个HID鼠标或键盘,只实现一个USB存储功能,或再复杂一点只实现一个UVC音频麦克风和扬声器功能或一个UVC摄像头功能。但我们在一般的市场上看到的设备通常不只实现一种功能,如UVC摄像头功能还提供......
USB 接口关联描述
对于复合USB设备的接口描述符,可以在每个类(Class)要合并的接口描述符之前加一个接口关联描述符(Interface Association Descriptor,IAD),其作用就是把多个接口定义成一个类设备,即多个接口作用于一个设备。接口关联描述符的定义如下:typedef struct......
从UVC摄像头配置描述符的长度区别来理解USB接口关联描述符IAD
对于如下的UVC摄像头,其在设备管理器中如下图所示:其硬件ID分别为:USBVID_33F1&PID_1035&REV_0409USBVID_33F1&PID_1035&REV_0409&MI_00可以看到,其根设备是使用的USBCCGP.sy......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!