USB·

USB描述符

Hugh

Hugh

142 0

USB 描述符文件分析

该文件定义了一个 USB 设备的描述符数组 cmsisdap_descriptor,用于描述 USB 设备的各种属性和配置。下面将详细分析这个描述符数组。

整体结构

USB 描述符是一种数据结构,用于向 USB 主机描述设备的特性和功能。描述符通常由多个部分组成,每个部分都有特定的用途。这个描述符数组包含了设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符和设备限定符等。

详细分析

1. 设备描述符(Device Descriptor)

0x12,       /* bLength */
0x01,       /* bDescriptorType */
0x10, 0x02, /* bcdUSB */
0xEF,       /* bDeviceClass */
0x02,       /* bDeviceSubClass */
0x01,       /* bDeviceProtocol */
0x40,       /* bMaxPacketSize */
0x28, 0x0D, /* idVendor */
0x04, 0x02, /* idProduct */
0x00, 0x01, /* bcdDevice */
0x01,       /* iManufacturer */
0x02,       /* iProduct */
0x03,       /* iSerial */
0x01,       /* bNumConfigurations */
  • bLength:描述符的长度,这里是 0x12(十进制 18)字节。
  • bDescriptorType:描述符类型,0x01 表示设备描述符。
  • bcdUSB:USB 规范版本号,0x0210 表示 USB 2.1 版本。
  • bDeviceClass:设备类代码,0xEF 表示特殊类。
  • bDeviceSubClass:设备子类代码,0x02。
  • bDeviceProtocol:设备协议代码,0x01。
  • bMaxPacketSize:端点 0 的最大包大小,0x40(十进制 64)字节。
  • idVendor:厂商 ID,0x0D28。
  • idProduct:产品 ID,0x0204。
  • bcdDevice:设备版本号,0x0100。
  • iManufacturer:厂商字符串描述符的索引,0x01。
  • iProduct:产品字符串描述符的索引,0x02。
  • iSerial:序列号字符串描述符的索引,0x03。
  • bNumConfigurations:设备支持的配置数量,0x01。

2. 配置描述符(Configuration Descriptor)

0x09,       /* bLength */
0x02,       /* bDescriptorType */
0x00, 0x62, /* wTotalLength */
0x03,       /* bNumInterfaces */
0x01,       /* bConfigurationValue */
0x00,       /* iConfiguration */
0x80,       /* bmAttributes */
0xFA,       /* bMaxPower */
  • bLength:描述符的长度,0x09(十进制 9)字节。
  • bDescriptorType:描述符类型,0x02 表示配置描述符。
  • wTotalLength:该配置下所有描述符的总长度,0x0062(十进制 98)字节。
  • bNumInterfaces:该配置下的接口数量,0x03。
  • bConfigurationValue:该配置的编号,0x01。
  • iConfiguration:配置字符串描述符的索引,0x00。
  • bmAttributes:配置属性,0x80 表示自供电。
  • bMaxPower:设备在该配置下的最大功耗,0xFA 表示 500mA。

3. 接口描述符(Interface Descriptor)和端点描述符(Endpoint Descriptor)

接下来是三个接口描述符和对应的端点描述符,这里以第一个接口为例:

/* Interface 0 */
0x09, /* bLength */
0x04, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x02, /* bNumEndpoints */
0xFF, /* bInterfaceClass */
0x00, /* bInterfaceSubClass */
0x00, /* bInterfaceProtocol */
0x02, /* iInterface */

/* Endpoint OUT 2 */
0x07,       /* bLength */
0x05,       /* bDescriptorType */
0x01,       /* bEndpointAddress */
0x02,       /* bmAttributes */
0x00, 0x02, /* wMaxPacketSize */
0x00,       /* bInterval */

/* Endpoint IN 1 */
0x07,       /* bLength */
0x05,       /* bDescriptorType */
0x81,       /* bEndpointAddress */
0x02,       /* bmAttributes */
0x00, 0x02, /* wMaxPacketSize */
0x00,       /* bInterval */

接口描述符

  • bLength:描述符的长度,0x09(十进制 9)字节。
  • bDescriptorType:描述符类型,0x04 表示接口描述符。
  • bInterfaceNumber:接口编号,0x00。
  • bAlternateSetting:备用设置编号,0x00。
  • bNumEndpoints:该接口使用的端点数量,0x02。
  • bInterfaceClass:接口类代码,0xFF 表示厂商自定义类。
  • bInterfaceSubClass:接口子类代码,0x00。
  • bInterfaceProtocol:接口协议代码,0x00。
  • iInterface:接口字符串描述符的索引,0x02。

