(八) Usb摄像头描述符解析

Usb摄像头描述符解析

总结

mark

参考老师的代码总结如下,序号就是代码的文件夹编号

1. 实现usb插入识别
	驱动识别的是接口,摄像头有vc/vs接口,所以probe会进入两次
	static struct usb_device_id myuvc_ids[] = {...}
2. 打印设备描述符
		// 通过接口获得它的父节点:设备
		struct usb_device *dev = interface_to_usbdev(intf); 
		// 通过 usb_device 设备结构来获得 设备描述符
		struct usb_device_descriptor *descriptor = &dev->descriptor;

3. 打印配置描述符
		// 设备描述符 指出了多少个配置 descriptor->bNumConfigurations
		for (i = 0; i < descriptor->bNumConfigurations; i++)
		{
			struct usb_host_config *hostconfig;
			struct usb_config_descriptor *config;

			//设备管理结构中包含了配置管理结构
			hostconfig = &dev->config[i];
			//配置管理结构中包含了配置描述符
			config     = &hostconfig->desc;
		}
4. 打印联合接口描述符
	这里的联合接口IAD主要用来扩展USB协议的,这里用来描述video特殊的描述,我们一开始并不知道有多少个 vc,需要解析这个才能知道
	这个联合接口是在我们的每个配置下的,可以有多个,这里我们只考虑第一个先
	struct usb_interface_assoc_descriptor *assoc_desc;
	// 遍历配置
	for (i = 0; i < descriptor->bNumConfigurations; i++)
	{
		assoc_desc = hostconfig->intf_assoc[0];
		
	}
5. 	打印接口描述符,也称具体设置
	设置描述就在接口下,一个接口下有多个设置
	// intf 就是probe 传递的接口
	for (j = 0; j < intf->num_altsetting; j++)
	{
		interface = &intf->altsetting[j].desc;
	}

6. 打印具体的联合接口数据
	这个联合接口数据在具体的接口设置下的扩展数据
	buffer = intf->cur_altsetting->extra;	//当前接口的设置
	buflen = intf->cur_altsetting->extralen;
7. 解析VC接口的具体数据,上面的配置描述符已经指出了有两个2接口
8. 解析VS接口的具体数据,这里的解析我们需要看uvc多个文档
	interface = &intf->cur_altsetting->desc;
	if ((buffer[1] == USB_DT_CS_INTERFACE) && (interface->bInterfaceSubClass == 1))
	{
		parse_videocontrol_interface(intf, buffer, buflen);
	}
	if ((buffer[1] == USB_DT_CS_INTERFACE) && (interface->bInterfaceSubClass == 2))
	{
		parse_videostreaming_interface(intf, buffer, buflen);
	}
9. 打印端点描述符
	接口下有多个设置,设置下有多个端点
	for (j = 0; j < intf->num_altsetting; j++)
	{
		interface = &intf->altsetting[j].desc;
		for (m = 0; m < interface->bNumEndpoints; m++)//接口设置描述符下有指示几个端点
		{
			endpoint = &intf->altsetting[j].endpoint[m].desc;
		}
	}

参考资料

从零写USB摄像头驱动之分析描述符

插图资料

lsusb的源代码usbutils-006>lsusb.c

打印设备描述符

#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/videodev2.h>
#include <linux/vmalloc.h>
#include <linux/wait.h>
#include <asm/atomic.h>
#include <asm/unaligned.h>

#include <media/v4l2-common.h>

static int myuvc_probe(struct usb_interface *intf,
		     const struct usb_device_id *id)
{
    static int cnt = 0;
	struct usb_device *dev = interface_to_usbdev(intf);
    struct usb_device_descriptor *descriptor = &dev->descriptor;

    printk("myuvc_probe : cnt = %d\n", cnt++);

    /* 打印设备描述符 */
	printk("Device Descriptor:\n"
	       "  bLength             %5u\n"
	       "  bDescriptorType     %5u\n"
	       "  bcdUSB              %2x.%02x\n"
	       "  bDeviceClass        %5u \n"
	       "  bDeviceSubClass     %5u \n"
	       "  bDeviceProtocol     %5u \n"
	       "  bMaxPacketSize0     %5u\n"
	       "  idVendor           0x%04x \n"
	       "  idProduct          0x%04x \n"
	       "  bcdDevice           %2x.%02x\n"
	       "  iManufacturer       %5u\n"
	       "  iProduct            %5u\n"
	       "  iSerial             %5u\n"
	       "  bNumConfigurations  %5u\n",
	       descriptor->bLength, descriptor->bDescriptorType,
	       descriptor->bcdUSB >> 8, descriptor->bcdUSB & 0xff,
	       descriptor->bDeviceClass, 
	       descriptor->bDeviceSubClass,
	       descriptor->bDeviceProtocol, 
	       descriptor->bMaxPacketSize0,
	       descriptor->idVendor,  descriptor->idProduct,
	       descriptor->bcdDevice >> 8, descriptor->bcdDevice & 0xff,
	       descriptor->iManufacturer, 
	       descriptor->iProduct, 
	       descriptor->iSerialNumber, 
	       descriptor->bNumConfigurations);
    
    
    return 0;
}

static void myuvc_disconnect(struct usb_interface *intf)
{
    static int cnt = 0;
    printk("myuvc_disconnect : cnt = %d\n", cnt++);
}

static struct usb_device_id myuvc_ids[] = {
	/* Generic USB Video Class */
	{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },  /* VideoControl Interface */
    { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 2, 0) },  /* VideoStreaming Interface */
	{}
};

/* 1. 分配usb_driver */
/* 2. 设置 */
static struct usb_driver myuvc_driver = {
    .name       = "myuvc",
    .probe      = myuvc_probe,
    .disconnect = myuvc_disconnect,
    .id_table   = myuvc_ids,
};

static int myuvc_init(void)
{
    /* 3. 注册 */
    usb_register(&myuvc_driver);
    return 0;
}

static void myuvc_exit(void)
{
    usb_deregister(&myuvc_driver);
}

module_init(myuvc_init);
module_exit(myuvc_exit);

MODULE_LICENSE("GPL");

打印信息如下,这里重复打印了两次,因为能够匹配两次接口

sudo rmmod    uvcvideo
sudo rmmod    myuvc
sudo insmod   myuvc.ko
dmesg 
[  384.615769] Device Descriptor:
                 bLength                18
                 bDescriptorType         1
                 bcdUSB               2.00
                 bDeviceClass          239
                 bDeviceSubClass         2
                 bDeviceProtocol         1
                 bMaxPacketSize0        64
                 idVendor           0x05a3
                 idProduct          0x9310
                 bcdDevice            0.00
                 iManufacturer           2
                 iProduct                1
                 iSerial                 0
                 bNumConfigurations      1

