Linux&UVC驱动
+ -

uvc_parse_control解析拓扑结构uvc_parse_standard_control

2024-03-18 15 0

对于大部分的UVC设备,都不会存在厂家自定义的所谓“自定义扩展单元”,都是很规矩的使用UVC标准的扩展单元。当然扩展单元在UVC的控制接口描述符中混着,所以LINUX&UVC驱动就使用uvc_parse_standard_control函数解析这些标准的UVC描述符。

在分析代码之前,先回顾一下UVC标准结构体的通用结构。
通过UVC规范可知,在其UVC控制接口描述符中,可能会存以下描述符,分别为:

  • 输入端子(ST)
  • 输出端子(OT)
  • 选择器单元(SU)
  • 处理单元(PU)
  • 编码单元(EU)
  • 扩展单元(XU)
    这些描述符的通用结构体如下:
      BYTE bLength;         
      BYTE bDescriptorType;  
      BYTE bDescriptorSubType;
    
    其中bDescriptorType固件定为0x24,而bDescriptorSubType为以下值时,其内容分别如下:
bDescriptorSubType
VC_HEADER 0x01
VC_INPUT_TERMINAL 0x02
VC_OUTPUT_TERMINAL 0x03
VC_SELECTOR_UNIT 0x04
VC_PROCESSING_UNIT 0x05
VC_EXTENSION_UNIT 0x06
VC_ENCODING_UNIT 0x07

这时,再回头来分析uvc_parse_standard_control源代码,其可见:

static int uvc_parse_standard_control(struct uvc_device *dev,
    const unsigned char *buffer, int buflen)
    {
        /*
    0=bLength
    1= bDescriptorType
    2= bDescriptorSubType
    */
    switch (buffer[2]) {
        case UVC_VC_HEADER:break; //UVC控制接口头描述符
        case UVC_VC_INPUT_TERMINAL:break;//输入终端
        case UVC_VC_OUTPUT_TERMINAL:break;//输出终端
        case UVC_VC_SELECTOR_UNIT:break;//选择选择器单元
        case UVC_VC_PROCESSING_UNIT:break;//处理单元
        case UVC_VC_EXTENSION_UNIT:break;//扩展单元
        default://其它
    }
    }

对于UVC_VC_INPUT_TERMINAL至UVC_VC_EXTENSION_UNIT,都会执行

list_add_tail(&term->list, &dev->entities);

而对于UVC_VC_HEADER,会执行解析UVC视频流接口描述符

        /* Parse all USB Video Streaming interfaces. */
        for (i = 0; i < n; ++i) {
            intf = usb_ifnum_to_if(udev, buffer[12+i]);
            if (intf == NULL) {
                uvc_trace(UVC_TRACE_DESCR, "device %d "
                    "interface %d doesn't exists\n",
                    udev->devnum, i);
                continue;
            }

            uvc_parse_streaming(dev, intf);
        }

另外,对于输入终端,其它4个字节wTerminalType指定了具体的类型:


        -------- Video Control Input Terminal Descriptor ------
bLength                  : 0x12 (18 bytes)
bDescriptorType          : 0x24 (Video Control Interface)
bDescriptorSubtype       : 0x02 (Input Terminal)
bTerminalID              : 0x01 (1)
wTerminalType            : 0x0201 (ITT_CAMERA)

wTerminalType可选的值有:

wTerminalType 描述
ITT_VENDOR_SPECIFIC 0x200 厂商用自定义
ITT_CAMERA 0x201 相机
ITT_MEDIA_TRANSPORT_INPUT 0x202 序列媒介

0 篇笔记 写笔记

