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

时间:2022-10-01 07:17:42

title: Usb摄像头描述符解析

date: 2019/4/23 20:00:00

toc: true

Usb摄像头描述符解析

总结

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

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

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

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

打印配置描述符

在设备描述符里, __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,这里这个接口联合体描述符就会告诉我们这些

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

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

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

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

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

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

测试代码如下,这里首先获取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

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

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

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

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(分辨率)

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

具体的分析如下

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