HID over I2C

  本文内容是基于微软提供的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结构形式

  下面是关于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结构形式

  下面是关于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。

main item tag

  在上面表格中,可以看到,第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的解释请查看下表。

data descr

Global Item

  Global item描述而不是定义来自控件的数据。Main item呈现出来item状态表的特征。Global item可以更改状态表。因此,全局项目标签适用于所有后续定义的items,除非被另一个Global item覆盖。

global item tag

Local Item

  Local item tag定义控件的特征。这些items不会转移到下一个main item。如果一个main item定义了多个控件,则它前面可能有几个类似的local item tags。例如,一个Input item可能有多个与之关联的Usage tag,每个控件对应一个。

local item 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波形图:

输入报告I2C波形

  根据输入报告

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凛雨a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值