HID 报告描述符终极解析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 0101

0000:Usage Page

01: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:Usage

10: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 0101

0000:Usage Page

01:bType,全局(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)

01:bSize,1字节

0x07:KeyBoard(查文档Universal Serial Bus HID Usage Tables,第三节Usage Pages)

相关文档
最新文档