可以看到程序中的匹配{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },USB_CLASS_VIDEO值就是0x0E,这里的描述符类型是1也就是SC_VIDEOCONTROL

mark

打印配置描述符

在设备描述符里, __u8 bNumConfigurations;定义了设备的配置描述符个数,使用for循环将它打印。

static int myuvc_probe(struct usb_interface *intf,
		     const struct usb_device_id *id)
{
    static int cnt = 0;
	struct usb_device *dev = interface_to_usbdev(intf);
    struct usb_device_descriptor *descriptor = &dev->descriptor;
    struct usb_host_config *hostconfig;
    struct usb_config_descriptor *config;
    int i;

    printk("myuvc_probe : cnt = %d\n", cnt++);

    /* 打印设备描述符 */
	printk("Device Descriptor:\n"
	       "  bLength             %5u\n"
	       "  bDescriptorType     %5u\n"
	       "  bcdUSB              %2x.%02x\n"
	       "  bDeviceClass        %5u \n"
	       "  bDeviceSubClass     %5u \n"
	       "  bDeviceProtocol     %5u \n"
	       "  bMaxPacketSize0     %5u\n"
	       "  idVendor           0x%04x \n"
	       "  idProduct          0x%04x \n"
	       "  bcdDevice           %2x.%02x\n"
	       "  iManufacturer       %5u\n"
	       "  iProduct            %5u\n"
	       "  iSerial             %5u\n"
	       "  bNumConfigurations  %5u\n",
	       descriptor->bLength, descriptor->bDescriptorType,
	       descriptor->bcdUSB >> 8, descriptor->bcdUSB & 0xff,
	       descriptor->bDeviceClass, 
	       descriptor->bDeviceSubClass,
	       descriptor->bDeviceProtocol, 
	       descriptor->bMaxPacketSize0,
	       descriptor->idVendor,  descriptor->idProduct,
	       descriptor->bcdDevice >> 8, descriptor->bcdDevice & 0xff,
	       descriptor->iManufacturer, 
	       descriptor->iProduct, 
	       descriptor->iSerialNumber, 
	       descriptor->bNumConfigurations);

    for (i = 0; i < descriptor->bNumConfigurations; i++)
    {
        hostconfig = &dev->config[i];
        config     = &hostconfig->desc;
        printk("  Configuration Descriptor %d:\n"
               "    bLength             %5u\n"
               "    bDescriptorType     %5u\n"
               "    wTotalLength        %5u\n"
               "    bNumInterfaces      %5u\n"
               "    bConfigurationValue %5u\n"
               "    iConfiguration      %5u\n"
               "    bmAttributes         0x%02x\n",
               i, 
               config->bLength, config->bDescriptorType,
               le16_to_cpu(config->wTotalLength),
               config->bNumInterfaces, config->bConfigurationValue,
               config->iConfiguration,
               config->bmAttributes);
        
    }
    
    
    return 0;
}

这里有1个配置描述符,打印如下

 1281.895515]   Configuration Descriptor 0:
                   bLength                 9
                   bDescriptorType         2
                   wTotalLength          963
                   bNumInterfaces          4
                   bConfigurationValue     1
                   iConfiguration          0
                   bmAttributes         0x80

打印接口联合体描述符

这里先解释下这个接口联合体描述符,在我们的摄像头框架中,我们并不知道有多少个video control,这里这个接口联合体描述符就会告诉我们这些

mark

接下去的IAD的具体描述指出了具体的信息

mark

struct usb_interface_assoc_descriptor {
	__u8  bLength;
	__u8  bDescriptorType;

	__u8  bFirstInterface;		//第一个接口
	__u8  bInterfaceCount;		//总共有多少个接口,在这个联合体里有几个接口
	__u8  bFunctionClass;
	__u8  bFunctionSubClass;
	__u8  bFunctionProtocol;
	__u8  iFunction;
} __attribute__ ((packed));

修改代码如下

static int myuvc_probe(struct usb_interface *intf,
		     const struct usb_device_id *id)
{
    static int cnt = 0;
	struct usb_device *dev = interface_to_usbdev(intf);
    struct usb_device_descriptor *descriptor = &dev->descriptor;
    struct usb_host_config *hostconfig;
    struct usb_config_descriptor *config;
	struct usb_interface_assoc_descriptor *assoc_desc;
    int i;

    printk("myuvc_probe : cnt = %d\n", cnt++);

    /* 打印设备描述符 */
	printk("Device Descriptor:\n"
	       "  bLength             %5u\n"
	       "  bDescriptorType     %5u\n"
	       "  bcdUSB              %2x.%02x\n"
	       "  bDeviceClass        %5u \n"
	       "  bDeviceSubClass     %5u \n"
	       "  bDeviceProtocol     %5u \n"
	       "  bMaxPacketSize0     %5u\n"
	       "  idVendor           0x%04x \n"
	       "  idProduct          0x%04x \n"
	       "  bcdDevice           %2x.%02x\n"
	       "  iManufacturer       %5u\n"
	       "  iProduct            %5u\n"
	       "  iSerial             %5u\n"
	       "  bNumConfigurations  %5u\n",
	       descriptor->bLength, descriptor->bDescriptorType,
	       descriptor->bcdUSB >> 8, descriptor->bcdUSB & 0xff,
	       descriptor->bDeviceClass, 
	       descriptor->bDeviceSubClass,
	       descriptor->bDeviceProtocol, 
	       descriptor->bMaxPacketSize0,
	       descriptor->idVendor,  descriptor->idProduct,
	       descriptor->bcdDevice >> 8, descriptor->bcdDevice & 0xff,
	       descriptor->iManufacturer, 
	       descriptor->iProduct, 
	       descriptor->iSerialNumber, 
	       descriptor->bNumConfigurations);

    for (i = 0; i < descriptor->bNumConfigurations; i++)
    {
        hostconfig = &dev->config[i];
        config     = &hostconfig->desc;
        printk("  Configuration Descriptor %d:\n"
               "    bLength             %5u\n"
               "    bDescriptorType     %5u\n"
               "    wTotalLength        %5u\n"
               "    bNumInterfaces      %5u\n"
               "    bConfigurationValue %5u\n"
               "    iConfiguration      %5u\n"
               "    bmAttributes         0x%02x\n",
               i, 
               config->bLength, config->bDescriptorType,
               le16_to_cpu(config->wTotalLength),
               config->bNumInterfaces, config->bConfigurationValue,
               config->iConfiguration,
               config->bmAttributes);

        assoc_desc = hostconfig->intf_assoc[0];
        printk("    Interface Association:\n"
               "      bLength             %5u\n"
               "      bDescriptorType     %5u\n"
               "      bFirstInterface     %5u\n"
               "      bInterfaceCount     %5u\n"
               "      bFunctionClass      %5u\n"
               "      bFunctionSubClass   %5u\n"
               "      bFunctionProtocol   %5u\n"
               "      iFunction           %5u\n",
            assoc_desc->bLength,
            assoc_desc->bDescriptorType,
            assoc_desc->bFirstInterface,
            assoc_desc->bInterfaceCount,
            assoc_desc->bFunctionClass,
            assoc_desc->bFunctionSubClass,
            assoc_desc->bFunctionProtocol,
            assoc_desc->iFunction);
        
        
    }
    
    
    return 0;
}

