配置描述符集合的最后一项,HID描述符。根据USB官方的HID文档描述,HID描述符作用是标识设备的从属描述符的长度和类型,也就是说USB设备还有从属描述符。
接下来,依然通过表格来做一下了解:
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起航,希望这篇文章对你有帮助!
好了,打完收工。