HID设备支持USB标准描述符中的五个:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。除此之外,HID设备还有三种特殊的描述符:HID描述符、报告描述符、物理描述符。一个USB设备只能支持一个HID描述符,但可以支持多个报告描述符,而物理描述符则可以有也可以没有。
1、设备描述符
一个USB设备只有一个设备描述符。设备描述符主要记录的信息有:设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。
偏移量 |
Demo值 |
域 |
大小/字节 |
说明 |
0 |
0x12 |
bLength |
1 |
该描述符的长度(0x12=18字节) |
1 |
0x01 |
bDescriptorType |
1 |
描述符类型(0x01设备描述符) |
2 |
0x00,0x02 |
bcdUSB |
2 |
本设备使用的USB协议版本 |
4 |
0x00 |
bDeviceClass |
1 |
类代码 |
5 |
0x00 |
bDeviceSubClass |
1 |
子类代码 |
6 |
0x00 |
bDeviceProtocol |
1 |
协议码 |
7 |
0x40 |
bMaxPacketSize |
1 |
端点0最大包长 |
8 |
0x0483 |
idVendor |
2 |
厂商ID |
10 |
0x5750 |
idProduct |
2 |
产品ID |
12 |
0x00,0x02 |
bcdDevice |
2 |
设备版本号 |
14 |
0x01 |
iManufacturer |
1 |
描述厂商的字符串索引 |
15 |
0x02 |
iProduct |
1 |
描述产品的字符串索引 |
16 |
0x03 |
iSerialNumber |
1 |
产品序列号的字符串索引 |
17 |
0x01 |
bNumConfigurations |
1 |
可能的配置数 |
2、配置描述符
设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符。配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。
偏移量 |
Demo值 |
域 |
大小 |
说明 |
0 |
0x09 |
bLength |
1 |
该描述符的长度(0x09字节) |
1 |
0x02 |
bDescriptorType |
1 |
描述符类型(0x02配置描述符) |
2 |
0x29,0x00 |
wTotalLength |
2 |
配置、接口、端点和类描述符字节总和 |
4 |
0x01 |
bNumInterfaces |
1 |
支持接口数 |
5 |
0x01 |
bConfigurationValue |
1 |
本配置描述符标识 |
6 |
0x00 |
iConfiguration |
1 |
配置描述符说明字符串索引 |
7 |
0xC0 |
bmAttributes |
1 |
电源及唤醒 |
8 |
0x32 |
MaxPower |
1 |
设备耗电电流 |
3、接口描述符
在每个配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符。接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。
偏移量 |
Demo值 |
域 |
大小/字节 |
说明 |
0 |
0x09 |
bLength |
1 |
该描述符的长度(0x09字节) |
1 |
0x04 |
bDescriptorType |
1 |
描述符类型(0x04接口描述符) |
2 |
0x00 |
bInterfaceNumber |
1 |
本接口描述符标识 |
3 |
0x00 |
bAlternateSetting |
1 |
可改变的设置 |
4 |
0x02 |
bNumEndpoints |
1 |
接口端点数 |
5 |
0x03 |
bInterfaceClass |
1 |
接口类代码(0x03 HID) |
6 |
0x00 |
bInterfaceSubClass |
1 |
启动类型1=BOOT, 0=No BOOT |
7 |
0x00 |
bInterfaceProtocol |
1 |
0=None, 1=Keyboard, 2=Mouse |
8 |
0x00 |
iInterface |
1 |
接口描述符说明字符串索引 |
4、类描述符
该描述符不是必须的,如果配置的USB类型有类特殊描述符(如HID类),它跟在相应的接口描述符之后。具体数值参见HID类描述符。
5、端点描述符
在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符。端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。
偏移量 |
Demo EP1 |
Demo EP2 |
域 |
字节 |
说明 |
0 |
0x07 |
0x07 |
bLength |
1 |
该描述符的长度(0x07字节) |
1 |
0x05 |
0x05 |
bDescriptorType |
1 |
描述符类型(0x5端点描述符) |
2 |
0x81 |
0x01 |
bEndpointAddress |
1 |
端点地址 |
3 |
0x03 |
0x03 |
bmAttributes |
1 |
端点类型(0x03 中断端点) |
4 |
0x40,0x00 |
0x40,0x00 |
wMaxPacketSize |
2 |
端点发送接收最大包长 |
6 |
0x05 |
0x05 |
bInterval |
1 |
中断端点轮训时间间隔 |
6、字符串描述符
字符串描述符主要是提供一些方便人们阅读的信息,它不是必需的。
偏移量 |
Demo值 |
域 |
大小/字节 |
说明 |
0 |
0x04 |
bLength |
1 |
该描述符的长度(0x04/0xXX字节),第一个字符串描述符0x04 |
1 |
0x03 |
bDescriptorType |
1 |
描述符类型(0x3字符串描述符) |
2 |
1033 |
wLANGID |
2/XX |
第一个字符串描述符时2字节,表示语言编码,其他自定义 |
为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。
HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。详情参看《USB HID协议中文版_USB HID 设备》
1、 HID类描述符
HID描述符是HID类特有的描述符,保证设备正确识别,遵循规定的格式。
偏移量 |
Demo值 |
域 |
大小/字节 |
说明 |
0 |
0x09 |
bLength |
1 |
该描述符的长度(0x09字节) |
1 |
0x21 |
bDescriptorType |
1 |
描述符类型(0x21 HID类) |
2 |
0x11,0x01 |
bcdHID |
2 |
HID规范版本 |
4 |
0x00 |
bCountryCode |
1 |
国家代码 |
5 |
0x01 |
bNumDescriptors |
1 |
支持的描述符个数 |
6 |
0x22 |
bDescriptorType |
1 |
支持的描述类型(0x22是报表) |
7 |
0x34,0x00 |
wDescriptorLength |
2 |
Report描述符长度 |
2、 报告描述符
报告描述符比较复杂,它是以item形式排列组合而成,无固定长度。为了准确描述来自主机的数据,一个报告描述符必须包括以下内容:
偏移量 |
域 |
大小/字节 |
说明 |
0 |
USAGE_PAGE |
2 |
|
2 |
USAGE |
2 |
|
4 |
COLLECTION |
2 |
|
|
|
|
|
6 |
USAGE ID |
2 |
|
8 |
LOGICAL_MINIMUM |
2 |
|
10 |
LOGICAL_MAXIMUM |
3 |
|
13 |
REPORT_SIZE |
2 |
|
15 |
REPORT_COUNT |
2 |
|
17 |
INPUT/OUTPUT |
2 |
|
|
…上述重复 |
|
|
|
|
|
|
XX |
END_COLLECTION |
|
|
报表描述符是报表描述项目(Item)的集合,每一个描述项目都有相对统一的数据结构,项目很多,通过编码实现项目的第一个字节(项目前缀)由三部分构成,即项目类型(itemtype)、 项目标签(itemtag)和项目长度(itemsize),其中短项目的格式如下图:
其中bTag占4个位,其余二者各占2个位。短项目的数据字节数由 bSize 的值定义, bSize 为0、 1、 2、 3 时 Data 部分的字节数分别为0、 1、 2、 4 个字节。短项目的项目类型由 bType 定义, bType 为 0、 1、 2 时分别为 Main、 Global和 Local 类型。
bTag于下表中描述,例如Input 的标签代码『0x8?』中8 即bTag=8,再如标签Feature 之bTag=11,而Unit之bTag=6。Main Item的bType=0,Global Item的bType=1,而Local Item 的bType= 2。Main Item卷标代码中的『?』可以改为『00nnB』,Global Item的可以改为『01nnB』,而Local Item的可以改为『10nnB』,其中nn 代表bSize。
Main Item |
Global Item |
Local Item |
|||
Item |
Prefix Code |
Item |
Prefix Code |
Item |
Prefix Code |
Input |
0x8? |
Usage Page |
0x0? |
Usage |
0x0? |
Output |
0x9? |
Logical Minimum |
0x1? |
Usage Minimum |
0x1? |
Feature |
0x0b? |
Logical Maximum |
0x2? |
Usage Maximum |
0x2? |
|
|
Physical Minimum |
0x3? |
Designator_Index |
0x3? |
Collection |
0xa1 |
Physical Maximum |
0x4? |
Designator Minimum |
0x4? |
End Collection |
0xc0 |
Unit Exponent |
0x5? |
Designator Maximum |
0x5? |
|
|
Unit |
0x6? |
String_Index |
0x6? |
|
|
Report Size |
0x7? |
String Minimum |
0x7? |
|
|
Report ID |
0x8? |
String Maximum |
0x8? |
|
|
Report Count |
0x9? |
Delimiter |
0xa? |
|
|
Push |
0xA4 |
|
|
|
|
Pop |
0xB4 |
|
|