UVC设备生产厂家为留出设备的调试接口,或扩展一些UVC以外的特殊功能,会在其USB固件中添加一些私有命令,比如我
要点亮一个led,如何利用UVC控制接口完成命令传输?UVC设备固件如何解析这是一条点亮led的命令?
在回答上述两个问题之前,我要先介绍下UVC扩展单元(Extension Unit),UVC扩展单元是专门为了给设备厂家提供私有命
令的Unit,若想添加点亮led命令,就必须要通过此单元来配置。
在上一篇学习笔记中,我们将UVC枚举分为了两个阶段,其中“第二阶段”是否发起由UVC设备的Process Unit描述符决定,如
果在Process Unit描述符中将可见光属性全部关闭,则PC不会发起“第二阶段”枚举。
扩展单元也是一样,如果我们在Extension Unit描述符中打开私有命令属性,则在UVC设备枚举过程中,PC也会发起对
Extension Unit的询问。
还是以手中的UVC摄像头为例, UVC摄像头扩展单元bNumControls值为0X18,bmControls值为0x9F 0x00 0x07,可以分析
出该摄像头厂家留了24条私有命令通道,其中只用到了9条,bit置1的位即为打开的私有命令通道号。
还是要结合抓包数据分析才比较具体,可以看到PC枚举UVC“第一阶段”完成以后,紧接着开始获取Extension Unit私有命令通
道的属性信息,在获取完成后,继续获取Process Unit属性,然后完成枚举。
a1 85 00 01 00 03 02 00,GET_LEN命令,第六字节“03”,是因为Extension Unit Id为03,第四字节为“01”,表示这是第一
通道,PC分别枚举了通道序号“1-5”、7等等九个通道,这就和bmControls值Bit位对应起来了,可以发现bit0对应的私有通道序号
为1,即私有通道号是从1开始计数的。
可以看出PC分别按GET_LEN、GET_INFO、GET_MIN、GET_MAX、GET_RES、GET_DEF的顺序获取通道属性。
以通道1为例,GET_LEN获得的反馈为0004,则PC像该通道一次只能写入4Byte数据。