UVC摄像头设备实现
+ -

UVC摄像头USB配置描述符实现

2022-03-09 1044 3

USB配置描述符用于根据设备类和端点设置配置设备。配置下描述符的层次结构包括接口关联描述符接口描述符、类特定描述符和端点描述符

UVC摄像头USB配置描述符

当主机请求配置描述符时,将返回整个主机层次结构时相关描述符。

/* USB Configuration Descriptor */
static unsigned char cfgDesc[] = {
    0x09, /* 0 bLength */
    USB_DESCTYPE_CONFIGURATION, /* 1 bDescriptorType - Configuration*/
    0xAE,00, /* 2 wTotalLength */
    0x02, /* 4 bNumInterfaces */
    0x01, /* 5 bConfigurationValue */
    0x03, /* 6 iConfiguration - index of string */
    0x80, /* 7 bmAttributes - Bus powered */
    0xFA, /* 8 bMaxPower (in 2mA units) - 500mA */

    /* Interface Association Descriptor */
    0x08, /* 0 bLength */
    USB_DESCTYPE_INTERFACE_ASSOCIATION, /* 1 bDescriptorType - Interface Association */
    0x00, /* 2 bFirstInterface - VideoControl i/f */
    0x02, /* 3 bInterfaceCount - 2 Interfaces */
    USB_CLASS_VIDEO, /* 4 bFunctionClass - Video Class */
    USB_VIDEO_INTERFACE_COLLECTION, /* 5 bFunctionSubClass - Video Interface Collection */
    0x00, /* 6 bFunctionProtocol - No protocol */
    0x02, /* 7 iFunction - index of string */

    /* Video Control (VC) Interface Descriptor */
    0x09, /* 0 bLength */
    USB_DESCTYPE_INTERFACE, /* 1 bDescriptorType - Interface */
    0x00, /* 2 bInterfaceNumber - Interface 0 */
    0x00, /* 3 bAlternateSetting */
    0x01, /* 4 bNumEndpoints */
    USB_CLASS_VIDEO, /* 5 bInterfaceClass - Video Class */
    USB_VIDEO_CONTROL, /* 6 bInterfaceSubClass - VideoControl Interface */
    0x00, /* 7 bInterfaceProtocol - No protocol */
    0x02, /* 8 iInterface - Index of string (same as iFunction of IAD) */

    /* Class-specific VC Interface Header Descriptor */
    0x0D, /* 0 bLength */
    USB_DESCTYPE_CS_INTERFACE, /* 1 bDescriptorType - Class-specific Interface */
    USB_VC_HEADER, /* 2 bDescriptorSubType - HEADER */
    0x10, 0x01, /* 3 bcdUVC - Video class revision 1.1 */
    0x28, 0x00, /* 5 wTotalLength - till output terminal */
    WORD_CHARS(100000000), /* 7 dwClockFrequency - 100MHz (Deprecated) */
    0x01, /* 11 bInCollection - One Streaming Interface */
    0x01, /* 12 baInterfaceNr - Number of the Streaming interface */

    /* Input Terminal (Camera) Descriptor - Represents the CCD sensor (Simulated here in this demo) */
    0x12, /* 0 bLength */
    USB_DESCTYPE_CS_INTERFACE, /* 1 bDescriptorType - Class-specific Interface */
    USB_VC_INPUT_TERMINAL, /* 2 bDescriptorSubType - INPUT TERMINAL */
    0x01, /* 3 bTerminalID */
    0x01, 0x02, /* 4 wTerminalType - ITT_CAMERA type (CCD Sensor) */
    0x00, /* 6 bAssocTerminal - No association */
    0x00, /* 7 iTerminal - Unused */
    0x00, 0x00, /* 8 wObjectiveFocalLengthMin - No optical zoom supported */
    0x00, 0x00, /* 10 wObjectiveFocalLengthMax - No optical zoom supported*/
    0x00, 0x00, /* 12 wOcularFocalLength - No optical zoom supported */
    0x03, /* 14 bControlSize - 3 bytes */
    0x00, 0x00, 0x00, /* 15 bmControls - No controls are supported */

    /* Output Terminal Descriptor */
    0x09, /* 0 bLength */
    USB_DESCTYPE_CS_INTERFACE, /* 1 bDescriptorType - Class-specific Interface */
    USB_VC_OUPUT_TERMINAL, /* 2 bDescriptorSubType - OUTPUT TERMINAL */
    0x02, /* 3 bTerminalID */
    0x01, 0x01, /* 4 wTerminalType - TT_STREAMING type */
    0x00, /* 6 bAssocTerminal - No association */
    0x01, /* 7 bSourceID - Source is Input terminal 1 */
    0x00, /* 8 iTerminal - Unused */

    /* Standard Interrupt Endpoint Descriptor */
    0x07, /* 0 bLength */
    USB_DESCTYPE_ENDPOINT, /* 1 bDescriptorType */
    (VIDEO_STATUS_EP_NUM | 0x80), /* 2 bEndpointAddress - IN endpoint*/
    0x03, /* 3 bmAttributes - Interrupt transfer */
    0x40, 0x00, /* 4 wMaxPacketSize - 64 bytes */
    0x09, /* 6 bInterval - 2^(9-1) microframes = 32ms */

    /* Class-specific Interrupt Endpoint Descriptor */
    0x05, /* 0 bLength */
    USB_DESCTYPE_CS_ENDPOINT, /* 1 bDescriptorType - Class-specific Endpoint */
    0x03, /* 2 bDescriptorSubType - Interrupt Endpoint */
    0x40, 0x00, /* 3 wMaxTransferSize - 64 bytes */

    /* Video Streaming Interface Descriptor */
    /* Zero-bandwidth Alternate Setting 0 */
    0x09, /* 0 bLength */
    USB_DESCTYPE_INTERFACE, /* 1 bDescriptorType - Interface */
    0x01, /* 2 bInterfaceNumber - Interface 1 */
    0x00, /* 3 bAlternateSetting - 0 */
    0x00, /* 4 bNumEndpoints - No bandwidth used */
    USB_CLASS_VIDEO, /* 5 bInterfaceClass - Video Class */
    USB_VIDEO_STREAMING, /* 6 bInterfaceSubClass - VideoStreaming Interface */
    0x00, /* 7 bInterfaceProtocol - No protocol */
    0x00, /* 8 iInterface - Unused */

    /* Class-specific VS Interface Input Header Descriptor */
    0x0E, /* 0 bLength */
    USB_DESCTYPE_CS_INTERFACE, /* 1 bDescriptorType - Class-specific Interface */
    USB_VS_INPUT_HEADER, /* 2 bDescriptorSubType - INPUT HEADER */
    0x01, /* 3 bNumFormats - One format supported */
    0x47, 0x00, /* 4 wTotalLength - Size of class-specific VS descriptors */
    (VIDEO_DATA_EP_NUM | 0x80), /* 6 bEndpointAddress - Iso EP for video streaming */
    0x00, /* 7 bmInfo - No dynamic format change */
    0x02, /* 8 bTerminalLink - Denotes the Output Terminal */
    0x01, /* 9 bStillCaptureMethod - Method 1 supported */
    0x00, /* 10 bTriggerSupport - No Hardware Trigger */
    0x00, /* 11 bTriggerUsage */
    0x01, /* 12 bControlSize - 1 byte */
    0x00, /* 13 bmaControls - No Controls supported */

    /* Class-specific VS Format Descriptor */
    0x1B, /* 0 bLength */
    USB_DESCTYPE_CS_INTERFACE, /* 1 bDescriptorType - Class-specific Interface */
    USB_VS_FORMAT_UNCOMPRESSED, /* 2 bDescriptorSubType - FORMAT UNCOMPRESSED */
    0x01, /* 3 bFormatIndex */
    0x01, /* 4 bNumFrameDescriptors - 1 Frame descriptor followed */
    0x59,0x55,0x59,0x32,
    0x00,0x00,0x10,0x00,
    0x80,0x00,0x00,0xAA,
    0x00,0x38,0x9B,0x71, /* 5 guidFormat - YUY2 Video format */
    BITS_PER_PIXEL, /* 21 bBitsPerPixel - 16 bits */
    0x01, /* 22 bDefaultFrameIndex */
    0x00, /* 23 bAspectRatioX */
    0x00, /* 24 bAspectRatioY */
    0x00, /* 25 bmInterlaceFlags - No interlaced mode */
    0x00, /* 26 bCopyProtect - No restrictions on duplication */

    /* Class-specific VS Frame Descriptor */
    0x1E, /* 0 bLength */
    USB_DESCTYPE_CS_INTERFACE, /* 1 bDescriptorType - Class-specific Interface */
    USB_VS_FRAME_UNCOMPRESSED, /* 2 bDescriptorSubType */
    0x01, /* 3 bFrameIndex */
    0x01, /* 4 bmCapabilities - Still image capture method 1 */
    SHORT_CHARS(WIDTH), /* 5 wWidth - 480 pixels */
    SHORT_CHARS(HEIGHT), /* 7 wHeight - 320 pixels */
    WORD_CHARS(MIN_BIT_RATE), /* 9 dwMinBitRate */
    WORD_CHARS(MAX_BIT_RATE), /* 13 dwMaxBitRate */
    WORD_CHARS(MAX_FRAME_SIZE), /* 17 dwMaxVideoFrameBufSize */
    WORD_CHARS(FRAME_INTERVAL), /* 21 dwDefaultFrameInterval (in 100ns units) */
    0x01, /* 25 bFrameIntervalType */
    WORD_CHARS(FRAME_INTERVAL), /* 26 dwFrameInterval (in 100ns units) */

    /* Video Streaming Interface Descriptor */
    /* Alternate Setting 1 */
    0x09, /* 0 bLength */
    USB_DESCTYPE_INTERFACE, /* 1 bDescriptorType - Interface */
    0x01, /* 2 bInterfaceNumber - Interface 1 */
    0x01, /* 3 bAlternateSetting - 1 */
    0x01, /* 4 bNumEndpoints */
    USB_CLASS_VIDEO, /* 5 bInterfaceClass - Video Class */
    USB_VIDEO_STREAMING, /* 6 bInterfaceSubClass - VideoStreaming Interface */
    0x00, /* 7 bInterfaceProtocol - No protocol */
    0x00, /* 8 iInterface - Unused */

    /* Standard VS Isochronous Video Data Endpoint Descriptor */
    0x07, /* 0 bLength */
    USB_DESCTYPE_ENDPOINT, /* 1 bDescriptorType */
    (VIDEO_DATA_EP_NUM | 0x80), /* 2 bEndpointAddress - IN Endpoint */
    0x05, /* 3 bmAttributes - Isochronous EP (Asynchronous) */
    0x00, 0x04, /* 4 wMaxPacketSize 1x 1024 bytes*/
    0x01, /* 6 bInterval */
};

