当前位置:文档之家› HID 报告描述符终极解析

HID 报告描述符终极解析

USB HID Report终极解析 HID的报告描述符巨难懂,关键是数据格式与每一位代表的意思。

经过三天的研究,终于将HID Report的每一个数据位的含义弄清楚了,现将数据解析如下,最后附上了一个HID 通信的Report例子。

以一个键盘的HID Report为例:键盘的HID报告描述符:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)0x09, 0x06, // USAGE (Keyboard)0xa1, 0x01, // COLLECTION (Application)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x08, // REPORT_COUNT (8)0x81, 0x02, // INPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,V ar,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,V ar,Abs)0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)0x81, 0x00, // INPUT (Data,Ary,Abs)0xc0 // END_COLLECTION};具体分析如下:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)// 分析根据HID短项目数据格式短项目的编码形式如下:0x05 = 0000 01010000:Usage Page01:bType,全局(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节(BSize 用来指出项目的数据所需字节的数目,该数目仅可以为0(当bSize=0),1(当bSize=1),2(当bSize=2),和4(当bSize=3)﹔注意不可以为3个字节。

大部分的卷标仅需一个字节的数据﹔全局项目的卷标Unit 比较特殊有可能最多用到4 个字节来表示其资料。

)0x01: Generic Desktop(查文档Universal Serial Bus HID Usage Tables,第三节Usage Pages)0x09, 0x06, // USAGE (Keyboard)0x09 = 00001001根据HID短项目格式0000:Usage10:bType,区域项目01:bSize,1字节0x06:KeyBoard(查文档Universal Serial Bus HID Usage Tables,第四节)0xa1, 0x01, // COLLECTION (Application)0xa1:0x01:(卷标End Collection 没有跟随任何资料。

但是卷标Collection 跟随一个字节的数据,例如指针的数据名为Physical,而鼠标的为Application。

所有Collection的数据名称与代码如表7:表7:报告集合的名称与代码Collection 的数据名称很难有一个准则来给定,Universal Serial Bus HID Usage Tables档中将各种用途的用途种类(usage type)列出,使用者必须依据用途种类来指定Collection 的数据名称,例如鼠标,键盘和游戏杆的用途种类为CA,所以要用Collection (Application),而指针为CP,所以用Collection (Physical)。

)0x05, 0x07, // USAGE_PAGE (Keyboard)//分析0x05 = 0000 01010000:Usage Page01:bType,全局(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节0x07:KeyBoard(查文档Universal Serial Bus HID Usage Tables,第三节Usage Pages)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x19= 0001 10010001: Usage Minimun()10: bType,区域项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节0xe0:Keyboard LeftControl(查文档Universal Serial Bus HID Usage Tables,10 Keyboard/Keypad Page (0x07))0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)// 分析同上“USAGE_MINIMUM (Keyboard LeftControl)”0x15, 0x00, // LOGICAL_MINIMUM (0)// 分析0x15=0001 01010001 : LOGICAL_MINNUM(查报告描述符的标签中的全域项目Logical Minimum 01:bType,全局项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,一个字节0x00:最小值0x25, 0x01, // LOGICAL_MAXIMUM (1)// 分析同上“LOGICAL_MINIMUM (0)”0x75, 0x01, // REPORT_SIZE (1)// 分析0x75 = 0111 01010111:Report Size(查报告描述符的标签中的全域项目Report Size)01:bType,全局项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,一个字节0x01:Report Size,单位bit。

如Report Size(1),则表示报告的值只有一位,0或者1 如果Report Size(1),则报告的值有8bit,范围0~255.0x95, 0x08, // REPORT_COUNT (8)// 分析0x95 = 1001 01011001:Report Count(查报告描述符的标签中的全域项目Report Count)01:bType,全局项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,一个字节0x08:Report Count,报告的字段。

即报告多少个Report Size的大小。

如Report Size(1), Report Count(3),每次报告三个位的数据。

0x81, 0x02, // INPUT (Data,V ar,Abs)//分析0x81 = 1000 0001这里要特别注意,这里要高6位和低2位拆分。

高6位含义:01:字节数,1字节0x02:参考附录一:主项目说明。

根据表格:表6:主项目的信息代码0x02 = 0000 0010我们只关心最后三位INPUT (Data,V ar,Abs)0:绝对值1:变量0:数据以下分析与上面分析重复,在此略过。

0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,V ar,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,V ar,Abs)0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs)0xc0 // END_COLLECTION//分析Collection结束,不带任何数据};西伯利亚的风2012/12/19附件:附录一:主项目说明主项目主项目中产生报告数据格式的三个卷标(Input,Output,和Feature)具有共通的数据定义,这些数据和其代码列于表6中。

相关主题