目录
本文内容是基于微软提供的HID over I2C协议规范,以下是原文下载链接。
点击这里下载
HID描述符
HID描述符是每个基于I2C的HID设备必须具有的顶级强制描述符。HID描述符的目的是与主机共享设备的关键属性。这些属性准确地描述了协议兼容地版本以及设备地其他数据字段。
HID描述符格式
设备必须公开具有以下字段地HID描述符:
Byte Offset |
Field | Size (Bytes) |
Type | Description |
---|---|---|---|---|
0 | wHIDDescLength | 2 | WORD | 完整Hid描述符的长度(以无符号字节为单位) |
2 | bcdVersion | 2 | BCD | 版本号,采用二进制编码的十进制(BCD)格式。 DEVICE应默认为0x0100 |
4 | wReportDescLength | 2 | WORD | 报告描述符的长度(以无符号字节为单位) |
6 | wReportDescRegister | 2 | WORD | 设备上包含报告描述符的寄存器索引 |
8 | wInputRegister | 2 | WORD | 此字段以无符号字节标识从设备读取输入报告的寄 存器号 |
10 | wMaxInputLength | 2 | WORD | 此字段以无符号字节标识要从输入寄存器读取的最大输 入报告的长度(复杂的HID设备将需要各种大小的报告) |
12 | wOutputRegister | 2 | WORD | 此字段以无符号字节标识向DEVICE发送输出报告的寄 存器号 |
14 | wMaxOutputLength | 2 | WORD | 此字段以无符号字节标识要发送到输出寄存器的最大 输出报告的长度(复杂HID设备将需要各种大小的报告) |
16 | wCommandRegister | 2 | WORD | 此字段以无符号字节标识向设备发送命令请求的寄存 器号 |
18 | wDataRegister | 2 | WORD | 此字段以无符号字节标识与命令请求交换数据的寄存 器号 |
20 | wVendorID | 2 | WORD | 此字段标识设备制造商供应商ID。必须为非零 |
22 | wProductID | 2 | WORD | 此字段标识设备的唯一型号/产品ID |
24 | wVersionID | 2 | WORD | 此字段标识设备的固件版本号 |
26 | RESERVED | 4 | RESERVED | 此字段是保留的,应设置为0 |
HID报告描述符
所有items包含了1个byte的前缀,用来标识item的基本类型。HID类为item定了两种基本格式:
short items:总长度为1~5个byte;用于最常见的情况items。short items通常包含1个或0个byte的可选数据。
long items:总长度为3~258个byte;用于需要更大数据的items结构部分。
Short Items & Long Item
short items格式将item的size、type和tag打包到第一个字节中。这个第一个字节后面可能跟有0、1、2或4个可选数据字节,具体取决于size的大小。以下是short items的格式结构:
下面是关于short item中每个字段的解释。
Part | Description |
---|---|
bSize | 指定item后面跟多少个数据: 0 = 0 bytes 1 = 1 bytes 2 = 2 bytes 3 = 4 bytes |
bType | 标识item数据是哪一种类型: 0 = Main 1 = Global 2 = Local 3 = Reserved |
bTag | 指定不同类型item所对应的Tag。bTag与bType对应,每种Type有很多不同的Tag |
[data] | 可选的数据 |
与short items格式一样,long items格式将item size、type和tag打包到第一个byte中。Long Items格式使用特殊的item tag值来指示它是一个long items。long items size和long item tag均为8-bit数量。Item数据最多可包含255个bytes的数据。以下是long item的结构形式:
下面是关于long item中每个字段的解释。
Part | Description |
---|---|
bSize | 指定item总大小的数值表达式,其中大小为10(2 bytes),表示项目类型为long。永远是10 |
bType | 标识item数据哪一种类型。永远是11 |
bTag | 指定不同类型item所对应的Tag。永远是1111 |
[bLongItemTag] | Long item的tag |
[data] | 可选的数据 |
Main Item
Main item用于定义或分组报告描述符中的某些类型的数据字段。主要有两种类型的main item:数据和非数据。数据类型的main item用于在报告中创建字段,包括输入、输出和特征。其他item不创建字段,随后被称为非数据类型的main item。
在上面表格中,可以看到,第3-2 bit是00,这两位是bType值,00表示类型为Main;nn是第1-0位,是bSize,表示包含多少个可选数据;第7-4位是bTag,如1000(0x8?)表示Input;Valid Data表示值的意义,如Input项,Bit 0 {Data(0) | Constant(1)},意思是说,如果值的第0位的是0,即表示Data,如果是1,则表示Constant,如下语句:
0x81, 0x02, // Input: (Data,Variable, Absolute)
它的值是2,第0位是0对应的是Data,第1位是1 对应的是Variable,第二位是0对应的是Absolute,所以它是一个Data、Variable、 Absolute的类型。
关于Data、Variable、Absolute的解释请查看下表。
Global Item
Global item描述而不是定义来自控件的数据。Main item呈现出来item状态表的特征。Global item可以更改状态表。因此,全局项目标签适用于所有后续定义的items,除非被另一个Global item覆盖。
Local Item
Local item tag定义控件的特征。这些items不会转移到下一个main item。如果一个main item定义了多个控件,则它前面可能有几个类似的local item tags。例如,一个Input item可能有多个与之关联的Usage tag,每个控件对应一个。
报告协议
报告是host和device之间交换得基本数据元素。以下是常用的报告:
- 输入报告—从device发送到host的单向报告
- 输出报告—从host发送到device的单向报告
- 功能报告—可以从host发送到device或从device发送到host的双向报告
输入报告
当device有数据想要向host发送时,它首先需要拉低HID I2C上的中断线,当host收到中断后,它通过向device发出I2C读取请求来实现在HID描述符中定义的输入寄存器(字段:wInputRegister)中读取设备的数据。
下图是一个标准输入报告的协议跟踪图:
通过输入报告的协议跟踪图中,可以看出要传入的数据的顺序是Length-LSB、Length-MSB、Report_Field-LSB、Report_Field-MSB。其中Report Field中要具体填入哪一些内容可以参考下面链接中关于输入报告的解析。
解析输入报告
下图是一个抓取出来的输入报告的I2C波形图:
根据输入报告