打印信息如下,可以看到这个联合接口描述有两个接口

[20081.506088] myuvc_probe : cnt = 0
[20081.506091] Device Descriptor:
                 bLength                18
                 bDescriptorType         1
                 bcdUSB               2.00
                 bDeviceClass          239
                 bDeviceSubClass         2
                 bDeviceProtocol         1
                 bMaxPacketSize0        64
                 idVendor           0x05a3
                 idProduct          0x9310
                 bcdDevice            0.00
                 iManufacturer           2
                 iProduct                1
                 iSerial                 0
                 bNumConfigurations      1
[20081.506093]   Configuration Descriptor 0:
                   bLength                 9
                   bDescriptorType         2
                   wTotalLength          963
                   bNumInterfaces          4
                   bConfigurationValue     1
                   iConfiguration          0
                   bmAttributes         0x80
[20081.506094]     Interface Association:
                     bLength                 8
                     bDescriptorType        11
                     bFirstInterface         0		//第一个接口
                     bInterfaceCount         2		//数量
                     bFunctionClass         14
                     bFunctionSubClass       3
                     bFunctionProtocol       0
                     iFunction               5

打印接口描述符

USB驱动针对的是接口,而不是每一个设备,也就是idtable匹配到具体的接口描述就会去调用probe

一个接口下面有多个设置,我们可以将这些设置打印出来,在韦老师的代码中,我觉得打印接口描述符不应该

for(多个配置)
	for(多个设置)
        打印本接口的多个设置

而是应该

for(多个配置)
	打印配置描述符
for(多个设置)
    打印接口的多个设置

我们的probe传递的接口参数中,altsetting表示了多个设置,cur_altsetting表示了当前的设置

struct usb_interface {
	/* array of alternate settings for this interface,
	 * stored in no particular order */
	struct usb_host_interface *altsetting;

	struct usb_host_interface *cur_altsetting;	/* the currently
					 * active alternate setting */
	unsigned num_altsetting;	/* number of alternate settings */

	/* If there is an interface association descriptor then it will list
	 * the associated interfaces */
	struct usb_interface_assoc_descriptor *intf_assoc;

	int minor;			/* minor number this interface is
					 * bound to */
	enum usb_interface_condition condition;		/* state of binding */
	unsigned sysfs_files_created:1;	/* the sysfs attributes exist */
	unsigned ep_devs_created:1;	/* endpoint "devices" exist */
	unsigned unregistering:1;	/* unregistration is in progress */
	unsigned needs_remote_wakeup:1;	/* driver requires remote wakeup */
	unsigned needs_altsetting0:1;	/* switch to altsetting 0 is pending */
	unsigned needs_binding:1;	/* needs delayed unbind/rebind */
	unsigned resetting_device:1;	/* true: bandwidth alloc after reset */
	unsigned authorized:1;		/* used for interface authorization */

	struct device dev;		/* interface specific device info */
	struct device *usb_dev;
	atomic_t pm_usage_cnt;		/* usage counter for autosuspend */
	struct work_struct reset_ws;	/* for resets in atomic context */
};

测试代码如下

struct usb_interface_descriptor	*interface;
for (j = 0; j < intf->num_altsetting; j++)
{
    interface = &intf->altsetting[j].desc;
    printk("    Interface Descriptor altsetting %d:\n"
           "      bLength             %5u\n"
           "      bDescriptorType     %5u\n"
           "      bInterfaceNumber    %5u\n"
           "      bAlternateSetting   %5u\n"
           "      bNumEndpoints       %5u\n"
           "      bInterfaceClass     %5u\n"
           "      bInterfaceSubClass  %5u\n"
           "      bInterfaceProtocol  %5u\n"
           "      iInterface          %5u\n",
           j, 
           interface->bLength, interface->bDescriptorType, interface->bInterfaceNumber,
           interface->bAlternateSetting, interface->bNumEndpoints, interface->bInterfaceClass,
           interface->bInterfaceSubClass, interface->bInterfaceProtocol,
           interface->iInterface);
}

打印如下

-------------------------设备描述符--------------------------------------  
[22200.195958] myuvc_probe : cnt = 0
[22200.195961] Device Descriptor:
                 bLength                18
                 bDescriptorType         1
                 bcdUSB               2.00
                 bDeviceClass          239
                 bDeviceSubClass         2
                 bDeviceProtocol         1
                 bMaxPacketSize0        64
                 idVendor           0x05a3
                 idProduct          0x9310
                 bcdDevice            0.00
                 iManufacturer           2
                 iProduct                1
                 iSerial                 0
                 bNumConfigurations      1
-------------------------配置描述符--------------------------------------                     
                     
[22200.195963]   Configuration Descriptor 0:
                   bLength                 9
                   bDescriptorType         2
                   wTotalLength          963
                   bNumInterfaces          4
                   bConfigurationValue     1
                   iConfiguration          0
                   bmAttributes         0x80
-------------------------接口联合体描述符--------------------------------------                      
[22200.195981]     Interface Association:
                     bLength                 8
                     bDescriptorType        11
                     bFirstInterface         0
                     bInterfaceCount         2
                     bFunctionClass         14
                     bFunctionSubClass       3
                     bFunctionProtocol       0
                     iFunction               5
=====================接口1点描述符,描述了当前支持的设置 =========================                        
[22200.195983]     Interface Descriptor altsetting 0:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        0
                     bAlternateSetting       0
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      1
                     bInterfaceProtocol      0
                     iInterface              5
[22200.195998] myuvc_probe : cnt = 1
[22200.196000] Device Descriptor:
                 bLength                18
                 bDescriptorType         1
                 bcdUSB               2.00
                 bDeviceClass          239
                 bDeviceSubClass         2
                 bDeviceProtocol         1
                 bMaxPacketSize0        64
                 idVendor           0x05a3
                 idProduct          0x9310
                 bcdDevice            0.00
                 iManufacturer           2
                 iProduct                1
                 iSerial                 0
                 bNumConfigurations      1
[22200.196001]   Configuration Descriptor 0:
                   bLength                 9
                   bDescriptorType         2
                   wTotalLength          963
                   bNumInterfaces          4
                   bConfigurationValue     1
                   iConfiguration          0
                   bmAttributes         0x80
