HID设备描述符的解析(rep_map_data app_hid_report_map)

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

初学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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值