USB的HID描述符详解

配置描述符集合的最后一项,HID描述符。根据USB官方的HID文档描述,HID描述符作用是标识设备的从属描述符的长度和类型,也就是说USB设备还有从属描述符。

接下来,依然通过表格来做一下了解:

偏移量 名称 大小 说明
0 bLength 1 描述符的长度(长度由下级描述符多少决定)
1 bDescriptorType 1 描述符类型(HID描述符为0x21)
2 bcdHID 2 HID协议版本
4 bCountryCode 1 国家代码
5 bNumDescriptors 1 下级描述符的数量
6 bDescriptorTyep 1 下级描述符的类型
7 wDescriptorLength 2 下级描述符的长度
9 bDescriptorType 1 下级描述符的类型(可选)
10 wDescriptorLength 2 下级描述符的长度(可选)
…(可选)

bLength,长度。和前面的描述符长度不一样的是,HID描述符长度不是固定的,长度多少与描述符中包含的下级描述符个数相关。如果只有一个下级描述符,也就是不包括可选的部分,一共有9字节的长度。

如果有多个下级描述符,按照长度往上加就行了。

bDescriptorType,描述符类型,不解释,看代码:

#define HID_DESCRIPTOR_TYPE 0x21U

#define HID_REPORT_DESC 0x22U

bcdHID,HID类的规范版本。文档封面赫然写着:

所以,版本是1.11,写成0x0111,小端形式就是:0x11,0x01.

bCountryCode,国家代码。看下面的表格:

Code(decimal) Country Code Code(decimal) Country Code
00 Not Supported 18 Netherlands/Dutch
01 Arabic 19 Norwegian
02 Belgian 20 Persian
03 Canadian-Bilingual 21 Poland
04 Canadian-French 22 Portuguese
05 Czech Republic 23 Russia
06 Danish 24 Slovakia
07 Finnish 25 Spanish
08 French 26 Swedish
09 German 27 Swiss/French
10 Greek 28 Swiss/German
11 Hebrew 29 Switzerland
12 Hungary 30 Taiwan
13 International(ISO) 31 Turkish-Q
14 Italian 32 UK
15 Japan(Katakana) 33 US
16 Korean 34 Yugoslavia
36 255 Reserved

这里咱们选择US,33.

bNumDescriptors,下级描述符的数量。可以是报告描述符,也可以说是物理描述符。该值至少为1,表示至少有一个报告描述符。

bDescriptorTyep,下级描述符的类型。前面说了,下级描述符一般是报告描述符,所以这里写报告描述符。那它对应的值是多少?

参考文档:7.1章节:

0x22,报告描述符~~~

wDescriptorLength,下级描述符的长度。前面说了,下级描述符是报告描述符,所以这里放报告描述符的长度。这里我写入0x22,为什么是这个值?

因为我是直接从STM32Cube生成的工程里得到的报告描述符,数了一下它的长度。后面会详细说下报告描述符的含义。

再后面,是描述符类型和描述符长度的循环。根据你有多少个报告描述符,你这里就循环多少次就行了。

HID描述符就说完了,这里放一段STM32里的HID描述符的代码:

/******************** Descriptor of Joystick Mouse HID ********************/

/* 18 */

0x09, /*bLength: HID Descriptor size*/

HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/

0x11, /*bcdHID: HID Class Spec release number*/

0x01,

0x00, /*bCountryCode: Hardware target country*/

0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/

0x22, /*bDescriptorType*/

HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/

0x00,

内容不多,希望都能看懂。连续几篇说了各个描述符,但其实大部分内容我都是从《圈圈教你学USB》这本书上学来的。所以,想认真学的,建议买本书。

另外就是USB官方的文档,虽然纯英文,但配合有道词典,还是很方便的。书和文档,两者相互印证,理解很快!

我是单片机爱好者MCU起航,希望这篇文章对你有帮助!

好了,打完收工。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据