USB 设备第一次连接到主机时, 要接收主机枚举( Enumera tion) 和配置(Configuration) , 目的是让主机知道设备功能、是哪一类的USB 设备、占用多少资源、使用了哪些传输方式以及传输的数据量等等。只有主机完全确认了这些信息后, 设备才能真正开始工作。这些信息是通过存储在设备中的USB 描述符来体现的。因此, 这种USB 描述符也可以看作是USB 设备的身份证明。
capter9.6
描述符(Descriptor )
描述符(Descriptor )是一个完整的数据结构, 存储在USB 设备中, 用于描述一个USB 设备的所有属性。USB主机通过一系列命令要求设备发送这些信息。
USB 设备的属性包括很多内容, 为了便于管理, USB2.0协议将这些信息做了分类, 定义了多种描述符,包括标准和HID类的描述符,下面是标准描述符描述。
标准描述符
标准描述符 | bDescriptorType字段 |
---|---|
设备描述符(Device Descriptor) | 0x01 |
配置描述符(Configuration Descriptor) | 0x02 |
字符串描述符(String Descriptor,可选) | 0x03 |
接口描述符(Interface Descriptor) | 0x04 |
端点描述符(Endpoint Descriptor) | 0x05 |
设备限定描述符(DEVICE_QUALIFIER) | 0x06 |
其他速率配置描述符(OTHER_SPEED_CONFIGURATION) | 0x07 |
接口功率描述符(INTERFACE_POWER) | 0x08 |
描述符间的关系
一个设备有且只能有一个设备描述符,之后的描述符都允许有多个不同的描述符。
字段格式
每个描述符都是由一系列字段( Field , 为了与组成包的域相区别, 这里叫做字段) 所组成的,每个字段开头小写字母表示了该字段使用的数据格式,
首位小写字母 | 意义 |
---|---|
b。。 | 1 字节Byte |
w。。 | 16 位的2 字节二进制(Word ) |
bm。。 | 位图(Bit Map ) |
bcd。。 | BCD 码 |
i。。 | 索引( Index) |
id。。 | 标识( Identifier ) |
标准描述符
设备描述符(Device Descriptor) |
- 每一个设备有且只有一个设备描述符
- 默认控制管道的数据包的长度( 端点0长度)是在设备描述符中定义, 而不像其他端点在端点描述符中定义。
- 14 个字段,18 Byte
偏移量 | 字段名称 | 长度(Byte) | 字段值 | 意义 |
---|---|---|---|---|
0 | bLength | 1 | 0x12 | 设备描述符的字节数大小 |
1 | bDescriptorType | 1 | 0x01 | 设备描述符类型编号 |
2 | bcdUSB | 2 | 协议版本2.31其值就是0x0231 | USB版本号 |
4 | bDeviceClass | 1 | 类 | USB分配设备类代码(1-FE)FF为厂商自定义 |
5 | bDeviceSubClass | 1 | 子类 | USB分配子类代码 |
6 | bDeviceProtocol | 2 |