[22200.196002]     Interface Association:
                     bLength                 8
                     bDescriptorType        11
                     bFirstInterface         0
                     bInterfaceCount         2
                     bFunctionClass         14
                     bFunctionSubClass       3
                     bFunctionProtocol       0
                     iFunction               5
=====================接口2点描述符,描述了当前支持的设置 =========================                          
[22200.196003]     Interface Descriptor altsetting 0:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       0
                     bNumEndpoints           0
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              5
[22200.196004]     Interface Descriptor altsetting 1:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       1
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[22200.196006]     Interface Descriptor altsetting 2:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       2
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[22200.196007]     Interface Descriptor altsetting 3:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       3
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[22200.196008]     Interface Descriptor altsetting 4:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       4
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[22200.196009]     Interface Descriptor altsetting 5:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       5
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[22200.196010]     Interface Descriptor altsetting 6:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       6
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0

打印当前设置的额外描述符

这里的额外描述符,也就是我们上面提到的接口联合体扩展中所提到的扩展了2个接口,数据存在当前设置的extra

struct usb_host_interface {
	struct usb_interface_descriptor	desc;

	int extralen;
	unsigned char *extra;   /* Extra descriptors */

	/* array of desc.bNumEndpoints endpoints associated with this
	 * interface setting.  these will be in no particular order.
	 */
	struct usb_host_endpoint *endpoint;

	char *string;		/* iInterface string, if present */
};

mark

mark

测试代码如下,这里首先获取buf的总长度,其次每个描述符的第一个字节都是长度,所以依次取出这个长度然后打印

buffer = intf->cur_altsetting->extra;
buflen = intf->cur_altsetting->extralen;
printk("extra buffer of interface %d:\n", cnt-1);
k = 0;
desc_cnt = 0;
while (k < buflen)
{
    desc_len = buffer[k];
    printk("extra desc %d: ", desc_cnt);
    for (l = 0; l < desc_len; l++, k++)
    {
        printk("%02x ", buffer[k]);
    }
    desc_cnt++;
    printk("\n");
}

结果如下,我们可以从 A.4. Video Class-Specific Descriptor Types P171入手,依次读取 其中

CS_INTERFACE 0x24

第三个字节就是子类,搜索具体子类的名字再去分析

mark

仔细分析打印的数据,总结出数据走向

IT>PU>EU(扩展单元,厂家自定义)>OT
[26644.221914] extra buffer of interface 0:
[26644.221914] extra desc 0:
[26644.221915] 0d	
[26644.221916] 24	//CS_INTERFACE
[26644.221916] 01	// 子类subtype	VC_HEADER 
[26644.221917] 00	// bcdUVC	
[26644.221917] 01	// bcdUVC
[26644.221918] 4d	//wTotalLength
[26644.221918] 00	//wTotalLength
[26644.221919] c0	//dwClockFrequency
[26644.221919] e1	//dwClockFrequency
[26644.221920] e4	//dwClockFrequency	
[26644.221920] 00	//dwClockFrequency
[26644.221921] 01	//bInCollection
[26644.221921] 01	//bInCollection

//总结起来就是 IT>PU>EU(扩展单元,厂家自定义)>OT

// VC_OUTPUT_TERMINAL 的源是04 也就是下面的 VC_EXTENSION_UNIT  EU>OT
[26644.221923] extra desc 1:
[26644.221923] 09
[26644.221924] 24
[26644.221924] 03	VC_OUTPUT_TERMINAL
[26644.221925] 02	bTerminalID
[26644.221925] 01	wTerminalType
[26644.221926] 01	wTerminalType
[26644.221926] 00	bAssocTerminal
[26644.221927] 04	bSourceID			---源
[26644.221927] 00	iTerminal

//VC_EXTENSION_UNIT 的源是03,也就是VC_PROCESSING_UNIT PU>EU
[26644.221928] extra desc 2:
[26644.221929] 1a
[26644.221929] 24
[26644.221930] 06	VC_EXTENSION_UNIT
[26644.221930] 04	bUnitID			//id 
[26644.221931] 70	GUID(16)
[26644.221931] 33
[26644.221932] f0
[26644.221932] 28
[26644.221933] 11
[26644.221933] 63
[26644.221934] 2e
[26644.221934] 4a
[26644.221935] ba
[26644.221935] 2c
[26644.221936] 68
[26644.221936] 90
[26644.221937] eb
[26644.221937] 33
[26644.221938] 40
[26644.221938] 16
[26644.221939] 08	bNumControls
[26644.221939] 01	bNrInPins
[26644.221940] 03	baSourceID	----源头
[26644.221940] 01
[26644.221941] 0f
[26644.221941] 00
//VC_INPUT_TERMINAL 没有源
[26644.221942] extra desc 3:
[26644.221943] 12
[26644.221943] 24
[26644.221944] 02	VC_INPUT_TERMINAL
[26644.221944] 01	bTerminalID		//id 
[26644.221945] 01	wTerminalType	//可以搜索到162页
[26644.221945] 02	wTerminalType
[26644.221946] 00	bAssocTerminal
[26644.221946] 00	iTerminal
[26644.221947] 00	wObjectiveFocalLengthMin
[26644.221947] 00	wObjectiveFocalLengthMin
[26644.221948] 00	wObjectiveFocalLengthMax
[26644.221948] 00	wObjectiveFocalLengthMax
[26644.221949] 00	wOcularFocalLength
[26644.221949] 00	wOcularFocalLength
[26644.221950] 03	bControlSize
[26644.221950] 1e	bmControls
[26644.221951] 00	bmControls
[26644.221951] 00	bmControls
//VC_PROCESSING_UNIT 的源是01 VC_INPUT_TERMINAL  IT>PU
[26644.221952] extra desc 4:
[26644.221953] 0b
[26644.221953] 24
[26644.221954] 05	VC_PROCESSING_UNIT
[26644.221954] 03	bUnitID
[26644.221955] 01	bSourceID --源头是01
[26644.221955] 00	wMaxMultiplier
[26644.221985] 00	wMaxMultiplier
[26644.221986] 02	bControlSize
[26644.221987] 7f	bmControls
[26644.221987] 37	bmControls
[26644.221988] 00	bmControls

接着我们可以搜索下VS流的子类也就是157页,其中具体的格式format后和fram后需要到其他的pdf找,比如USB_Video_Payload_MJPEG_1.5USB_Video_Payload_Uncompressed_1.5

下面的支持两种格式mjpeg未压缩的 uncompressed,每种视频格式又有多种fram(分辨率)

mark

具体的分析如下