配置描述符告诉主机设备的电源需求及其支持的接口数量。

多个接口一起提供视频功能。这组接口称为视频接口集合。视频接口集合由接口关联描述符(IAD)描述。
在示例应用程序中,IAD定义接口0和1分组以形成USB视频设备。这两个接口是:

注:视频功能必须有一个视频控制接口和零个或多个视频流接口

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Linux V4L2 UVC摄像头框架浅析
V4L2 :video for linux version 2 ,是 Linux 里一套标准的视频驱动,它支持 UVC 标准的摄像头。本文来分析一下它的核心框架。整个v4l2的框架分为三层:在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行......
打开UVC摄像头(特定类请求)数据分析
通过上节可以知道,设备支持4种的视频格式,且每种格式如下:MPJPG数据格式bFormatIndexbFrameIndex分辩率及及帧率11640x480x(30,15,10)121280x720x(30,15,10)131920x1080x(30,15......
UVC摄像头扩展单元功能的开发步骤是什么?
写在扩展单元的题外话本人在开发支持UVC扩展单元的directShow应用时,必现并不需要注册接口,只需要在其源过滤器参照后续的代码枚举相关的接口如IKsControl,IKsTopologyInfo定位到指定的扩展单元接口后,直接使用其对应的IKsControl::KsProperty即可实现扩展......
UVC摄像头的延迟reduce latency
一般的ISP,200W30帧来说,sensor进来缓存一帧就是33ms+vpu处理时间大概10ms+jpeg编码时间16ms+USB传输时间200KB大概7、8ms,最后就是windows上的显示延迟时间,如果JPEG编码出来缓存不止一帧,时间就更长了,所以一般会超过100多ms另外,网络传输如使......
UVC Windows下UVC摄像头数据分析
这里我们分析一款UVC摄像头来进行数据分析。环境:win10 x64工具:bushound,usbviewer将摄像头插入PC后,打开usbviewer工具,可以看到关于此摄像头的相关信息。可以看到,这个摄像头其实是一个USB复合设备,所以其对应的系统驱动为USBCCGP,然后再由USB复合设......
UVC摄像头的关闭流程及抓包分析
通过UVC协议规范可以知道,UVC的数据传输支持USB四种传输中的批量传输和同步传输,所以对于UVC摄像头,当我们在摄像头正在工作时,需要停止摄像头工作,执行的操作是不同的。在Linux的源代码中,摄像头的流关闭是由函数uvc_video_stop_streaming完成的。代码比较简单,我们直接给......
USB音箱 UAC配置描述符分析
该USB音箱的配置描述符和普通USB设备描述符结构体一致,并无特别区别。该配置描述符的总长度(包括后续的所有其它描述符)为110字节,这里相对华为耳机的要少了很多,这是因为少了像麦克风和HID。从配置描述符的字段bmAttributes来看,并不支持远程唤醒功能。 ------------......
华为UAC耳机 配置描述符
配置描述符的大小其实不光包括配置描述符自身,也包括后续的所有描述符。这里我们只先介绍一下配置描述符,后续的接口描述符和其它UAC相关描述符在后续一节介绍。配置描述符的内容如下: ------------------ Configuration Descriptor --------------......
UAC 其它速率配置描述符
在UAC规范中,并没有定义特别的其它速率配置描述符,故UAC音频设备的其它速率描述符应符合USB规范中的其它速率配置描述符。......
UVC摄像头批量传输的StreamOn和StreamOff
在UVC规范中,UVC摄像头视频数据的传输方式支持两种,分别为批量传输和同步传输。UVC摄像头数据传输的格式按负载数据头的方式按帧进行打包传输。根据USB规范可知,同步传输方式是只要带中带有同步端点的接口,系统会定时从设备中读取数据,无论设备中是否有数据。而如要要停止数据的传输,只需要选中不带有同步......
Linux源码分析UVC摄像头的初始化流程分析
UVC摄像头的初始化发生在硬件被接入USB集线器中,设备初USB驱动识别为摄像头的后续初始化流程。和Windows的AddDevice驱动函数一样,Linux设备的创建和侦测是通过int uvc_probe函数实现的。其函数的调用关系如下://linux/v5.11.11/source/drive......
USB-UAC麦克风 配置描述符
UAC麦克风采用的配置描述符结构和USB配置描述符的结构一致.偏移地址字段长度值描述0bLength10x09配置描述符的长度1bDescriptorType10x02描述符类型,配置描述符类型2wTotalLength20x0064配置描述符的总长度(包括后续的UAC音频控制和UAC音频流接口描述......
USB设备描述符、配置描述符、接口描述符和端点描述符的拓扑关系
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。一次只能有一个配置是活动的。大多数的设备只有一个配置和一个接口,当一个设备......
关于UVC摄像头指示灯的调试过程总结
最近遇到了一个很是奇怪的UVC摄像头指示灯问题,现象如下:上层应用是一个会议系统软件,当需要进行会议时,点击会议按钮添加会议。这时应用软件打开摄像头,并开始与服务器进行网络连接。当然由于摄像头的打开,摄像头指示灯点亮。上层应用软件与服务器连接后,进行会议界面。这时突然摄像头指示灯熄灭,但会议正常,摄......
UVC摄像头打开关闭数据分析
UVC相机在打开时,会使用SET_INTERFACE命令,在停止播放时,也会发送SET_INTERFACE命令。打开时,数据抓包为:CTL 01 0b 01 00 01 00 00 00 SET INTERFACE停播放时,数据抓包为:CTL 01 0b 00 00 01......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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