LINUX&UVC驱动uvc_parse_control之Logitech自定义扩展单元
2024-03-18
110
0
LINUX系统中,UVC新设备的初始化使用uvc_probe函数初始化。uvc_probe调用uvc_parse_control函数用于解析UVC设备的配描述符中的UVC控制接口描述符集。这些UVC控制描述符实现了UVC的基本配置信息和UVC设备的拓扑结构。
- uvc_probe
- uvc_parse_control
uvc_parse_vendor_control
在uvc_parse_control中使用uvc_parse_vendor_control处理UVC设备厂商自己定义的一些描述符,LINUX&UVC驱动这里只是处理了Logitech在UVC标准的扩展单元的基础上二次扩展的“扩展单元”。
这里在处理上当作UVC标准的扩展单元来处理。通过分析代码来看,如果有,该找述符紧跟接口描述符。其大概内存布局如下:
- 接口描述述符
- Logitech自定义扩展单元描述符(可选)
- Video Control Interface Header Descriptor
- …
通过对其数据结构分析如下:
[0]uint8 bLength;//描述符的总长度,不定长。公式为: 24+p+n*2+1
[1]uint8 flag1;//Logitech标识为0x41
[2]uint8 flag2;//Logitech标识为0x01
[3]uint8 UnitId;
[4~19]uint8 guid[16];
[20]uint16 bNumControls;
[21]uint8 p;
[22]uint8 baSourceIDs[p];
[22+p] uint8 bControlSize;
[23+p] uint8 bmControls[n];
[23+p+n] uint8 bmControlsType[n];
[23+p+n*2] uint8 bReserved;
[24+p+n*2] uint8 iExtension;//字符串描述符索引,为0表示没有
关于上面字段的注释,可以参见:
* ----------------------------------------------------------
* 0 bLength 1 Number
* Size of this descriptor, in bytes: 24+p+n*2
* ----------------------------------------------------------
* 23+p+n bmControlsType N Bitmap
* Individual bits in the set are defined:
* 0: Absolute
* 1: Relative
*
* This bitset is mapped exactly the same as bmControls.
* ----------------------------------------------------------
* 23+p+n*2 bReserved 1 Boolean
* ----------------------------------------------------------
* 24+p+n*2 iExtension 1 Index
* Index of a string descriptor that describes this
* extension unit.
* ----------------------------------------------------------
*/
当然,由于这个自定义的被当作扩展单元处理了,故也会加入单元链表。
unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3]/*UnitId*/,p + 1, 2*n);
...
list_add_tail(&unit->list, &dev->entities);