USB-设备描述符(一)

 USB 鼠标详解阅读顺序

1、枚举

2、设备描述符

3、设置地址

4、配置描述符

5、接口描述符

6、HID 描述符

7、端点描述符

8、字符串描述符

9、HID 报告描述符

10、HID 报告的返回

USB-设备描述符(一)_第1张图片

USB-设备描述符(一)_第2张图片

linux 内核中对设备描述符的定义如下

/* USB_DT_DEVICE: Device descriptor */
struct usb_device_descriptor {
	__u8  bLength;
	__u8  bDescriptorType;

	__le16 bcdUSB;
	__u8  bDeviceClass;
	__u8  bDeviceSubClass;
	__u8  bDeviceProtocol;
	__u8  bMaxPacketSize0;
	__le16 idVendor;
	__le16 idProduct;
	__le16 bcdDevice;
	__u8  iManufacturer;
	__u8  iProduct;
	__u8  iSerialNumber;
	__u8  bNumConfigurations;
} __attribute__ ((packed));

目录:linux/include/uapi/linux/usb/ch9.h

各个位的含义

bLength:表示该描述符的长度。设备描述符的长度为 18 字节,写成十六进制就是 0x12

bDescriptorType:描述符类型。设备描述符的编号为 0x01

bcdUSB:2 字节,该设备所使用的 USB 协议的版本。如 USB2.0 就是 0x0200,USB1.1就是 0x0110。实际传输的时候是低字节在前的

bDeviceClass:是设备所使用的类代码

bDeviceSubClass:是设备所使用子类代码

bDeviceProtocol:是设备所使用的协议,协议代码由 USB 协会规定。

bMaxPacketSize0:端点 0 的最大包长。它的取值可以是 8 16 32 64

idVender:2 字节,厂商 ID

idProduct:2 字节,产品 ID

bcdDevice:2 字节,设备的版本号

iManufacturer:描述厂商的字符串的索引值

iProduct:描述产品的字符串索引值

iSerialNumber:设备的序列号字符串索引值

bNumberConfigurations:表示该设备有多少种配置

当主机检测到有 USB 设备插入时,首先会对设备进行复位,然后会获取设备描述符

例如一个 USB 复位和获取设备描述符的过程如下所示

USB-设备描述符(一)_第3张图片

//设备描述符为18字节
    {
        //bLength字段。设备描述符的长度为18(0x12)字节
        0x12,

        //bDescriptorType字段。设备描述符的编号为0x01
        0x01,

        //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
        //由于是小端结构,所以低字节在先,即0x10,0x01。
        0x10,
        0x01,

        //bDeviceClass字段。我们不在设备描述符中定义设备类,
        //而在接口描述符中定义设备类,所以该字段的值为0。
        0x00,

        //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
        0x00,

        //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
        0x00,

        //bMaxPacketSize0字段。 的端点0大小的8字节。
        0x08,

        //idVender字段。
        //注意小端模式,低字节在先。
        0x5D,
        0x27,

        //idProduct字段。产品ID号。
        //注意小端模式,低字节应该在前。
        0xA6,
        0x0B,

        //bcdDevice字段。
        //小端模式,低字节在先。
        0x00,
        0x01,

        //iManufacturer字段。厂商字符串的索引
        0x00,

        //iProduct字段。产品字符串的索引值。
        //注意字符串索引值不要使用相同的值。
        0x01,

        //iSerialNumber字段。设备的序列号字符串索引值。
        0x00,

        //bNumConfigurations字段。该设备所具有的配置数。
        0x01
    }

 

你可能感兴趣的:(USB)