[26644.221914] extra buffer of interface 0:
[26644.221914] extra desc 0:
[26644.221915] 0d	
[26644.221916] 24	//CS_INTERFACE
[26644.221916] 01	// 子类subtype	VC_HEADER 
[26644.221917] 00	// bcdUVC	
[26644.221917] 01	// bcdUVC
[26644.221918] 4d	//wTotalLength
[26644.221918] 00	//wTotalLength
[26644.221919] c0	//dwClockFrequency
[26644.221919] e1	//dwClockFrequency
[26644.221920] e4	//dwClockFrequency	
[26644.221920] 00	//dwClockFrequency
[26644.221921] 01	//bInCollection
[26644.221921] 01	//bInCollection

//总结起来就是 IT>PU>EU(扩展单元,厂家自定义)>OT

// VC_OUTPUT_TERMINAL 的源是04 也就是下面的 VC_EXTENSION_UNIT  EU>OT
[26644.221923] extra desc 1:
[26644.221923] 09
[26644.221924] 24
[26644.221924] 03	VC_OUTPUT_TERMINAL
[26644.221925] 02	bTerminalID
[26644.221925] 01	wTerminalType
[26644.221926] 01	wTerminalType
[26644.221926] 00	bAssocTerminal
[26644.221927] 04	bSourceID			---源
[26644.221927] 00	iTerminal

//VC_EXTENSION_UNIT 的源是03,也就是VC_PROCESSING_UNIT PU>EU
[26644.221928] extra desc 2:
[26644.221929] 1a
[26644.221929] 24
[26644.221930] 06	VC_EXTENSION_UNIT
[26644.221930] 04	bUnitID			//id 
[26644.221931] 70	GUID(16)
[26644.221931] 33
[26644.221932] f0
[26644.221932] 28
[26644.221933] 11
[26644.221933] 63
[26644.221934] 2e
[26644.221934] 4a
[26644.221935] ba
[26644.221935] 2c
[26644.221936] 68
[26644.221936] 90
[26644.221937] eb
[26644.221937] 33
[26644.221938] 40
[26644.221938] 16
[26644.221939] 08	bNumControls
[26644.221939] 01	bNrInPins
[26644.221940] 03	baSourceID	----源头
[26644.221940] 01
[26644.221941] 0f
[26644.221941] 00
//VC_INPUT_TERMINAL 没有源
[26644.221942] extra desc 3:
[26644.221943] 12
[26644.221943] 24
[26644.221944] 02	VC_INPUT_TERMINAL
[26644.221944] 01	bTerminalID		//id 
[26644.221945] 01	wTerminalType	//可以搜索到162页
[26644.221945] 02	wTerminalType
[26644.221946] 00	bAssocTerminal
[26644.221946] 00	iTerminal
[26644.221947] 00	wObjectiveFocalLengthMin
[26644.221947] 00	wObjectiveFocalLengthMin
[26644.221948] 00	wObjectiveFocalLengthMax
[26644.221948] 00	wObjectiveFocalLengthMax
[26644.221949] 00	wOcularFocalLength
[26644.221949] 00	wOcularFocalLength
[26644.221950] 03	bControlSize
[26644.221950] 1e	bmControls
[26644.221951] 00	bmControls
[26644.221951] 00	bmControls
//VC_PROCESSING_UNIT 的源是01 VC_INPUT_TERMINAL  IT>PU
[26644.221952] extra desc 4:
[26644.221953] 0b
[26644.221953] 24
[26644.221954] 05	VC_PROCESSING_UNIT
[26644.221954] 03	bUnitID
[26644.221955] 01	bSourceID --源头是01
[26644.221955] 00	wMaxMultiplier
[26644.221985] 00	wMaxMultiplier
[26644.221986] 02	bControlSize
[26644.221987] 7f	bmControls
[26644.221987] 37	bmControls
[26644.221988] 00	bmControls

[26644.222013] myuvc_probe : cnt = 1
[26644.222017] Device Descriptor:
                 bLength                18
                 bDescriptorType         1
                 bcdUSB               2.00
                 bDeviceClass          239
                 bDeviceSubClass         2
                 bDeviceProtocol         1
                 bMaxPacketSize0        64
                 idVendor           0x05a3
                 idProduct          0x9310
                 bcdDevice            0.00
                 iManufacturer           2
                 iProduct                1
                 iSerial                 0
                 bNumConfigurations      1
[26644.222019]   Configuration Descriptor 0:
                   bLength                 9
                   bDescriptorType         2
                   wTotalLength          963
                   bNumInterfaces          4
                   bConfigurationValue     1
                   iConfiguration          0
                   bmAttributes         0x80
[26644.222021]     Interface Association:
                     bLength                 8
                     bDescriptorType        11
                     bFirstInterface         0
                     bInterfaceCount         2
                     bFunctionClass         14
                     bFunctionSubClass       3
                     bFunctionProtocol       0
                     iFunction               5
[26644.222023]     Interface Descriptor altsetting 0:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       0
                     bNumEndpoints           0
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              5
[26644.222025]     Interface Descriptor altsetting 1:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       1
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[26644.222027]     Interface Descriptor altsetting 2:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       2
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[26644.222029]     Interface Descriptor altsetting 3:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       3
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[26644.222031]     Interface Descriptor altsetting 4:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       4
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[26644.222033]     Interface Descriptor altsetting 5:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       5
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[26644.222035]     Interface Descriptor altsetting 6:
                     bLength                 9
                     bDescriptorType         4
                     bInterfaceNumber        1
                     bAlternateSetting       6
                     bNumEndpoints           1
                     bInterfaceClass        14
                     bInterfaceSubClass      2
                     bInterfaceProtocol      0
                     iInterface              0
[26644.222036] extra buffer of interface 1:
[26644.222036] extra desc 0:
[26644.222037] 0f
[26644.222037] 24
[26644.222038] 01	VS_INPUT_HEADER
[26644.222038] 02	bNumFormats		//支持两种格式,具体去
[26644.222039] 67	wTotalLength
[26644.222039] 02
[26644.222040] 81	bEndpointAddress
[26644.222040] 00	bmInfo
[26644.222041] 02	bTerminalLink
[26644.222041] 02	bStillCaptureMethod
[26644.222042] 00	bTriggerSupport
[26644.222042] 00	bTriggerUsage
[26644.222043] 01	bControlSize
[26644.222043] 00	bmaControls
[26644.222044] 00	bmaControls

[26644.222045] extra desc 1:
[26644.222045] 0b
[26644.222046] 24
[26644.222046] 06	VS_FORMAT_MJPEG		//支持这个格式
[26644.222047] 01	bFormatIndex		//第一种格式
[26644.222047] 08	bNumFrameDescriptors //有8种frame,下面就有8个格式
[26644.222048] 00	bmFlags
[26644.222069] 01	bDefaultFrameIndex	// 默认的frame
[26644.222071] 00	bAspectRatioX
[26644.222071] 00	bAspectRatioY
[26644.222072] 00	bmInterlaceFlags
[26644.222072] 00	bCopyProtect

