关于 HID 你可能需要知道的几件事 (更新中...)
一
- 《HID 1.11》 主要描述 report desc 的一些规则,以及如何进行通讯
- 《HUT 1.22》 则主要说明一些通用的 HID 设备类型具备的 Usage page, Usage
- 关于 HID 的文档请从该网页获取:https://www.usb.org/hid
二
- 关于 HID 的库可以使用 libusb 直接操作 USB HID 节点,也可通过 libhidapi 来操作,libhidapi 集成度更高,而且最近也开始重新维护了。都由 libusb 维护:
- libusb 仓库地址:https://github.com/libusb/libusb
- libhidapi 仓库地址:https://github.com/libusb/hidapi
- 如果你比较纠结到底是选择 libusb 好还是 libhidapi 好,则可以看一下这个帖子:https://stackoverflow.com/questions/55272593/hidapi-vs-libusb-for-linux
三
- HID 规范文档中设备描述的 input 和 output 都是站在 Host 端角度描述的
- HID 中的 report desc 主要是为了向 Host 描述设备具备何种功能,以及如何使用设备的。而 HID 从协议上并没有严格的绑定传输过程中的数据与 report desc 的对应关系。这需要设备和 PC 端的驱动和应用程序来保证。因此,这也造成了是市面很多不规范的产品 dump 出来一个设备描述自己支持很多的功能,但可能其中只有一小部分的功能是支持的原因。
四
-
HID report descriptor 描述了HID 设备的没一笔数据的数据标签(Tag)类型,大小,比如:
- 定义了 HID 的 input 事件应该被当作 mouse 事件还是 Keyboard 事件
- 定义了一个 output 事件或者 input 事件应该被如何传输(数据结构,类型)
五
-
HID 的 ClassCode 恒定为 0x03
-
HID 的 SubClass 有两个值
- 0 代表无 SubClass
- 1 代表 Boot Interface Subclass
-
HID 的 Protocol Codes 定义了三个值:(只有当 SubClass 为 1 的时候才会有 Interface Desc,并且 ProtocolCode 才有 非零值)
- 0 - None
- 1 - Keyboard
- 2 - Mouse
六: 关于 HID 的 Endpoint 说明如下:
- Control pipe de Endpoint0 是作为一个 USB 设备一定存在的,其也传输了包含以下内容:USB Control, Class request code, polled data(Message Data)
- Interrupt In, 用于承载 HID Input 类型数据(device to host)
- Interrupt Out,用于承载 HID output 类型数据(Host to devices),该 Endpoint 可不实现,此时 Output 数据通过 Endpoint0 传输
七 Report Descript
-
HID Report Desc 中包含许多格式相近的 item,而分析这些 item 的上下文可以得知,一个 HID 的设备包含哪些能力。
-
Report Desc 上下文的格式大致如下图所示:
-
其中 item 的格式:
短 item 主要包含以下几个部分:bTag,bType,bSize,bData,如下所示
-
bTag 和 bType 一起标识该 Item 的属性,其中 bType 主要指定属性范围,占用两个位:
00 - Main Items
01 - Global Items
10 - Local Items
11 - 保留(实际上可看成和特殊的 bTag(1111), bSize(10) 搭配标识该 Item 为长 Items) -
而对于短 Item 来说, bSize 标识该 item 的 bData 长度,短 Item 大致有 0,1,2,4 这几种长度,分别用 00, 01, 10, 11 表示
长 item 主要包含 特殊头,bDataSize,bLongItemTag, Data,如下所示:
-
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步