初学HID可能会对文件中的设备描述符不解
可以理解这是一种用十六进制数据写的脚本语言,通过该脚本语言传递给上位设备。该语言描述了一个HID设备(可以是鼠标,键盘,游戏手柄,或者是蓝牙自拍杆)的一些基本情况,如按键数量,数据的最大最小值,携带的功能等等。
以下是一个设备描述符的例子:
const u8 rep_map_data [CUSTOMHID_SIZ_REPORT_DESC] =
{
0x05, 0x01,
0x09, 0x02,
0xa1, 0x01,
0x09, 0x01,
0xa1, 0x00,
0x05, 0x09,
0x19, 0x01,
0x29, 0x03,
0x15, 0x00,
0x25, 0x01,
0x95, 0x03,
0x75, 0x01,
0x81, 0x02,
0x95, 0x01,
0x75, 0x05,
0x81, 0x03,
0x05, 0x01,
0x09, 0x30,
0x09, 0x31,
0x09, 0x38,
0x15, 0x81,
0x25, 0x7f,
0x75, 0x08,
0x95, 0x03,
0x81, 0x06,
0xc0,
0xc0
};
根据HID协议,该描述符内部的数据组,如{0x05,0x01},称为条目(目前我们用的都是两个字节的短条目)。条目由一个字节的前缀和可选的数据字节组成,可选的数据字节最大为4,最小为0。
前缀是如下三段数据组成的一个字节:
| 7 6 5 4 | 3 2 | 1 0 |
|---|---|---|
| bTag | bType | bSize |
bType表示该条目的类型。类型有三种:0为主条目,1为全局条目,2为局部条目。
bSize用来表示条目的数据字节数量0表示0个字节,1表示1个字节,2表示2个字节,3表示4个字节。
bTag表示该条目的功能。
其中主条目的数值对应的功能如下表:
| 数值 | 功能 | 数值 | 功能 |
|---|---|---|---|
| 8 | input | 9 | output |
| b | feature | ||
| 0xa1 | collection | 0xc0 | End collection |
其中全局条目的数值对应的功能如下表:
| 数值 | 功能 | 数值 | 功能 |
|---|---|---|---|
| 0 | Usage Page | 1 | Logical Mini |
| 2 | Logical Maxi | 3 | Physical Mini |
| 4 | Physical Maxi | 7 | Report Size |
| 8 | Report ID | 9 | Report Count |
其中局部条目的数值对应的功能如下表:
| 数值 | 功能 | 数值 | 功能 |
|---|---|---|---|
| 0 | Usage | 1 | Usage Mini |
| 2 | Usage Maxi |
主条目的功能是定义该数据域的。Collection开集合,End Collection闭集合。
全局条目主要是定义数据域的长度,数量,报告的ID。
根据上述表格,可以翻译上面的代码中的数据,
如{0x05,0x01},0x05(b00000101)可以分解为:bTag为0,bType为01,bSize为01,所以是用途页,全局条目,数据长度为1,后面的0x01就是数据。
如{0x09,0x01},0x09(b00001001)可以分解为:bTag为0,bType为2,bSize为01,所以局部用途页的条目,数据长度为1,后面的0x01就是数据。
查询《hut1_3_0.pdf》可知,对于全局用途条目(global usage page item )而言,数据0x01表示Generic Desktop Page (0x01),意为通用桌面设备。全局用途条目的数据表示如下图(部分):

局部用途条目(local usage page item),数据0x01表示设备为Pointer。局部用途条目的数据表示如下图(部分):

同理,代码中的数据如{0x19, 0x01,},0x19(b00011001)可以解读为bTag为01,bType为2,bSize为1,意思该条目是局部条目,数据量为1,功能为表示逻辑最小值。根据数据0x01,最小值为1。
于是,通过上述方法,我们可以解读HID设备描述符。
附:hid设备描述符的代码写法
#define ITEM_SIZE(x) ((x) & 0x03)
#define TYPE_MAIN (0)
#define TYPE_GLOBAL (0x04)
#define TYPE_LOCAL (0x08)
/* MAIN */
#define TAG_MAIN_INPUT (0x80)
#define TAG_MAIN_OUTPUT (0x90)
#define TAG_MAIN_F

本文介绍了HID设备描述符的基本概念及如何解读其十六进制数据。通过对具体实例的分析,详细解释了条目的组成及其功能,帮助读者理解描述符如何定义HID设备的行为。

3736

被折叠的 条评论
为什么被折叠?