UVC 相机终端描述符
相机端点描述符使用bTerminalID来标识其惟一的ID,所有的请求必须使用此ID。wTerminalType用来描述相关的物理实体的信息。typedef struct _CAMERA_TERMINAL_DESCRIPTOR UINT8 bLength; UINT8 bDescr......
UVC 拓扑结构
UVC规范描述了以下类型的标准单元和终端,这些单元和终端被认为足以代表当前和近期可用的大多数视频功能:输入端子(ST)输出端子(OT)选择器单元(SU)处理单元(PU)编码单元(EU)扩展单元(XU)此外,还有一些特殊的终端扩展了基本输入和输出终端的功能。这些特殊终端支持特定于这些终端提供的扩展功能......
USB的拓扑结构
USB的拓扑结构结可以从三个视图来解释,分别为物理拓扑,逻辑拓扑和软件编程拓扑USB的物理拓扑结构USB的物理拓扑指的是USB总线的实际物理设备连接关系。主机端提供USB根集线器,USB根集线器可外接USB外设,也可的外接USB的集线器HUB,用于拓展USB端点接口,拓展的USB集线器上的端口也可以......
UAC 拓扑结构
UAC规范描述了以下类型的标准单元和终端,这些单元和终端被认为足以代表当前和近期可用的大多数视频功能:输入终端 - Input Terminal (IT)输出终端 - Output Terminal (OT)混音器单元 - Mixer Unit (MU)选择器单元 - Selector Uni......
UAC 标准音频控制接口描述符
音频控制接口描述符以下的描述符信息包含了音频控制的功能特征信息,音频的各控制功能均是通过音频控制接口描述符之下的各实例,终端进行控制的。音频控制接口描述符:Standard AC Interface Descriptor。音频控制接口描述符的定义如下:typedef struct _USB_INTE......
UVC 标准视频控制接口描述符
视频控制接口描述符由标准视频控制接口描述符以及各控制相关描述符组成。标准视频控制接口描述符使用通用USB设备接口描述符数据结构。struct _INTERFACE_DESCRIPTOR_STRUCT; { BYTE bLength; //设备描述符的字节数大小,为0x09......
USB设备与集线器最大可以级联多少层
在USB2.0规范中,定义了USB设备与集线器最大可以级联7层(包括根集线器),即根集线器之设备之间最多有5个继集线器。注意:有一个USB复合(compound)设备,其本身是一个USB集线器并接连1个或多个USB功能设备,这里需要将这个USB集线器算在内。......
UAC麦克风类特定音频控制接口描述符
UAC的类特定音频控制接口描述符又叫类特定音频控制接口头描述符,包含了UAC音频控制各终端,单元的描述符信息。在UAC规范中,其包含的描述符有:关于类特定音频控制接口描述符可详见本站:http://www.usbzh.com/article/detail-222.html由于该UAC麦克风是基于......
UVC摄像头实现的拓扑结构
UVC视备内部表示为多个可寻址实体或终端的互连。每个实体/终端代表一种功能,并具有由USB主机控制的属性。这些UVC设备内部互联的结构叫做UVC设备的内部拓扑结构。一个最简单的UVC拓扑结构如下图所示:数据由CAMERA Sensor采集,首先通过输入终端,再通过输出终端,最后通过USB的视频流端点......
UVC扩展单元描述符和设置不当会引起的设备启动失败(code:10)
UVC扩展单元用于UVC设备的自定义通讯,通过UVC扩展单元可以实现一些厂商自定义的通讯和设备特性。在一般的UVC摄像头的描述符布局中,其拓扑结构一般如下:可以看到,这上面的拓扑结构中支持2个扩展单元,所以在USB配置描述符的视频控制接口中就有两个独立的扩展单元描述符。这两件扩展单元的bSource......
UVC相机拓扑结构配置要点总结
做UVC相机开发的人经常是需要编写UVC相机配置描述符的,这个USB配置描述符包括两部分的内容,分别为视频控制接口部分和视频流接口部分。视频控制部分包括的内容主要描述了UVC相机的拓扑结构。一般情况下的相机拓扑结构是这样子的:不过有的时候,我们也需要扩展单元,所以加上扩展单元描述符就如下:这里......
LINUX&UVC驱动视频流接口描述符与视频控制接口描述符的解析关系
UVC控制接口描述符包其下的子各类描述符代表着UVC设备的拓扑结构,关于UVC设备的控制一般都是通过UVC控制接口描述符各个终端,实例的特定类请求来实现的,其中也包括用于用户自定义通讯的扩展单元描述符。与UVC控制接口描述符相对的是UVC视频流接口描述符,UVC规范可以有0个或者多个。至于有多少个,......
USB设备总线拓扑结构生成原理及方法
在Windows系统的内核中,USB堆栈提供了一系列的API接口。内核或者应用程序可以使用这些API接口来确定USB总线的拓扑结构和相关的USB设备信息。我们常用的USBTreeViewe是基于微软开源usbview二次开发的,而usbview就是使用这些API接口来实现USB总线拓扑结构和US......
uvc_parse_control解析拓扑结构uvc_parse_standard_control
对于大部分的UVC设备,都不会存在厂家自定义的所谓“自定义扩展单元”,都是很规矩的使用UVC标准的扩展单元。当然扩展单元在UVC的控制接口描述符中混着,所以LINUX&UVC驱动就使用uvc_parse_standard_control函数解析这些标准的UVC描述符。在分析代码之前,先回顾......
LINUX&UVC视频控制描述符拓扑结构类型映射
LINUX&UVC驱动在解析UVC设备配置描述符中的UVC控制接口描述符中的各个拓扑结构时,对找到的每一种拓扑结构,都会使用uvc_alloc_entity函数申请一个对象,然后使用函数list_add_tail挂入链表中。 list_add_tail(&term->l......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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