[26644.222073] extra desc 2:
[26644.222074] 1e
[26644.222074] 24
[26644.222075] 07	VS_FRAME_MJPEG		//具体的frame
[26644.222075] 01	bFrameIndex			//frame 编号
[26644.222076] 00	bmCapabilities
[26644.222076] 00	wWidth  0x0500=1280
[26644.222077] 05
[26644.222077] d0	wHeight 720
[26644.222078] 02
[26644.222078] 30	dwMaxBitRate
[26644.222079] 28
[26644.222079] 60
[26644.222080] 1a
[26644.222080] 30	dwMaxVideoFrameBufferSize
[26644.222081] 28
[26644.222081] 60
[26644.222082] 1a	dwDefaultFrameInterval
[26644.222082] 4d
[26644.222083] 22
[26644.222083] 1c
[26644.222084] 00	dwDefaultFrameInterval
[26644.222084] 15
[26644.222085] 16
[26644.222085] 05
[26644.222086] 00	bFrameIntervalType
[26644.222087] 01
[26644.222087] 15
[26644.222088] 16
[26644.222088] 05
[26644.222089] 00

[26644.222090] extra desc 3:
[26644.222090] 1e
[26644.222091] 24
[26644.222091] 07       VS_FRAME_MJPEG		//具体的frame
[26644.222092] 02       bFrameIndex			//frame 编号
[26644.222092] 00       bmCapabilities
[26644.222093] 80       wWidth  0x0280=640
[26644.222093] 02       
[26644.222094] e0       wHeight 480
[26644.222094] 01       
[26644.222095] 30       dwMaxBitRate
[26644.222095] 28
[26644.222096] cc
[26644.222096] 08
[26644.222097] 30
[26644.222097] 28
[26644.222098] cc
[26644.222098] 08
[26644.222099] 4d
[26644.222099] 62
[26644.222100] 09
[26644.222100] 00
[26644.222101] 15
[26644.222101] 16
[26644.222102] 05
[26644.222102] 00
[26644.222103] 01
[26644.222103] 15
[26644.222104] 16
[26644.222104] 05
[26644.222105] 00

[26644.222106] extra desc 4:
[26644.222106] 1e
[26644.222107] 24
[26644.222107] 07      VS_FRAME_MJPEG		//具体的frame
[26644.222108] 03      bFrameIndex			//frame 编号
[26644.222108] 00      bmCapabilities
[26644.222109] 60      wWidth  352
[26644.222109] 01      
[26644.222110] 20      wHeight 288
[26644.222110] 01      
[26644.222111] 30      dwMaxBitRate
[26644.222111] a8
[26644.222112] e8
[26644.222112] 02
[26644.222113] 30
[26644.222113] a8
[26644.222114] e8
[26644.222114] 02
[26644.222115] 4d
[26644.222115] 1a
[26644.222116] 03
[26644.222116] 00
[26644.222117] 15
[26644.222117] 16
[26644.222118] 05
[26644.222118] 00
[26644.222119] 01
[26644.222119] 15
[26644.222120] 16
[26644.222120] 05
[26644.222121] 00

[26644.222122] extra desc 5:
[26644.222122] 1e
[26644.222123] 24
[26644.222123] 07          VS_FRAME_MJPEG		//具体的frame
[26644.222124] 04          bFrameIndex			//frame 编号
[26644.222124] 00          bmCapabilities
[26644.222125] 40          wWidth  
[26644.222125] 01          
[26644.222126] f0          wHeight 
[26644.222126] 00          
[26644.222127] 30          dwMaxBitRate
[26644.222127] a8
[26644.222128] 34
[26644.222128] 02
[26644.222129] 30
[26644.222129] a8
[26644.222130] 34
[26644.222130] 02
[26644.222131] 4d
[26644.222131] 5a
[26644.222132] 02
[26644.222132] 00
[26644.222133] 15
[26644.222133] 16
[26644.222134] 05
[26644.222134] 00
[26644.222135] 01
[26644.222135] 15
[26644.222136] 16
[26644.222136] 05
[26644.222137] 00

[26644.222138] extra desc 6:
[26644.222138] 1e
[26644.222139] 24
[26644.222139] 07          VS_FRAME_MJPEG		//具体的frame
[26644.222140] 05          bFrameIndex			//frame 编号
[26644.222140] 00          bmCapabilities
[26644.222141] b0          wWidth  
[26644.222141] 00          
[26644.222142] 90          wHeight 
[26644.222142] 00          
[26644.222143] 30          dwMaxBitRate
[26644.222143] c8
[26644.222144] bb
[26644.222144] 00
[26644.222145] 30
[26644.222145] c8
[26644.222146] bb
[26644.222146] 00
[26644.222147] 4d
[26644.222147] c8
[26644.222148] 00
[26644.222148] 00
[26644.222149] 15
[26644.222149] 16
[26644.222150] 05
[26644.222150] 00
[26644.222151] 01
[26644.222151] 15
[26644.222152] 16
[26644.222152] 05
[26644.222153] 00

[26644.222154] extra desc 7:
[26644.222154] 1e
[26644.222155] 24
[26644.222155] 07          VS_FRAME_MJPEG		//具体的frame
[26644.222156] 06          bFrameIndex			//frame 编号
[26644.222156] 00          bmCapabilities
[26644.222157] a0          wWidth  
[26644.222157] 00          
[26644.222158] 78          wHeight 
[26644.222158] 00          
[26644.222159] 30          dwMaxBitRate
[26644.222159] c8
[26644.222160] 8e
[26644.222160] 00
[26644.222161] 30
[26644.222161] c8
[26644.222162] 8e
[26644.222162] 00
[26644.222163] 4d
[26644.222163] 98
[26644.222164] 00
[26644.222164] 00
[26644.222165] 15
[26644.222165] 16
[26644.222166] 05
[26644.222166] 00
[26644.222167] 01
[26644.222167] 15
[26644.222168] 16
[26644.222168] 05
[26644.222169] 00

[26644.222170] extra desc 8:
[26644.222170] 1e
[26644.222171] 24
[26644.222171] 07          VS_FRAME_MJPEG		//具体的frame
[26644.222189] 07          bFrameIndex			//frame 编号
[26644.222191] 00          bmCapabilities
[26644.222191] 20          wWidth  
[26644.222192] 03          
[26644.222192] 58          wHeight 
[26644.222193] 02          
[26644.222193] 30          dwMaxBitRate
[26644.222194] c8
[26644.222194] bd
[26644.222195] 0d
[26644.222195] 30
[26644.222196] c8
[26644.222196] bd
[26644.222197] 0d
[26644.222197] 4d
[26644.222198] a8
[26644.222198] 0e
[26644.222199] 00
[26644.222199] 15
[26644.222200] 16
[26644.222200] 05
[26644.222201] 00
[26644.222201] 01
[26644.222202] 15
[26644.222202] 16
[26644.222203] 05
[26644.222203] 00