端点描述符

  • bLength:描述符的长度,0x07(十进制 7)字节。
  • bDescriptorType:描述符类型,0x05 表示端点描述符。
  • bEndpointAddress:端点地址,0x01 表示输出端点,0x81 表示输入端点。
  • bmAttributes:端点属性,0x02 表示批量传输。
  • wMaxPacketSize:端点的最大包大小,0x0002(十进制 2)字节。
  • bInterval:端点的轮询间隔,0x00。

4. 接口关联描述符(Interface Association Descriptor)

0x08,       /* bLength */
0x0B,       /* bDescriptorType */
0x01,       /* bFirstInterface */
0x02,       /* bInterfaceCount */
0x02,       /* bFunctionClass */
0x02,       /* bFunctionSubClass */
0x01,       /* bFunctionProtocol */
0x00,       /* iFunction */
  • bLength:描述符的长度,0x08(十进制 8)字节。
  • bDescriptorType:描述符类型,0x0B 表示接口关联描述符。
  • bFirstInterface:第一个关联接口的编号,0x01。
  • bInterfaceCount:关联的接口数量,0x02。
  • bFunctionClass:功能类代码,0x02。
  • bFunctionSubClass:功能子类代码,0x02。
  • bFunctionProtocol:功能协议代码,0x01。
  • iFunction:功能字符串描述符的索引,0x00。

5. CDC(通信设备类)描述符

接下来是一系列 CDC 相关的描述符,用于描述设备的通信功能。

6. 字符串描述符(String Descriptor)

/* String 0 (LANGID) */
0x04,       /* bLength */
0x03,       /* bDescriptorType */
0x09, 0x04, /* wLangID0 */

/* String 1 (Manufacturer) */
0x14,      /* bLength */
0x03,      /* bDescriptorType */
'C', 0x00, /* wcChar0 */
'h', 0x00, /* wcChar1 */
'e', 0x00, /* wcChar2 */
'r', 0x00, /* wcChar3 */
'r', 0x00, /* wcChar4 */
'y', 0x00, /* wcChar5 */
'U', 0x00, /* wcChar6 */
'S', 0x00, /* wcChar7 */
'B', 0x00, /* wcChar8 */

/* String 2 (Product) */
0x28,      // bLength
0x03,      // bDescriptorType
'C', 0x00, // wcChar0
'h', 0x00, // wcChar1
'e', 0x00, // wcChar2
'r', 0x00, // wcChar3
'r', 0x00, // wcChar4
'y', 0x00, // wcChar5
'U', 0x00, // wcChar6
'S', 0x00, // wcChar7
'B', 0x00, // wcChar8
' ', 0x00, // wcChar9
'C', 0x00, // wcChar10
'M', 0x00, // wcChar11
'S', 0x00, // wcChar12
'I', 0x00, // wcChar13
'S', 0x00, // wcChar14
'-', 0x00, // wcChar15
'D', 0x00, // wcChar16
'A', 0x00, // wcChar17
'P', 0x00, // wcChar18

/* String 3 (Serial Number) */
0x1A,   // bLength
0x03,   // bDescriptorType
'0', 0, // wcChar0
'1', 0, // wcChar1
'2', 0, // wcChar2
'3', 0, // wcChar3
'4', 0, // wcChar4
'5', 0, // wcChar5
'A', 0, // wcChar6
'B', 0, // wcChar7
'C', 0, // wcChar8
'D', 0, // wcChar9
'E', 0, // wcChar10
'F', 0, // wcChar11
  • 字符串描述符用于提供设备的可读信息,如厂商名称、产品名称和序列号等。
  • bLength:描述符的长度。
  • bDescriptorType:描述符类型,0x03 表示字符串描述符。
  • wLangID0:语言 ID,0x0409 表示英语(美国)。

7. 设备限定符(Device Qualifier)

0x0a,
0x06,
0x10,
0x02,
0x00,
0x00,
0x00,
0x40,
0x01,
0x00,
  • 设备限定符用于描述设备在不同速度下的特性。
  • bLength:描述符的长度,0x0A(十进制 10)字节。
  • bDescriptorType:描述符类型,0x06 表示设备限定符。

8. 结束标志

0x00

表示描述符数组的结束。

总结

这个描述符数组定义了一个 USB 设备的完整信息,包括设备的基本属性、配置、接口、端点、字符串和限定符等。这些信息将被 USB 主机用于识别和配置设备。

所属系列

从当前文章继续阅读它所在合集中的前后内容。

零基础入门USB 第 4 / 9 篇
查看合集

本作品集介绍USB基础知识,解析USB通信协议,学习USB工作原理,制作USB设备,编写USB上位机软件。

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人