UVC调试笔记
+ -

UVC的版本区别之处理单元描述符

2021-06-10 162 8
欢迎加入官方QQ群:952873936或联系站长进行技术交流。

UVC规范自发布到现在,已经有UVC1.0,UVC1.1和UVC1.5三个版本了。
在Windows环境下,支持的最广泛的是UVC1.0,从Win7开始支持UVC1.1,从Win8开始支持UVC1.5.
我们常用的UVC摄像头一般为了支持更加广泛的操作系统,一般情况下UVC的固件是UVC1.0,但随着固件的升级,不过避免的需要使用UVC1.1规范,甚至最新的UVC1.5规范版本。

关于UVC的版本区别,一般最典型的是从视频流接口特定类请求的长度来判断。当特定类的请求长度为26字节时,是UVC1.0版本;当特定类请求的长度是34字节进,是UVC1.1版本;当特定类请求的长度是48字节时,是UVC1.5版本。

当然在UVC的类特定视频控制接口头描述符的bcdUVC字段以BCD的形式标识了当前UVC的版本,如UVC1.0是0x100,UVC1.1是0x11,UVC1.5是0x150。

前面说了UVC的版本区别,其实不光反映在我们耳熟能详的一些细节,对于一些常用的描述符也是有很细微的差别的。这里的处理单元描述符就是其中之一。

本人在Windows驱动中虚拟UVC摄像头时,就因处理单元的描述符的版本设置不正确,导致UVC摄像头枚举失败。
显示的错误如下图所示:
UVC摄像头设备管理器感叹号

UVC摄像头错误

在Windows设备管理器中的设备状态上可以看到,设备启动失败。错误信息是:

Thsi device cannot start。(Code 10)
{Operation Failed}
The requested operation was unsuccessful.

本人测试的机器为英文操作系统,版本是win10 x64 10.0.17763.1879

由于我是将UVC从1.0改为UVC1.1,而且是只改了特定类请求和处理单元,所以我是知道是由于处理单元描述符引起的错误。

下面我将UVC各版本的处理单元描述符分类显示:

UVC1.0的处理单元描述符

typedef struct _USB_PU_DESCRIPTOR
{
    UINT8  bLength;
    UINT8  bDescriptorType;
    UINT8  bDescriptorSubtype;
    UINT8  bUnitID;
    UINT8  bSourceID;
    UINT16 wMaxMultiplier;
    UINT8  bControlSize;
    UINT8  bmControls[n];
    UINT8  iProcessing;
} USB_PU_DESCRIPTOR;
`

UVC1.1的处理单元描述符

typedef struct _USB_PU_DESCRIPTOR
{
    UINT8  bLength;
    UINT8  bDescriptorType;
    UINT8  bDescriptorSubtype;
    UINT8  bUnitID;
    UINT8  bSourceID;
    UINT16 wMaxMultiplier;
    UINT8  bControlSize;
    UINT8  bmControls[n];
    UINT8  iProcessing;
    UINT8 bmVideoStandards;
} USB_PU_DESCRIPTOR;

UVC1.1相比较于UVC1.0,其总长度多了一个字节长度,这是因为多了一个bmVideoStandards字段。
而到UVC1.5中,处理单元描述符从一个可变的长度变成了固定长度的描述符,这是因为bmControls的个数变成了固定为3个。

参考文章:
UVC1.5 处理单元描述符 http://www.usbzh.com/article/detail-84.html
UVC1.0和UVC 1.1有什么区别 http://www.usbzh.com/article/detail-241.html

0 篇笔记 写笔记

UVC的版本区别之处理单元描述符
UVC规范自发布到现在,已经有UVC1.0,UVC1.1和UVC1.5三个版本了。在Windows环境下,支持的最广泛的是UVC1.0,从Win7开始支持UVC1.1,从Win8开始支持UVC1.5.我们常用的UVC摄像头一般为了支持更加广泛的操作系统,一般情况下UVC的固件是UVC1.0,但随着固......
UVC 处理单元描述符
处理单元描述符的ID使用bUnitID字段标识。同一视频功能内的任何其他单元或终端不得具有相同的功能ID。bSourceID字段用于描述此处理单元的连接。它包含此处理单元通过其输入引脚连接到的设备或终端的ID。bSourceID必须引用同一视频功能中的单元或终端。bmControls字段是一个位图,......
UVC 处理单元控制请求
处理单元控制请求用于设置或读取视频函数的处理单元内的视频控件的属性。Control SelectorValuePU_CONTROL_UNDEFINED0x00PU_BACKLIGHT_COMPENSATION_CONTROL0x01PU_BRIGHTNESS_CONTROL0x02PU_CONTRA......
UAC 拓扑结构
UAC规范描述了以下类型的标准单元和终端,这些单元和终端被认为足以代表当前和近期可用的大多数视频功能:输入终端 - Input Terminal (IT)输出终端 - Output Terminal (OT)混音器单元 - Mixer Unit (MU)选择器单元 - Selector Uni......
UVC 处理单元特定类请求示例
笔者手中有一UVC摄像头,其处理单元描述符bUnitID为2,其处理单元描述符内容如下: -------- Video Control Processing Unit Descriptor -----------------------bLength ......
UAC 处理单元描述符
UAC处理单元描述符全称Processing Unit Descriptor,缩写这PUD.处理单元描述符和其它音频控制的单元/终端描述一样,也具有一个惟一的ID标识字段UnitID。UAC处理单元的功能处理单元(PU)表示音频功能内部的一个功能块,它将逻辑输入通道,分为一个或多个群集,并分成若干......
UAC 上下混音处理单元描述符
上下混合处理单元是UAC处理单元描述的一类,使用上下混合处理单元描述符来描述。UAC1.0上下混音处理单元描述符定义字段偏移字段字段长度值类型说明0bLength1数字该描述符的总长度:15+n+2*m1bDescriptorType1常量描述符类型......
UAC 杜比定向逻辑处理单元描术符
杜比定向逻辑处理单元描术符全乐Dolby Prologic Processing Unit DescriptorUAC1.0杜比定向逻辑处理单元描术符定义字段偏移字段字段长度值类型说明0bLength1数字该描述符的总长度:15+n+2*m1bDescrip......
UAC 立体扩展处理单元描述符
UAC1.0 立体扩展处理单元描述符定义字段偏移字段字段长度值类型说明0bLength1数字该描述符的总长度:15+n+2*m1bDescriptorType1常量描述符类型,CS_INTERFACE2bDescriptorSubtype1常......
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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