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
登录 后参与评论
评论
成为第一个评论的人