UVC摄像头技术笔记
+ -

UVC扩展单元描述符和设置不当会引起的设备启动失败(code:10)

2022-03-17 484 4

UVC扩展单元用于UVC设备的自定义通讯,通过UVC扩展单元可以实现一些厂商自定义的通讯和设备特性。
在一般的UVC摄像头的描述符布局中,其拓扑结构一般如下:
UVC拓扑结构
可以看到,这上面的拓扑结构中支持2个扩展单元,所以在USB配置描述符视频控制接口中就有两个独立的扩展单元描述符。这两件扩展单元的bSourceID都来自于处理单元,并且各个拓扑结构的bUnitID或bTerminalID不同。

上面的这个图其实是本人现在实现的了,我实现的功能是在系统中虚拟一个USB摄像头,不过由于本人的设置不录出现了问下问题:
虚拟USB摄像头
可以看到,虚拟的HID设备正常,不过摄像头有问题,通过设备管理器可以看到启动失败。
设备管理器可以看到启动失败10
错误号是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必须全是有效的字段,不能有不用但占着坑的字段。这方面,微软的验证好像也挺严格的,不像平常的微软啊。。。。

修正了代码之后,重新编译加载驱动,就正常了。
正常的UVC摄像头

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 扩展单元描述符
扩展单元描述符允许硬件设计者定义任意一组控制接口,使类驱动程序可以在设备与供应商提供的主机软件之间进行通讯控制。扩展单元描述符ID由bUnitID字段中的值唯一标识描述符。同一视频功能内的任何其他单元或终端不得具有相同的功能ID。guidExtensionCode字段包含特定于供应商的代码,该代......
UVC摄像头扩展单元功能的开发步骤是什么?
写在扩展单元的题外话本人在开发支持UVC扩展单元的directShow应用时,必现并不需要注册接口,只需要在其源过滤器参照后续的代码枚举相关的接口如IKsControl,IKsTopologyInfo定位到指定的扩展单元接口后,直接使用其对应的IKsControl::KsProperty即可实现扩展......
UVC 拓扑结构
UVC规范描述了以下类型的标准单元和终端,这些单元和终端被认为足以代表当前和近期可用的大多数视频功能:输入端子(ST)输出端子(OT)选择器单元(SU)处理单元(PU)编码单元(EU)扩展单元(XU)此外,还有一些特殊的终端扩展了基本输入和输出终端的功能。这些特殊终端支持特定于这些终端提供的扩展功能......
UVC 扩展单元控制请求
扩展单元控制请求设置或读取扩展单元内的视频控件.bmRequestTypebRequestwValue(2)wIndexwLengthData00100001SET_CUR选择子扩展单元ID参数长度参数块bmRequestTypebRequestwValue(2)wIndexwLengthData1......
USB的拓扑结构
USB的拓扑结构结可以从三个视图来解释,分别为物理拓扑,逻辑拓扑和软件编程拓扑USB的物理拓扑结构USB的物理拓扑指的是USB总线的实际物理设备连接关系。主机端提供USB根集线器,USB根集线器可外接USB外设,也可的外接USB的集线器HUB,用于拓展USB端点接口,拓展的USB集线器上的端口也可以......
UAC 拓扑结构
UAC规范描述了以下类型的标准单元和终端,这些单元和终端被认为足以代表当前和近期可用的大多数视频功能:输入终端 - Input Terminal (IT)输出终端 - Output Terminal (OT)混音器单元 - Mixer Unit (MU)选择器单元 - Selector Uni......
USB设备与集线器最大可以级联多少层
在USB2.0规范中,定义了USB设备与集线器最大可以级联7层(包括根集线器),即根集线器之设备之间最多有5个继集线器。注意:有一个USB复合(compound)设备,其本身是一个USB集线器并接连1个或多个USB功能设备,这里需要将这个USB集线器算在内。......
V4L2访问摄像头扩展单元命令
我们可以通过IOCTL访问扩展单元,调用方法如下:ioctl(fd, UVCIOC_CTRL_QUERY, struct uvc_xu_control_query *);访问不同的扩展命令只需要修改uvc_xu_control_query 结构体里面内容即可。uvc_xu_control_qu......
用XU打造UVC命令行调试工具
在给客户交付UVC固件之后,有时客户会反馈问题,需要客户查看固件的打印信息或者执行一些命令辅助定位问题。如果有一个工具可以通过USB线连接到设备,直接在电脑上查看打印信息,执行命令就好了。有想法就要行动起来,行动才能解决问题。目前该功能已经实现了,说一下实现的方法吧。上位机OS Windows设......
UVC摄像头扩展单元调试工具-临江仙版
UVC摄像头的开发者为了实现一些私有定制协议的通讯,通常使用UVC自带的扩展单元来实现。通常是自定义一个扩展单元,再定义一些相应的选择子,然后再通过特定类请求实现与固件的通讯。 本站现提供一个Windows环境下,使用DirectShow开发的UVC扩展单元调试工具.UVC摄像头扩展单元工具来自......
UVC PTZ和扩展单元XU的过滤与分发调试笔记
在写这篇文章之前,我得首先感谢微软,感谢你的不严格,让我可以有空子可钻,不至于太过狼狈…记得看过一句话,开局一张图,内容全告编。我多么希望自己在UVC摄像头的调试过程中也可以瞎编乱造,这样不至于身心疲惫。至少保持着愉快的心情,吹吹牛,也是一件很开心的事。今日有一个需求,对UVC摄像头的请求进行......
UVC摄像头驱动装调试总结
前几天发表了一篇文章 UVC PTZ和扩展单元的过滤与分发调试笔记,原文见: http://www.usbzh.com/article/detail-517.html ,本来想着应该没啥问题了,可没想到上周五在实际测试过程中,还是出现了问题:经过长时间的UVC摄像头工作,突然驱动显示了大量数据包错误......
windows上面通过dshow接口访问uvc摄像头扩展单元,只能访问0x01-0x1F命令问题
最近在给客户做一个修改摄像头数据的工具,在通过dshow接口发送扩展命令的时候发现0x01-0x1F命令都可以发送成功,0x20及以上定义的命令都发送失败,并且返回错误码0x80070490。谷歌百度查了很久终于在windows官网文档中找到了答案,原来是USB 视频类驱动程序对UVC扩展单元实现......
UVC规范USB摄像头扩展单元XU的初始化分析
USB摄像头的UVC的扩展单元用于UVC摄像头的自定义功能扩展,支持UVC扩展单元的摄像头在其UVC控制接口中都会有一个扩展单元描述符。该扩展单元描述符的字段描述符了其支持的选择子,GUID,扩展单元等相关信息。我们知道,UVC摄像头在接入PC机后,和其它USB设备一样,第一步是肯定是USB设备信......
USBXU摄像头UVC扩展单元调试工具使用图解
USB中文网技术交流群临江仙大佬推出的USB摄像头UVC扩展单元调试工具,大大提高高了大家进行USB摄像头扩展单元的调试的工作效率,不过对于UVCB扩展单元不太熟悉的同学来说,有时在使用上也有一定的困难。今天本人将做一个详细的介绍它的使用方法。USB摄像头UVC扩展单元调试工具的准备该软件的版权归......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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