文章摘要:
HID设备属于免驱动设备,操作系统自带了相关驱动程序;
该设备的核心内容就是HID设备的报告描述符,本文列举了其中一种简单的用法及说明。
//一个简单的报告描述符,定义了8个字节的输入报告和8个字节的输入报告
char report_descriptor[]=
{
0x05,0x01, // USAGE_PAGE (Generic Desktop)
0x09,0x00, // USAGE (0表示自定义用途)
0xa1,0x01, // COLLECTION (Application)开集合
0x15,0x00, // LOGICAL_MINIMUM (0) 全局条目,逻辑最小值
0x25,0xff, // LOGICAL_MAXIMUM (255)全局条目,逻辑最大值
0x19,0x01, // USAGE_MINIMUM (1) 用途最小值
0x29,0x08, // USAGE_MAXIMUM (8) 用途最大值
0x95,0x08, // REPORT_COUNT(8)数据域的个数
0x75,0x08, // REPORT_SIZE (8)每个数据域的长度(bit)
0x81,0x02, // INPUT (Data,Var,Abs)数据域做为输入
0x19,0x01, // USAGE_MINIMUM (1)
0x29,0x08, // USAGE_MAXIMUM (8)
0x91,0x02, // OUTPUT (Data,Var,Abs)数据域做为输入(8字节,注意前面的逻辑值全局条目)
0xc0 // END_COLLECTION 关闭集合
};
USAGE_MINIMUM/USAGE_MAXIMUM 用途最小值/用途最大值
由于输入/输出定义为Var(独立)格式,
所以用途最大值与最小值后的个数必须与数据域个数相同,每个数据域代表一个用途;
如果定义为Ary格式,则不受此限制,只需定义一个用途即可;
Logical Minimum/LOGICAL_MAXIMUM 逻辑最小值/逻辑最大值
用来描述数据域的取值范围
为了方便管理,将用途(USAGE)分成了很多页(USAGE_PAGE)每页的用途有相似的功能;
HID报告描述符条目说明:
bTag: 表示条目的功能,具体查看HID用途表;
bType:表示条目的类型,0=主条目,1=全局条目,2=局部条目,3=保留;
bSize: 表示后边所跟数据的字节数(大部分情况一下0x01);
主条目
共有5个:
Input输入: 0x81(100000 01)
Output输出: 0x91(100100 01)
Feature特性: 尚未明白用途
Collection开集合: 0xA1(101000 01);
EndCollection关集合: 0xC0(110000 00),无后缀数据;
Output/Input/Feature后缀数据:
bit0: 变量Dat(0)/常量Cnst(1);
bit1: 数组Ary(0)/独立Var(1);
bit2: 绝对值Abs(0)/相对值Rel(1);
bit3/4/5/6:暂时不用管,保留为0即可;
bit7: 易变Vol/非易变Nv;
bit8: 位域0/字节域1(一般选择位域,如果选择字节域则需要2个字节参数);
Var表示数据为独立的变量;
Ary表示可以为1个或多个元素,每个元素有相同的用途;
Collection开集合后缀数据:
0x00: 物理集合;
0x01: 应用集合;
0x02: 逻辑集合;
注意事项
HID报告的长度必须与报告描述符中定义的相同;
如果实际发送的数据长度小于报告描述符中定义的长度,通过BusHound查看时,
“USB人体学输入设备”可以监测到数据,
“HID-compliant device”需要等数据包数据凑够一帧时,才能收到错帧;
如果报告描述符中定义了报告ID,则发送报告时,必须多发送1个字节的报告ID;
如果报告描述符中未定义报告ID,则发送报告时,不发送报告ID