====== HID 1.11 ====== [[https://www.usb.org/document-library/device-class-definition-hid-111|Device Class Definition for HID 1.11]] 根据USB官方的HID文档描述,HID描述符作用是标识设备的从属描述符的长度和类型,也就是说USB设备还有从属描述符。 ===== - Standard Descriptors ===== 参考 6.1 Standard Descriptors The HID class device class uses the following standard USB descriptors: * Device * Configuration * Interface * Endpoint * String ===== - Class-Specific Descriptors ===== 参考 6.2 Class-Specific Descriptors Each device class includes one or more class-specific descriptors. These descriptors differ from standard USB descriptors. A HID class device uses the following class-specific descriptors: * HID * Report * Physical ==== - HID Descriptor ==== === - 字段定义 === 参考 6.2.1 HID Descriptor Description The HID descriptor identifies the length and type of subordinate descriptors for a device. Parts Part Offset/Size Description (Bytes) ——————————————————————————————————————————————————————————————————————————————————— bLength 0/1 Numeric expression that is the total size of the HID descriptor. bDescriptorType 1/1 Constant name specifying type of HID descriptor. bcdHID 2/2 Numeric expression identifying the HIDClass Specification release. bCountryCode 4/1 Numeric expression identifying country code of the localized hardware. bNumDescriptors 5/1 Numeric expression specifying the number of class descriptors (always at least one i.e. Report descriptor.) bDescriptorType 6/1 Constant name identifying type of class descriptor. See Section 7.1.2: Set_Descriptor Request for a table of class descriptor constants. wDescriptorLength 7/2 Numeric expression that is the total size of the Report descriptor. [bDescriptorType]... 9/1 Constant name specifying type of optional descriptor. [wDescriptorLength]... 10/2 Numeric expression that is the total size of the optional descriptor. * If an optional descriptor is specified, a corresponding length entry must also be specified. * Multiple optional descriptors and associated lengths may be specified up to offset (3*n)+6 and (3*n)+7 respectively. * The value bNumDescriptors identifies the number of additional class specific descriptors present. This number must be at least one (1) as a Report descriptor will always be present. The remainder of the HID descriptor has the length and type of each additional class descriptor. * The value bCountryCode identifies which country the hardware is localized for. Most hardware is not localized and thus this value would be zero (0). However, keyboards may use the field to indicate the language of the key caps. Devices are not required to place a value other than zero in this field, but some operating environments may require this information. The following table specifies the valid country codes. ^偏移量 ^名称 ^大小 ^说明^ ^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类的规范版本。文档封面写着 Device Class Definition for Human Interface Devices (HID) Firmware Specification—5/27/01 Version 1.11 所以,版本是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 | 一般选择,00. bNumDescriptors,下级描述符的数量。可以是报告描述符,也可以说是物理描述符。该值至少为1,表示至少有一个报告描述符。 bDescriptorTyep,下级描述符的类型。前面说了,下级描述符一般是报告描述符,所以这里写报告描述符。那它对应的值是多少? 参考文档:7.1章节: The following defines valid types of Class descriptors. Value Class Descriptor Types --------------------------------------------------------- 0x21 HID 0x22 Report 0x23 Physical descriptor 0x24 - 0x2F Reserved 0x22,报告描述符 wDescriptorLength,下级描述符的长度。前面说了,下级描述符是报告描述符,所以这里放报告描述符的长度。 === - 实例 === Appendix E: Example USB Descriptors for HID Class Devices E.4 HID Descriptor (Keyboard) Part Offset/Size Description Sample Value (Bytes) ———————————————————————————————————————————————————————————————————————————————————————————————————— bLength 0/1 Size of this descriptor in bytes. 0x09 bDescriptorType 1/1 HID descriptor type (assigned by USB). 0x21 bcdHID 2/2 HID Class Specification release number in binary- 0x101 coded decimal—for example, 2.10 is 0x210). bCountryCode 4/1 Hardware target country. 0x00 bNumDescriptors 5/1 Number of HID class descriptors to follow. 0x01 bDescriptorType 6/1 Report descriptor type. 0x22 wDescriptorLength 7/2 Total length of Report descriptor. 0x3F /******************** 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, ==== - Report Descriptor ==== The Report descriptor is unlike other descriptors in that it is not simply a table of values. The length and content of a Report descriptor vary depending on the number of data fields required for the device’s report or reports. The Report descriptor is made up of items that provide information about the device. The first part of an item contains three fields: item type, item tag, and item size. Together these fields identify the kind of information the item provides. 参考:[[http://article.iotxfd.cn/Network%20programming/USB-HID-Report-Descriptors|USB HID 报告描述符]] === - 字段定义 === === - 字段说明 === === - 例子 === const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = { 0x05, 0x8c, // USAGE_PAGE (ST Page) 0x09, 0x01, // USAGE (Demo Kit) 0xa1, 0x01, // COLLECTION (Application) // The Input report 0x09,0x03, // USAGE ID - Vendor defined 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8bit) 0x95,0x40, // REPORT_COUNT (64Byte) 0x81,0x02, // INPUT (Data,Var,Abs) // The Output report 0x09,0x04, // USAGE ID - Vendor defined 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8bit) 0x95,0x40, // REPORT_COUNT (64Byte) 0x91,0x02, // OUTPUT (Data,Var,Abs) 0xc0 // END_COLLECTION }; // CustomHID_ReportDescriptor ===== - Reference ===== * [[https://blog.csdn.net/chengwenyang/article/details/51039741|STM32 USB HID 自定义设备 bulk 传输]] * [[https://blog.csdn.net/chenhaogxfc/article/details/96345990|STM32进行USB HID 改 BULK小记]] * [[https://www.taterli.com/2355/|使用STM32CubeMX编写USB复合设备]] * [[https://www.stm32cube.com/question/1107|再谈USB CDC 实现USB bulk传输]] Checked: *[[https://blog.csdn.net/u014285530/article/details/117931003|使用CubeMX 生成 USB从机 Custom HID 工程(STM32F407ZE )]]