UVC扩展单元描述符和设置不当会引起的设备启动失败(code:10)
2022-03-17
555
4
UVC扩展单元用于UVC设备的自定义通讯,通过UVC扩展单元可以实现一些厂商自定义的通讯和设备特性。
在一般的UVC摄像头的描述符布局中,其拓扑结构一般如下:
可以看到,这上面的拓扑结构中支持2个扩展单元,所以在USB配置描述符的视频控制接口中就有两个独立的扩展单元描述符。这两件扩展单元的bSourceID都来自于处理单元,并且各个拓扑结构的bUnitID或bTerminalID不同。
上面的这个图其实是本人现在实现的了,我实现的功能是在系统中虚拟一个USB摄像头,不过由于本人的设置不录出现了问下问题:
可以看到,虚拟的HID设备正常,不过摄像头有问题,通过设备管理器可以看到启动失败。
错误号是10,这是一个典型的设备启动失败。设备启动失败的原因很多,不过大部分是因为设备自身的问题。由于这是本人虚拟的UVC设备,与硬件无关,故是自己配置的问题,经过本人的仔细查看,原来是第二个扩展单元的描述符参数设置错误。
pEUDesc->bLength = 0x1D;
pEUDesc->bDescriptorType = 0x24;
pEUDesc->bDescriptorSubtype = 0x06;
pEUDesc->bUnitID = 0x08;
memcpy(&pEUDesc->guidExtensionCode, &ChenAnUVCGUID, sizeof(GUID));
pEUDesc->bNumControls = 0x03;
pEUDesc->bNrInPins = 0x01;
pEUDesc->baSourceID[0] = 0x04;//process unit
pEUDesc->bControlSize = 0x02; //错误的地方
pEUDesc->bmControls[0] = 0x00;
pEUDesc->bmControls[1] = 0x07;
pEUDesc->bmControls[2] = 0x00;
pEUDesc->bmControls[3] = 0x00;
pEUDesc->iExtension = 0;
可以看到,由于本人将bControlSize设置为2,导致设备启动失败,实际上这里应该为4,因为我对扩展单元的选择子掩码实际是上4个字节。
如本人的扩展单元描述符实际定义如下:
// Extension Unit Descriptor
typedef struct _USB_EU_DESCRIPTOR
{
UINT8 bLength;
UINT8 bDescriptorType;
UINT8 bDescriptorSubtype;
UINT8 bUnitID;
GUID guidExtensionCode;
UINT8 bNumControls;
UINT8 bNrInPins;
UINT8 baSourceID[1];
UINT8 bControlSize;
UINT8 bmControls[4];
UINT8 iExtension;
} USB_EU_DESCRIPTOR;
所以说这个扩展单元的大小bLength必须全是有效的字段,不能有不用但占着坑的字段。这方面,微软的验证好像也挺严格的,不像平常的微软啊。。。。
修正了代码之后,重新编译加载驱动,就正常了。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936