1、USB描述符
USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符。USB设备通过这些描述符向USB主机汇报设备的各种各样属性,主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程序。USB描述符是由特定格式排列的一组数据结构组成。USB描述符包含标准描述符、类描述符和厂商特定描述3种形式。标准描述符包括设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(InterfaceDescriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。类描述符包括集线器类描述符(HubDescriptor)和人机接口类描述符(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 |
|
类描述符 |
集线器类描述符(Hub Descriptor) |
0x29 |
人机接口类描述符(HID) |
0x21 |
|
厂商定义的描述符 |
|
0xFF |
每个USB设备只有一个设备描述符,而一个设备中可包含一个或多个配置描述符,即USB设备可以有多种配置。设备的每一个配置中又可以包含一个或多个接口描述符,即USB设备可以支持多种功能(接口),接口的特性通过描述符提供。
在USB主机访问USB设备的描述符时,USB设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备描述符、配置描述符和接口描述符,如果USB设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。
在USB设备枚举过程中,主机端的协议软件需要解析从USB设备读取的所有描述符信息。在USB主向设备发送读取描述符的请求后,USB设备将所有的描述符以连续的数据流方式传输给USB主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺序地解析读到的数据流。
1.1 设备描述符
设备描述符具有18字节的长度,是主机向设备请求的第一个描述符。
USB设备描述符的结构 |
|||
偏移量 |
域 |
大小 |
描述 |
0 |
bLength |
1 |
设备描述符的字节数大小 |
1 |
bDescriptorType |
1 |
描述符类型,设备描述符为0x01 |
2 |
bcdUSB |
2 |
USB版本号 |
4 |
bDeviceClass |
1 |
USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型 |
5 |
bDeviceSubClass |
1 |
USB分配的子类代码 |
6 |
bDeviceProtocol |
1 |
USB分配的设备协议代码 |
7 |
bMaxPacketSize0 |
1 |
端点0的最大信息包大小 |
8 |
idVendor |
2 |
制造商ID |
10 |
idProduct |
2 |
产品ID |
12 |
bcdDevice |
2 |