分享

 Usb摄像头描述符解析

 waston 2021-12-07

Usb摄像头描述符解析

总结#

mark

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

Copy
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

打印设备描述符#

Copy
#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");

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

Copy
sudo rmmod uvcvideo sudo rmmod myuvc sudo insmod myuvc.ko dmesg
Copy
[ 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循环将它打印。

Copy
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个配置描述符,打印如下

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

打印接口联合体描述符#

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

mark

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

mark

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

修改代码如下

Copy
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; }

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

Copy
[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

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

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

而是应该

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

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

Copy
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 */ };

测试代码如下

Copy
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); }

打印如下

Copy
-------------------------设备描述符-------------------------------------- [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

Copy
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的总长度,其次每个描述符的第一个字节都是长度,所以依次取出这个长度然后打印

Copy
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入手,依次读取 其中

Copy
CS_INTERFACE 0x24

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

mark

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

Copy
IT>PU>EU(扩展单元,厂家自定义)>OT
Copy
[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

具体的分析如下

Copy
[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的开源代码

Copy
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;

打印端点描述符#

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

源码如下

Copy
//接口下的设置 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可以看到好几个

Copy
[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 .....

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多