LINUX&UVC扩展单元描述符
2024-03-19
110
0
UVC扩展单元用于实现用户自定义的控制请求。使用UVC控制请求可以实现厂商自定义的一些相机控制请求或者其它功能。比如我就见过有用扩展单元实现相机固件的升级功能。
UVC扩展单元描述符需要关注的是GUID和bmControls位掩码。从规范上来讲,扩展单元的bmControls数组理论可以无限大,但一些操作系统对此有一此限制,比如Windows最多支持31个。其值为0x01~0x1f,选择子默认从1开始,而不是0。
case UVC_VC_EXTENSION_UNIT:
p = buflen >= 22 ? buffer[21] : 0;
n = buflen >= 24 + p ? buffer[22+p] : 0;
if (buflen < 24 + p + n) {
uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
"interface %d EXTENSION_UNIT error\n",
udev->devnum, alts->desc.bInterfaceNumber);
return -EINVAL;
}
unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n);
if (unit == NULL)
return -ENOMEM;
memcpy(unit->extension.guidExtensionCode, &buffer[4], 16);
unit->extension.bNumControls = buffer[20];
memcpy(unit->baSourceID, &buffer[22], p);
unit->extension.bControlSize = buffer[22+p];
unit->extension.bmControls = (u8 *)unit + sizeof(*unit);
memcpy(unit->extension.bmControls, &buffer[23+p], n);
if (buffer[23+p+n] != 0)
usb_string(udev, buffer[23+p+n], unit->name,sizeof(unit->name));
else
sprintf(unit->name, "Extension %u", buffer[3]);
list_add_tail(&unit->list, &dev->entities);
break;