Linux&UVC驱动
+ -

LINUX&UVC扩展单元描述符

2024-03-19 16 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;

0 篇笔记 写笔记

UVC 扩展单元描述符
扩展单元描述符允许硬件设计者定义任意一组控制接口,使类驱动程序可以在设备与供应商提供的主机软件之间进行通讯控制。扩展单元描述符ID由bUnitID字段中的值唯一标识描述符。同一视频功能内的任何其他单元或终端不得具有相同的功能ID。guidExtensionCode字段包含特定于供应商的代码,该代......
UVC扩展单元描述符和设置不当会引起的设备启动失败(code:10)
UVC扩展单元用于UVC设备的自定义通讯,通过UVC扩展单元可以实现一些厂商自定义的通讯和设备特性。在一般的UVC摄像头的描述符布局中,其拓扑结构一般如下:可以看到,这上面的拓扑结构中支持2个扩展单元,所以在USB配置描述符的视频控制接口中就有两个独立的扩展单元描述符。这两件扩展单元的bSource......
LINUX&UVC扩展单元描述符
UVC扩展单元用于实现用户自定义的控制请求。使用UVC控制请求可以实现厂商自定义的一些相机控制请求或者其它功能。比如我就见过有用扩展单元实现相机固件的升级功能。UVC扩展单元描述符需要关注的是GUID和bmControls位掩码。从规范上来讲,扩展单元的bmControls数组理论可以无限大,但一......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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