[26644.222204] extra desc 9:
[26644.222205] 1e
[26644.222205] 24
[26644.222206] 07           VS_FRAME_MJPEG		//具体的frame
[26644.222206] 08           bFrameIndex			//frame 编号
[26644.222207] 00           bmCapabilities
[26644.222207] c0           wWidth  
[26644.222208] 03           
[26644.222208] d0           wHeight 
[26644.222209] 02           
[26644.222209] 30           dwMaxBitRate
[26644.222210] a8
[26644.222210] c8
[26644.222211] 13
[26644.222211] 30
[26644.222212] a8
[26644.222212] c8
[26644.222213] 13
[26644.222213] 4d
[26644.222214] 1a
[26644.222214] 15
[26644.222215] 00
[26644.222215] 15
[26644.222216] 16
[26644.222216] 05
[26644.222217] 00
[26644.222217] 01
[26644.222218] 15
[26644.222218] 16
[26644.222219] 05
[26644.222219] 00

[26644.222220] extra desc 10:
[26644.222221] 26
[26644.222221] 24
[26644.222222] 03	VS_STILL_IMAGE_FRAME
[26644.222222] 00	bEndpointAddress
[26644.222223] 08	bNumImageSizePatterns   8个类型的大小
[26644.222223] 00	wWidth	---接下去是重复的1
[26644.222224] 05
[26644.222224] d0	wHeight
[26644.222225] 02
[26644.222225] c0	wWidth	---接下去是重复的2
[26644.222226] 03	
[26644.222226] d0	wHeight
[26644.222227] 02   
[26644.222227] 20   wWidth	---接下去是重复的3
[26644.222228] 03   
[26644.222228] 58   wHeight
[26644.222229] 02   
[26644.222229] 80	wWidth	---接下去是重复的4
[26644.222230] 02   
[26644.222230] e0   wHeight
[26644.222231] 01   
[26644.222231] 60   wWidth	---接下去是重复的5
[26644.222232] 01   
[26644.222232] 20	wHeight
[26644.222233] 01   
[26644.222234] 40   wWidth	---接下去是重复的6
[26644.222234] 01   
[26644.222235] f0   wHeight
[26644.222235] 00   
[26644.222236] b0	wWidth	---接下去是重复的7
[26644.222236] 00   
[26644.222237] 90   wHeight
[26644.222237] 00   
[26644.222238] a0   wWidth	---接下去是重复的8
[26644.222238] 00   
[26644.222239] 78   wHeight
[26644.222239] 00	bNumCompressionPattern 0
[26644.222240] 00	bCompression 0

[26644.222240] extra desc 11:
[26644.222241] 1b
[26644.222241] 24
[26644.222242] 04	VS_FORMAT_UNCOMPRESSED //未压缩的视频,这里需要去搜索另外的文档 Uncompressed Payload
[26644.222242] 02	bFormatIndex	//第二种格式
[26644.222243] 08	bNumFrameDescriptors//有8种fram
[26644.222243] 59	guidFormat(16)
[26644.222244] 55   
[26644.222244] 59
[26644.222245] 32
[26644.222246] 00
[26644.222246] 00
[26644.222247] 10
[26644.222247] 00
[26644.222248] 80
[26644.222248] 00
[26644.222249] 00
[26644.222249] aa
[26644.222250] 00
[26644.222250] 38
[26644.222251] 9b
[26644.222251] 71 
[26644.222252] 10	bBitsPerPixel
[26644.222252] 01	bDefaultFrameIndex
[26644.222253] 00	bAspectRatioX
[26644.222253] 00	bAspectRatioY
[26644.222254] 00	bmInterlaceFlags
[26644.222254] 00	bCopyProtect

[26644.222255] extra desc 12:
[26644.222255] 1e
[26644.222256] 24
[26644.222256] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222257] 01	bFrameIndex				//id
[26644.222257] 00	bmCapabilities
[26644.222258] 00	wWidth
[26644.222258] 05
[26644.222259] d0	wHeight
[26644.222259] 02
[26644.222260] 00	dwMinBitRate
[26644.222260] 00
[26644.222261] ca
[26644.222261] 08
[26644.222262] 00	dwMaxBitRate
[26644.222262] 00
[26644.222263] ca
[26644.222263] 08
[26644.222264] 00	dwMaxVideoFrameBufferSize
[26644.222264] 20
[26644.222265] 1c
[26644.222265] 00
[26644.222266] 40	dwDefaultFrameInterval
[26644.222267] 42	bFrameIntervalType
[26644.222267] 0f
[26644.222267] 00
[26644.222268] 01
[26644.222268] 40
[26644.222269] 42
[26644.222269] 0f
[26644.222270] 00

[26644.222271] extra desc 13:
[26644.222271] 1e
[26644.222272] 24
[26644.222272] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222273] 02	bFrameIndex				//id
[26644.222273] 00
[26644.222274] 80
[26644.222274] 02
[26644.222275] e0
[26644.222275] 01
[26644.222276] 00
[26644.222276] 00
[26644.222277] ca
[26644.222277] 08
[26644.222278] 00
[26644.222278] 00
[26644.222279] ca
[26644.222279] 08
[26644.222280] 00
[26644.222280] 60
[26644.222281] 09
[26644.222281] 00
[26644.222282] 15
[26644.222282] 16
[26644.222283] 05
[26644.222283] 00
[26644.222284] 01
[26644.222284] 15
[26644.222285] 16
[26644.222285] 05
[26644.222286] 00

[26644.222287] extra desc 14:
[26644.222287] 1e
[26644.222288] 24
[26644.222288] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222289] 03   bFrameIndex				//id
[26644.222289] 00
[26644.222290] 60
[26644.222290] 01
[26644.222291] 20
[26644.222291] 01
[26644.222309] 00
[26644.222310] 80
[26644.222311] e6
[26644.222311] 02
[26644.222312] 00
[26644.222312] 80
[26644.222313] e6
[26644.222313] 02
[26644.222314] 00
[26644.222314] 18
[26644.222315] 03
[26644.222315] 00
[26644.222316] 15
[26644.222316] 16
[26644.222317] 05
[26644.222317] 00
[26644.222318] 01
[26644.222319] 15
[26644.222319] 16
[26644.222320] 05
[26644.222320] 00

[26644.222321] extra desc 15:
[26644.222322] 1e
[26644.222322] 24
[26644.222323] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222323] 04   bFrameIndex				//id
[26644.222324] 00
[26644.222324] 40
[26644.222325] 01
[26644.222325] f0
[26644.222326] 00
[26644.222326] 00
[26644.222327] 80
[26644.222327] 32
[26644.222328] 02
[26644.222328] 00
[26644.222329] 80
[26644.222329] 32
[26644.222330] 02
[26644.222330] 00
[26644.222331] 58
[26644.222331] 02
[26644.222332] 00
[26644.222332] 15
[26644.222333] 16
[26644.222333] 05
[26644.222334] 00
[26644.222334] 01
[26644.222335] 15
[26644.222335] 16
[26644.222336] 05
[26644.222336] 00

[26644.222337] extra desc 16:
[26644.222338] 1e
[26644.222338] 24
[26644.222339] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222339] 05   bFrameIndex				//id
[26644.222340] 00
[26644.222340] b0
[26644.222341] 00
[26644.222341] 90
[26644.222342] 00
[26644.222342] 00
[26644.222343] a0
[26644.222343] b9
[26644.222344] 00
[26644.222344] 00
[26644.222345] a0
[26644.222345] b9
[26644.222346] 00
[26644.222346] 00
[26644.222347] c6
[26644.222347] 00
[26644.222348] 00
[26644.222348] 15
[26644.222349] 16
[26644.222349] 05
[26644.222350] 00
[26644.222350] 01
[26644.222351] 15
[26644.222351] 16
[26644.222352] 05
[26644.222352] 00

[26644.222353] extra desc 17:
[26644.222354] 1e
[26644.222354] 24
[26644.222355] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222355] 06   bFrameIndex				//id
[26644.222356] 00
[26644.222356] a0
[26644.222357] 00
[26644.222357] 78
[26644.222358] 00
[26644.222358] 00
[26644.222359] a0
[26644.222359] 8c
[26644.222360] 00
[26644.222360] 00
[26644.222361] a0
[26644.222361] 8c
[26644.222362] 00
[26644.222362] 00
[26644.222363] 96
[26644.222363] 00
[26644.222364] 00
[26644.222364] 15
[26644.222365] 16
[26644.222365] 05
[26644.222366] 00
[26644.222366] 01
[26644.222367] 15
[26644.222367] 16
[26644.222368] 05
[26644.222368] 00

[26644.222369] extra desc 18:
[26644.222370] 1e
[26644.222370] 24
[26644.222371] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222371] 07   bFrameIndex				//id
[26644.222372] 00
[26644.222372] 20
[26644.222373] 03
[26644.222373] 58
[26644.222374] 02
[26644.222374] 00
[26644.222375] c0
[26644.222375] 27
[26644.222376] 09
[26644.222376] 00
[26644.222377] c0
[26644.222377] 27
[26644.222378] 09
[26644.222378] 00
[26644.222379] a6
[26644.222379] 0e
[26644.222380] 00
[26644.222380] 20
[26644.222381] a1
[26644.222381] 07
[26644.222382] 00
[26644.222382] 01
[26644.222383] 20
[26644.222383] a1
[26644.222384] 07
[26644.222384] 00

[26644.222385] extra desc 19:
[26644.222386] 1e
[26644.222386] 24
[26644.222387] 05	VS_FRAME_UNCOMPRESSED  //具体的fram格式
[26644.222387] 08   bFrameIndex				//id
[26644.222388] 00
[26644.222388] c0
[26644.222389] 03
[26644.222389] d0
[26644.222390] 02
[26644.222390] 00
[26644.222391] 40
[26644.222391] e3
[26644.222392] 09
[26644.222392] 00
[26644.222393] 40
[26644.222393] e3
[26644.222394] 09
[26644.222394] 00
[26644.222395] 18
[26644.222395] 15
[26644.222396] 00
[26644.222396] 2a
[26644.222397] 2c
[26644.222397] 0a
[26644.222398] 00
[26644.222398] 01
[26644.222399] 2a
[26644.222399] 2c
[26644.222400] 0a
[26644.222400] 00

[26644.222401] extra desc 20:
[26644.222402] 26
[26644.222402] 24
[26644.222403] 03	VS_STILL_IMAGE_FRAME
[26644.222403] 00
[26644.222404] 08	//8种类型的尺寸
[26644.222404] 00
[26644.222405] 05
[26644.222405] d0
[26644.222406] 02
[26644.222406] c0
[26644.222407] 03
[26644.222407] d0
[26644.222408] 02
[26644.222408] 20
[26644.222409] 03
[26644.222409] 58
[26644.222410] 02
[26644.222410] 80
[26644.222411] 02
[26644.222411] e0
[26644.222412] 01
[26644.222412] 60
[26644.222413] 01
[26644.222413] 20
[26644.222414] 01
[26644.222414] 40
[26644.222415] 01
[26644.222415] f0
[26644.222416] 00
[26644.222416] b0
[26644.222417] 00
[26644.222417] 90
[26644.222418] 00
[26644.222418] a0
[26644.222419] 00
[26644.222419] 78
[26644.222420] 00
[26644.222420] 00

[26644.222421] extra desc 21:
[26644.222422] 06
[26644.222422] 24
[26644.222423] 0d	VS_COLORFORMAT
[26644.222423] 01	bColorPrimaries
[26644.222424] 01	bTransferCharacteristics
[26644.222424] 04	bMatrixCoefficients

代码解析额外的描述符

参考lsusb的开源代码

lsusb.C
    dump_altsetting 
        switch (buf[1]
            case USB_DT_CS_INTERFACE:
                case USB_CLASS_VIDEO:
                    switch (interface->bInterfaceSubClass) {
                    case 1:
                        dump_videocontrol_interface(dev, buf);//vc解析
                        break;
                    case 2:
                        dump_videostreaming_interface(buf);//vs解析
                        break;
                    default:
                        goto dump;
                    }
                    break;

打印端点描述符

参考
lsusb.c
  dump_altsetting
        for (i = 0 ; i < interface->bNumEndpoints ; i++)
            dump_endpoint(dev, interface, &interface->endpoint[i]);

源码如下

//接口下的设置
for (j = 0; j < intf->num_altsetting; j++)
{
	/* 打印端点描述符 */
	for (m = 0; m < interface->bNumEndpoints; m++)
	{
		// 某个接口下的某个设置下的第m个端点
		endpoint = &intf->altsetting[j].endpoint[m].desc;
		dump_endpoint(endpoint);
	}
}

分析

这里的dmesg信息过多,显示不下了,使用dmesg >dmesg.txt来保存查看,搜索下Endpoint可以看到好几个

[38736.519001]       Endpoint Descriptor:
                       bLength                 7
                       bDescriptorType         5
                       bEndpointAddress     0x83  EP 3 IN
                       bmAttributes            3
                         Transfer Type            Interrupt
                         Synch Type               None
                         Usage Type               Data
                       wMaxPacketSize     0x0010  1x 16 bytes
                       bInterval               6
                           
                           .....
posted @ 2019-04-24 18:37  zongzi10010  阅读(2307)  评论(0编辑  收藏  举报