HID 报告描述
https://blog.****.net/skdev/article/details/48528293
HID报告描述
1报告描述简介
报告说明,即上报事件的描述,描述所支持事件的格式及取值意义,比如鼠标按键上报格式,左键右键中间键分别对应的值等;报告描述跟JSON有些类似,都是结构数据,格式类似{usage:1,{id:0,用法:1.1,大小:1,count:1,min:0,max:5,format:xx}}
2描述符结构
几个主要的名词解释一下:
收集,集合,相当于{},用来包含一组描述;收藏有应用和物理之分,应用表示大项,里有可以有很多物理子项
报告,报告,在上图中只是一个ID号,来区分不同的报告。
主要项目,主项,出出哪些项
报告大小,每一项有多少位。
Report Count,总共有多少项
Logical Minimum,每个项的取值范围中的最小值,即最小只能取的值。
Logical Maximum,每个项的取值范围中的最大值,即最大只能取的值。
使用方法,用途,表示有哪些功能,一个使用代表一个功能。
一项描述基本上是由两个字节构成,第一个字节表示名称,第二个字节表示值,
如报告大小,8
报告大小是名称,8是它的值。
Report Size对应的16制数据是0x75,在代码里上面的表现是0x75,0x08。
有些名称不需要带值,如Collection的结束符())为0xC0,就没有第二个字节。
3名称
名称有分长字和短字,这里只介绍短字,短字是由一个字节构成,结构如下:
第3〜2位表示类型,有如下几种:
0 =主要
1 =全球
2 =本地
3 =保留
第1〜0位表示名称的值由多少个字节构成,具体意义如下:
0 = 0字节,名称后面不带值
1 = 1个字节,名称后面带1个值
2 = 2个字节,名称后面带2个值
3 = 4个字节,名称后面带4个值
第7~4位表示Tag,Tag与类型对应,每种类型有很多不同的Tag。
3.1 Main类对应的Tag
在上面表格中,可以看到,第3~2位是00,这两位是bType值,00表示类型为Main;nn是第1~0位,是bSize,表示数值的字节数;第7~4位是bTag,如1000(0x8?)表示Input;Valid Data表示值的意义,如Input项,Bit 0 {Data(0) | Constant(1)},意思是说,如果值的第0位的是0,即表示Data,如果是1,则表示Constant,如下语句:
0x81, 0x02, // Input: (Data,Variable, Absolute)
它的值是2,第0位是0对应的是Data,第1位是1 对应的是Variable,第二位是0对应的是Absolute,所以它是一个Data、Variable、 Absolute的类型。
下面对Data、Variable等的意思作一下解释。
Data 表示是一个可写的数据。
Constant 表示是一个只读的数据。
Aarray 表示数据里的值代表一个Usage,Report Size表示位数,即Report Size的存储单元里的值是Usage的Index。Report Count一般为1,如果大于则表示可以同时出现多个Usage.
Variable 则是一个Report Size存储单元表示一个Usage,其值表示Usage的状态;Report Size表示位数,Report Count表示长度。
Absolute 表示绝对数据,如触模屏数据,便使用Absolute。
Relative 表示相对数据,如鼠标数据,便使用Relative。
其也用的少就不多说了,详细参看《HID协议》。
3.2 Global类对应的Tag
在上面表格中,可以看到,第3~2位是01,这两位是bType值,01表示类型为Global;nn是第1~0位,是bSize,表示数值的字节数;第7~4位是bTag,如0000(0x0?)表示Usage Page。
3.3 Local类对应的Tag
在上面表格中,可以看到,第3~2位是10,这两位是bType值,10表示类型为Local;nn是第1~0位,是bSize,表示数值的字节数;第7~4位是bTag,如0000(0x0?)表示Usage。
4 样例解读
下面是一个伪代码描述的样例,其中涉及到的页码可查看第5段用途表:
Usage Page (Generic Desktop), //定位到Generic Desktop页,这个相当于指针跳转一样的东西
Usage (Mouse), //指定Generic Desktop里的mouse,表示这是一个鼠标
Collection (Application), // Collection Application,是对Mouse的解释
Usage(Pointer), //表示指针形式
Collection (Physical), // CollectionPhysical,是对Pointer的解释
ReportID (0A), //id为0x0A的报告
Usage(X), Usage (Y), //上报X,Y两个数据
LogicalMinimum (-127), ;Report data values range from -127
LogicalMaximum (127), ;to 127 //X,Y的取值范围是-127~127
ReportSize (8), Report Count (2), //总共要上报2个字节,即x一个字节,y一个字节
Input(Data, Variable, Relative), //将X,Y这两个字节添加到0x0A的报告里,且这两个值是可写并且是相对的
LogicalMinimum (0), ;
LogicalMaximum (1), ;//下面Button的取值范围是0~1
ReportSize (1), Report Count (3), //3个1位的数据
UsagePage (Button Page),//是一个BUTTON
UsageMinimum (1),
Usage Maximum (3),//共有BUTTON1~BUTTON3,即总共有3个BUTTON
Input(Data, Variable, Absolute),//将3个分别代表的BUTTON1,BUTTON2,BUTTON3的位添加到0x0A的报告
ReportSize (5),
Input(Constant), //增加5个无效的位与上面3位凑成一个字节
EndCollection,
End Collection
综上所示,上面样例所表达的意思就是下图所示的:
再举一个实际的例子进行解读,下面是摘自TI CC2540/CC2541 SDK里的BLE-CC254x_v1.4.0\Projects\ble\Profiles\HIDDevKbM\hidkbmservice.c
static CONST uint8 hidReportMap[] =
{
0x05, 0x01, // UsagePage (Generic Desktop)
0x09, 0x02, // Usage (Mouse)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report Id (1)
0x09, 0x01, // Usage (Pointer)
0xA1, 0x00, // Collection (Physical)
0x05, 0x09, // Usage Page (Buttons)
0x19, 0x01, // Usage Minimum (01) -Button 1
0x29, 0x03, // Usage Maximum (03) -Button 3
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x03, // Report Count (3)
0x81, 0x02, // Input (Data, Variable,Absolute) - Button states
0x75, 0x05, // Report Size (5)
0x95, 0x01, // Report Count (1)
0x81, 0x01, // Input (Constant) - Paddingor Reserved bits
0x05, 0x01, // Usage Page (GenericDesktop)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x38, // Usage (Wheel)
0x15, 0x81, // Logical Minimum (-127)
0x25, 0x7F, // Logical Maximum (127)
0x75, 0x08, // Report Size (8)
0x95, 0x03, // Report Count (3)
0x81, 0x06, // Input (Data, Variable,Relative) - X & Y coordinate
0xC0, // End Collection
0xC0, // End Collection
0x05, 0x01, // UsagePg (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection: (Application)
0x85, 0x02, // Report Id (2)
//
0x05, 0x07, // Usage Pg (Key Codes)
0x19, 0xE0, // Usage Min (224)
0x29, 0xE7, // Usage Max (231)
0x15, 0x00, // Log Min (0)
0x25, 0x01, // Log Max (1)
//
// Modifier byte
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input: (Data, Variable,Absolute)
//
// Reserved byte
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x01, // Input: (Constant)
//
// LED report
0x95, 0x05, // Report Count (5)
0x75, 0x01, // Report Size (1)
0x05, 0x08, // Usage Pg (LEDs)
0x19, 0x01, // Usage Min (1)
0x29, 0x05, // Usage Max (5)
0x91, 0x02, // Output: (Data, Variable,Absolute)
//
// LED report padding
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x01, // Output: (Constant)
//
// Key arrays (6 bytes)
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Log Min (0)
0x25, 0x65, // Log Max (101)
0x05, 0x07, // Usage Pg (Key Codes)
0x19, 0x00, // Usage Min (0)
0x29, 0x65, // Usage Max (101)
0x81, 0x00, // Input: (Data, Array)
//
0xC0, // End Collection
//
0x05, 0x0C, // Usage Pg (Consumer Devices)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x03, // Report Id (3)
0x09, 0x02, // Usage (Numeric KeyPad)
0xA1, 0x02, // Collection (Logical)
0x05, 0x09, // Usage Pg (Button)
0x19, 0x01, // Usage Min (Button1)
0x29, 0x0A, // Usage Max (Button10)
0x15, 0x01, // Logical Min (1)
0x25, 0x0A, // Logical Max (10)
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
0x81, 0x00, // Input (Data, Ary,Abs)
0xC0, // End Collection
0x05, 0x0C, // Usage Pg (ConsumerDevices)
0x09, 0x86, // Usage (Channel)
0x15, 0xFF, // Logical Min (-1)
0x25, 0x01, // Logical Max (1)
0x75, 0x02, // Report Size (2)
0x95, 0x01, // Report Count (1)
0x81, 0x46, // Input (Data, Var,Rel, Null)
0x09, 0xE9, // Usage (Volume Up)
0x09, 0xEA, // Usage (Volume Down)
0x15, 0x00, // Logical Min (0)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x81, 0x02, // Input (Data, Var,Abs)
0x09, 0xE2, // Usage (Mute)
0x09, 0x30, // Usage (Power)
0x09, 0x40, // Usage (Menu)
0x09, 0xB1, // Usage (Pause)
0x09, 0xB2, // Usage (Record)
0x0a, 0x23, 0x02, // Usage (Home)
0x0a, 0x24, 0x02, // Usage (Back)
0x09, 0xB3, // Usage (Fast Forward)
0x09, 0xB4, // Usage (Rewind)
0x09, 0xB5, // Usage (Scan Next)
0x09, 0xB6, // Usage (Scan Prev)
0x09, 0xB7, // Usage (Stop)
0x15, 0x01, // Logical Min (1)
0x25, 0x0C, // Logical Max (12)
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
0x81, 0x00, // Input (Data, Ary,Abs)
0x09, 0x80, // Usage (Selection)
0xA1, 0x02, // Collection (Logical)
0x05, 0x09, // Usage Pg (Button)
0x19, 0x01, // Usage Min (Button1)
0x29, 0x03, // Usage Max (Button3)
0x15, 0x01, // Logical Min (1)
0x25, 0x03, // Logical Max (3)
0x75, 0x02, // Report Size (2)
0x81, 0x00, // Input (Data, Ary,Abs)
0xC0, // End Collection
0x81, 0x03, // Input (Const, Var,Abs)
0xC0 // End Collection
};
上面用红蓝绿区分出三大应用功能,分别鼠标、键盘和Consumer,每个应用功能都是用Collection Application括起来的。
我们先来解析鼠标的报告描述:
0x05,0x01, // Usage Page (Generic Desktop)
0x04代表是Global类的Usage Page功能,最位2位表示带多少个字节的数据,因为只带1 个数据,所以是1,跟0x04组合起来就是0x05了。其他名称的意思都差不多,数值可以参照上面的《3名称》
0x09, 0x02, // Usage (Mouse)
表示这是一个鼠标, Usage是为了给对方解析数据时有个参照
0xA1, 0x01, // Collection (Application)
0xA1, 0x01 表示Collection Application ; 0xA1,0x00表示CollectionPhysical.
表示下面所包含的是对Mouse的解释
0x85, 0x01, // Report Id (1)
该报告对应的ID是1
0x09, 0x01, // Usage (Pointer)
这是个指针形式
0xA1, 0x00, // Collection (Physical)
下面所包含的是对指针的解释
0x05, 0x09, // Usage Page (Buttons)
下面定义的是按键
0x19, 0x01, // Usage Minimum (01) -Button 1
0x29, 0x03, // Usage Maximum (03) -Button 3
总共有3个按键
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
按键的值是0和1,表示放开和按下
0x75, 0x01, // Report Size (1)
0x95, 0x03, // Report Count (3)
有3个1位,即用3bits分别对应三个按键
0x81, 0x02, // Input (Data, Variable,Absolute) - Button states
将这三个位加入本报告的数据中,这三位是可读写的绝对值
0x75, 0x05, // Report Size (5)
0x95, 0x01, // Report Count (1)
定义1个5位的数据
0x81, 0x01, // Input (Constant) - Paddingor Reserved bits
将这个数据添加到本报告的数据中,主要是与前面3位组成一个字节,这5位是Constant数据
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x38, // Usage (Wheel)
下面定义的是X,Y,Wheel三个功能
0x15, 0x81, // Logical Minimum (-127)
0x25, 0x7F, // Logical Maximum (127)
X,Y,Wheel的取值范围是-127~127
0x75, 0x08, // Report Size (8)
0x95, 0x03, // Report Count (3)
用三个字节来表示x,y,wheel
0x81, 0x06, // Input (Data, Variable,Relative) - X & Y coordinate
将这三个字节添加到本报告中
0xC0, // End Collection
0xC0, // End Collection
上面解析出来的数据格式如下:
我们来看一下,如果要发一个鼠标的坐标,该如何发:
static void hidEmuKbdSendMouseReport( uint8buttons )
{
uint8 buf[HID_MOUSE_IN_RPT_LEN];
buf[0] = buttons; // Buttons
buf[1] = 0; // X
buf[2] = 0; // Y
buf[3] = 0; // Wheel
HidDev_Report( HID_RPT_ID_MOUSE_IN, HID_REPORT_TYPE_INPUT,
HID_MOUSE_IN_RPT_LEN, buf );
}
从上面函数可以看到,X,Y在第2、3个字节,结合上面的数据格式图可以看出,正好是对应的。
我们接着解析键盘的报告描述:
0x05,0x01, // Usage Pg (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
这是一个键盘
0xA1, 0x01, // Collection: (Application)
0x85, 0x02, // Report Id (2)
本报告的ID是2
0x05, 0x07, // Usage Pg (Key Codes)
下面定义的是按键码
0x19, 0xE0, // Usage Min (224)
0x29, 0xE7, // Usage Max (231)
按键码分别是224~231,共总有8个按键码
0x15, 0x00, // Log Min (0)
0x25, 0x01, // Log Max (1)
按键码的值是0和1,分别代表放开和按下
// Modifier byte
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
用8个bit分别表示8个按键的状态
0x81, 0x02, // Input: (Data, Variable,Absolute)
将这8个bit添加到本报告中
// Reserved byte
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x01, // Input: (Constant)
另外再预留8个bit备用,暂时没用
// LED report
0x95, 0x05, // Report Count (5)
0x75, 0x01, // Report Size (1)
定义5个1bit
0x05, 0x08, // Usage Pg (LEDs)
这是LED
0x19, 0x01, // Usage Min (1)
0x29, 0x05, // Usage Max (5)
5个bit分别对应LED1~LED5
0x91, 0x02, // Output: (Data, Variable,Absolute)
将这5个bit添加到本报告中,LED需要作为OUT
//
// LED report padding
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x01, // Output: (Constant)
再增加3个bit,与上面5个bit组成一个字节
//
// Key arrays (6 bytes)
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
定义6个字节
0x15, 0x00, // Log Min (0)
0x25, 0x65, // Log Max (101)
每个字节的取值范围是0~101
0x05, 0x07, // Usage Pg (Key Codes)
这个也是键盘码
0x19, 0x00, // Usage Min (0)
0x29, 0x65, // Usage Max (101)
分别是键盘码0~键盘码101
0x81, 0x00, // Input: (Data, Array)
将这6个字节添加到本报告中,表示同时可产生6个键值。
0xC0, // End Collection
上面解析出来的数据格式如下:
Input和Out是不同的两条通道。现在我们来看一下,如果要发一个按键K0~K101,需要怎么发,如下:
static void hidEmuKbdSendReport( uint8keycode )
{
uint8 buf[HID_KEYBOARD_IN_RPT_LEN];
buf[0] = 0; // Modifierkeys
buf[1] = 0; // Reserved
buf[2] = keycode; // Keycode 1
buf[3] = 0; // Keycode 2
buf[4] = 0; // Keycode 3
buf[5] = 0; // Keycode 4
buf[6] = 0; // Keycode 5
buf[7] = 0; // Keycode 6
HidDev_Report( HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT,
HID_KEYBOARD_IN_RPT_LEN, buf );
}
上面函数可以看到,它是放在第3个字节,结合数据格式图可以看出,第3个字节开始,刚好是在K0~K101的按键区。
我们最后来解析Consumer的报告描述:
0x05,0x0C, // Usage Pg (Consumer Devices)
0x09, 0x01, // Usage (Consumer Control)
这是个Consumer控制
0xA1, 0x01, // Collection (Application)
0x85, 0x03, // Report Id (3)
本报告ID为3
0x09, 0x02, // Usage (Numeric KeyPad)
下面定义的是数字键盘
0xA1, 0x02, // Collection (Logical)
0x05, 0x09, // Usage Pg (Button)
下面定义的是按键
0x19, 0x01, // Usage Min (Button1)
0x29, 0x0A, // Usage Max (Button10)
分别是Button1~Button10
0x15, 0x01, // Logical Min (1)
0x25, 0x0A, // Logical Max (10)
每个按键的取值范围为1~10
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
1个4bit的值,来表示键值1~10,这个值是哪个就表示哪个键按下。
0x81, 0x00, // Input (Data, Ary, Abs)
将这4bit添加到本报告中
0xC0, // End Collection
0x05, 0x0C, // Usage Pg (ConsumerDevices)
0x09, 0x86, // Usage (Channel)
这里定义的是频道
0x15, 0xFF, // Logical Min (-1)
0x25, 0x01, // Logical Max (1)
频道值范围是-1~1,这里应该只用到-1和1,表示频道+和-
0x75, 0x02, // Report Size (2)
0x95, 0x01, // Report Count (1)
用一个2bit来表示,第1个bit表示频道+,第二个表示频道-
0x81, 0x46, // Input (Data, Var,Rel, Null)
将这个2bit加到本报告中
0x09, 0xE9, // Usage (Volume Up)
0x09, 0xEA, // Usage (Volume Down)
定义两个按键,音量加和音量减
0x15, 0x00, // Logical Min (0)
按键值为0~1,这里少了LogicalMax,继承上面的LogicalMax=1
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
定义2个1bit,每个bit代表一个键
0x81, 0x02, // Input (Data, Var,Abs)
将2个1bit添加到本报告中
0x09, 0xE2, // Usage (Mute)
0x09, 0x30, // Usage (Power)
0x09, 0x40, // Usage (Menu)
0x09, 0xB1, // Usage (Pause)
0x09, 0xB2, // Usage (Record)
0x0a, 0x23, 0x02, // Usage (Home)
0x0a, 0x24, 0x02, // Usage (Back)
0x09, 0xB3, // Usage (Fast Forward)
0x09, 0xB4, // Usage (Rewind)
0x09, 0xB5, // Usage (Scan Next)
0x09, 0xB6, // Usage (Scan Prev)
0x09, 0xB7, // Usage (Stop)
定义12个按键
0x15, 0x01, // Logical Min (1)
0x25, 0x0C, // Logical Max (12)
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
用一个4位来存储1~12,1表示Mute … 12表示Stop
0x81, 0x00, // Input (Data, Ary,Abs)
将这个4bit添加到报告中
0x09, 0x80, // Usage (Selection)
0xA1, 0x02, // Collection (Logical)
0x05, 0x09, // Usage Pg (Button)
这是按键
0x19, 0x01, // Usage Min (Button1)
0x29, 0x03, // Usage Max (Button3)
分别是Button1~Button3
0x15, 0x01, // Logical Min (1)
0x25, 0x03, // Logical Max (3)
每个按键取值范围是1~3
0x75, 0x02, // Report Size (2)
这里缺少了Report Count,继承上面的Report Count =1,也就是用1个2bit来存储1~3
0x81, 0x00, // Input (Data, Ary,Abs)
将1个字节添加到本报告中
0xC0, // End Collection
0x81, 0x03, // Input (Const, Var,Abs)
再补充2个bit将上面的凑成一个字节,ReportSize=2和Report Count=1继承上面的。
0xC0 // End Collection
修改后,解析出来的数据格式如下:
我们来看一下,如果要发音量+/-键该怎么发:
static void hidCCSendReport( uint8 cmd,bool keyPressed )
{
//Only send the report if something meaningful to report
uint8 buf[HID_CC_IN_RPT_LEN] = { 0, 0 };
//No need to include Report Id
if( keyPressed )
{
hidCCBuildReport( buf, cmd );
}
HidDev_Report( HID_RPT_ID_CC_IN, HID_REPORT_TYPE_INPUT,
HID_CC_IN_RPT_LEN, buf );
}
在hidCCBuildReport对音量加减解析出来是:
音量加是:buf[0] =0x40, buf[1] = 0x00
音量减是:buf[0] =0x80, buf[1] = 0x00
正好与数据格式图中第一个字节的第6位和第7位相对应。5 用途表
下面用途表中列了几个常用的表,其他详细请参看《HID用途表》
Usage Page
Page ID |
Page Name |
0 |
Undefined |
1 |
Generic Desktop Controls |
2 |
Simulation Controls |
3 |
VR Controls |
4 |
Sport Controls |
5 |
Game Controls |
6 |
Generic Device Controls |
7 |
Keyboard/Keypad |
8 |
LEDs |
9 |
Button |
0A |
Ordinal |
0B |
Telephony |
0C |
Consumer |
0D |
Digitizer |
0E |
Reserved |
0F |
PID Page |
10 |
Unicode |
11-13 |
Reserved |
14 |
Alphanumeric Display |
15-3f |
Reserved |
40 |
Medical Instruments |
41-7F |
Reserved |
80-83 |
Monitor pages |
84-87 |
Power pages |
88-8B |
Reserved |
8C |
Bar Code Scanner page |
8D |
Scale page |
8E |
Magnetic Stripe Reading (MSR) Devices |
8F |
Reserved Point of Sale pages |
Generic Desktop Page(0x01)
Usage ID |
Usage Name |
0 |
Undefined |
1 |
Pointer |
2 |
Mouse |
3 |
Reserved |
4 |
Joystick |
5 |
Game Pad |
6 |
Keyboard |
7 |
Keypad |
8 |
Multi-axis Controller |
9 |
Tablet PC System Controls |
0A-2F |
Reserved |
30 |
X |
31 |
Y |
32 |
Z |
33 |
Rx |
34 |
Ry |
35 |
Rz |
36 |
Slider |
37 |
Dial |
38 |
Wheel |
39 |
Hat switch |
3A |
Counted Buffer |
3B |
Byte Count |
3C |
Motion Wakeup |
3D |
Start OOC |
3E |
Select OOC |
3F |
Reserved |
40 |
Vx |
41 |
Vy |
42 |
Vz |
43 |
Vbrx |
44 |
Vbry |
45 |
Vbrz |
46 |
Vno |
47 |
Feature Notification |
48 |
Resolution Multiplier |
49-7F |
Reserved |
80 |
System Control |
81 |
System Power Down |
82 |
System Sleep |
83 |
System Wake Up |
84 |
System Context Menu |
85 |
System Main Menu |
86 |
System App Menu |
87 |
System Menu Help |
88 |
System Menu Exit |
89 |
System Menu Select |
8A |
System Menu Right |
8B |
System Menu Left |
8C |
System Menu Up |
8D |
System Menu Down |
8E |
System Cold Restart |
8F |
System Warm Restart |
90 |
D-pad Up |
91 |
D-pad Down |
92 |
D-pad Right |
93 |
D-pad Left |
94-9F |
Reserved |
A0 |
System Dock |
A1 |
System Undock |
A2 |
System Setup |
A3 |
System Break |
A4 |
System Debugger Break |
A5 |
Application Break |
A6 |
Application Debugger Break |
A7 |
System Speaker Mute |
A8 |
System Hibernate |
A9-AF |
Reserved |
B0 |
System Display Invert |
B1 |
System Display Internal |
B2 |
System Display External |
B3 |
System Display Both |
B4 |
System Display Dual |
B5 |
System Display Toggle Int/Ext |
B6 |
System Display Swap rimary/Secondary |
B7 |
System Display LCD Autoscale |
B8-FFFF |
Reserved |
Keyboard/Keypad Page(0x07)
Usage ID |
Usage ID |
Usage Name |
01 |
01 |
Keyboard ErrorRollOver9 |
02 |
02 |
Keyboard POSTFail9 |
03 |
03 |
Keyboard ErrorUndefined9 |
04 |
04 |
Keyboard a and A4 |
05 |
05 |
Keyboard b and B |
06 |
06 |
Keyboard c and C4 |
07 |
07 |
Keyboard d and D |
08 |
08 |
Keyboard e and E |
09 |
09 |
Keyboard f and F |
10 |
0A |
Keyboard g and G |
11 |
0B |
Keyboard h and H |
12 |
0C |
Keyboard i and I |
13 |
0D |
Keyboard j and J |
14 |
0E |
Keyboard k and K |
15 |
0F |
Keyboard l and L |
16 |
10 |
Keyboard m and M4 |
17 |
11 |
Keyboard n and N |
18 |
12 |
Keyboard o and O4 |
19 |
13 |
Keyboard p and P4 |
20 |
14 |
Keyboard q and Q4 |
21 |
15 |
Keyboard r and R |
22 |
16 |
Keyboard s and S4 |
23 |
17 |
Keyboard t and T |
24 |
18 |
Keyboard u and U |
25 |
19 |
Keyboard v and V |
26 |
1A |
Keyboard w and W4 |
27 |
1B |
Keyboard x and X4 |
28 |
1C |
Keyboard y and Y4 |
29 |
1D |
Keyboard z and Z4 |
30 |
1E |
Keyboard 1 and !4 |
31 |
1F |
Keyboard 2 and @4 |
32 |
20 |
Keyboard 3 and #4 |
33 |
21 |
Keyboard 4 and $4 |
34 |
22 |
Keyboard 5 and %4 |
35 |
23 |
Keyboard 6 and ^4 |
36 |
24 |
Keyboard 7 and &4 |
37 |
25 |
Keyboard 8 and *4 |
38 |
26 |
Keyboard 9 and (4 |
39 |
27 |
Keyboard 0 and )4 |
40 |
28 |
Keyboard Return (ENTER)5 |
41 |
29 |
Keyboard ESCAPE |
42 |
2A |
Keyboard DELETE (Backspace)13 |
43 |
2B |
Keyboard Tab |
44 |
2C |
Keyboard Spacebar |
45 |
2D |
Keyboard - and (underscore)4 |
46 |
2E |
Keyboard = and +4 |
47 |
2F |
Keyboard [ and {4 |
48 |
30 |
Keyboard ] and }4 |
49 |
31 |
Keyboard \ and | |
50 |
32 |
Keyboard Non-US # and ~2 |
51 |
33 |
Keyboard ; and :4 |
52 |
34 |
Keyboard ‘ and “4 |
53 |
35 |
Keyboard Grave Accent and Tilde4 |
54 |
36 |
Keyboard, and <4 |
55 |
37 |
Keyboard . and >4 |
56 |
38 |
Keyboard / and ?4 |
57 |
39 |
Keyboard Caps Lock11 |
58 |
3A |
Keyboard F1 |
59 |
3B |
Keyboard F2 |
60 |
3C |
Keyboard F3 |
61 |
3D |
Keyboard F4 |
62 |
3E |
Keyboard F5 |
63 |
3F |
Keyboard F6 |
64 |
40 |
Keyboard F7 |
65 |
41 |
Keyboard F8 |
66 |
42 |
Keyboard F9 |
67 |
43 |
Keyboard F10 |
68 |
44 |
Keyboard F11 |
69 |
45 |
Keyboard F12 |
70 |
46 |
Keyboard PrintScreen1 |
71 |
47 |
Keyboard Scroll Lock11 |
72 |
48 |
Keyboard Pause1 |
73 |
49 |
Keyboard Insert1 |
74 |
4A |
Keyboard Home1 |
75 |
4B |
Keyboard PageUp1 |
76 |
4C |
Keyboard Delete Forward1 |
77 |
4D |
Keyboard End1 |
78 |
4E |
Keyboard PageDown1 |
79 |
4F |
Keyboard RightArrow1 |
80 |
50 |
Keyboard LeftArrow1 |
81 |
51 |
Keyboard DownArrow1 |
82 |
52 |
Keyboard UpArrow1 |
83 |
53 |
Keypad Num Lock and Clear11 |
84 |
54 |
Keypad /1 |
85 |
55 |
Keypad * |
86 |
56 |
Keypad - |
87 |
57 |
Keypad + |
88 |
58 |
Keypad ENTER5 |
89 |
59 |
Keypad 1 and End |
90 |
5A |
Keypad 2 and Down Arrow |
91 |
5B |
Keypad 3 and PageDn |
92 |
5C |
Keypad 4 and Left Arrow |
93 |
5D |
Keypad 5 |
94 |
5E |
Keypad 6 and Right Arrow |
95 |
5F |
Keypad 7 and Home |
96 |
60 |
Keypad 8 and Up Arrow |
97 |
61 |
Keypad 9 and PageUp |
98 |
62 |
Keypad 0 and Insert |
99 |
63 |
Keypad . and Delete |
100 |
64 |
Keyboard Non-US \ and |3;6 |
101 |
65 |
Keyboard Application10 |
102 |
66 |
Keyboard Power |
103 |
67 |
Keypad = |
104 |
68 |
Keyboard F13 |
105 |
69 |
Keyboard F14 |
106 |
6A |
Keyboard F15 |
107 |
6B |
Keyboard F16 |
108 |
6C |
Keyboard F17 |
109 |
6D |
Keyboard F18 |
110 |
6E |
Keyboard F19 |
111 |
6F |
Keyboard F20 |
112 |
70 |
Keyboard F21 |
113 |
71 |
Keyboard F22 |
114 |
72 |
Keyboard F23 |
115 |
73 |
Keyboard F24 |
116 |
74 |
Keyboard Execute |
117 |
75 |
Keyboard Help |
118 |
76 |
Keyboard Menu |
119 |
77 |
Keyboard Select |
120 |
78 |
Keyboard Stop |
121 |
79 |
Keyboard Again |
122 |
7A |
Keyboard Undo |
123 |
7B |
Keyboard Cut |
124 |
7C |
Keyboard Copy |
125 |
7D |
Keyboard Paste |
126 |
7E |
Keyboard Find |
127 |
7F |
Keyboard Mute |
128 |
80 |
Keyboard Volume Up |
129 |
81 |
Keyboard Volume Down |
130 |
82 |
Keyboard Locking Caps Lock12 |
131 |
83 |
Keyboard Locking Num Lock12 |
132 |
84 |
Keyboard Locking Scroll Lock12 |
133 |
85 |
Keypad Comma27 |
134 |
86 |
Keypad Equal Sign29 |
135 |
87 |
Keyboard International115,28 |
136 |
88 |
Keyboard International216 |
137 |
89 |
Keyboard International317 |
138 |
8A |
Keyboard International418 |
139 |
8B |
Keyboard International519 |
140 |
8C |
Keyboard International620 |
141 |
8D |
Keyboard International721 |
142 |
8E |
Keyboard International822 |
143 |
8F |
Keyboard International922 |
144 |
90 |
Keyboard LANG125 |
145 |
91 |
Keyboard LANG226 |
146 |
92 |
Keyboard LANG330 |
147 |
93 |
Keyboard LANG431 |
148 |
94 |
Keyboard LANG532 |
149 |
95 |
Keyboard LANG68 |
150 |
96 |
Keyboard LANG78 |
151 |
97 |
Keyboard LANG88 |
152 |
98 |
Keyboard LANG98 |
153 |
99 |
Keyboard Alternate Erase7 |
154 |
9A |
Keyboard SysReq/Attention1 |
155 |
9B |
Keyboard Cancel |
156 |
9C |
Keyboard Clear |
157 |
9D |
Keyboard Prior |
158 |
9E |
Keyboard Return |
159 |
9F |
Keyboard Separator |
160 |
A0 |
Keyboard Out |
161 |
A1 |
Keyboard Oper |
162 |
A2 |
Keyboard Clear/Again |
163 |
A3 |
Keyboard CrSel/Props |
164 |
A4 |
Keyboard ExSel |
165-175 |
A5-CF |
5 A5-CF Reserved |
176 |
B0 |
Keypad 00 |
177 |
B1 |
Keypad 000 |
178 |
B2 |
Thousands Separator 33 |
179 |
B3 |
Decimal Separator 33 |
180 |
B4 |
Currency Unit 34 |
181 |
B5 |
Currency Sub-unit 34 |
182 |
B6 |
Keypad ( |
183 |
B7 |
Keypad ) |
184 |
B8 |
Keypad { |
185 |
B9 |
Keypad } |
186 |
BA |
Keypad Tab |
187 |
BB |
Keypad Backspace |
188 |
BC |
Keypad A |
189 |
BD |
Keypad B |
190 |
BE |
Keypad C |
191 |
BF |
Keypad D |
192 |
C0 |
Keypad E |
193 |
C1 |
Keypad F |
194 |
C2 |
Keypad XOR |
195 |
C3 |
Keypad ^ |
196 |
C4 |
Keypad % |
197 |
C5 |
Keypad < |
198 |
C6 |
Keypad > |
199 |
C7 |
Keypad & |
200 |
C8 |
Keypad && |
201 |
C9 |
Keypad | |
202 |
CA |
Keypad || |
203 |
CB |
Keypad : |
204 |
CC |
Keypad # |
205 |
CD |
Keypad Space |
206 |
CE |
Keypad @ |
207 |
CF |
Keypad ! |
208 |
D0 |
Keypad Memory Store |
209 |
D1 |
Keypad Memory Recall |
210 |
D2 |
Keypad Memory Clear |
211 |
D3 |
Keypad Memory Add |
212 |
D4 |
Keypad Memory Subtract |
213 |
D5 |
Keypad Memory Multiply |
214 |
D6 |
Keypad Memory Divide |
215 |
D7 |
Keypad +/- |
216 |
D8 |
Keypad Clear |
217 |
D9 |
Keypad Clear Entry |
218 |
DA |
Keypad Binary |
219 |
DB |
Keypad Octal |
220 |
DC |
Keypad Decimal |
221 |
DD |
Keypad Hexadecimal |
222 |
22 |
3 DE-DF Reserved |
224 |
E0 |
Keyboard LeftControl |
225 |
E1 |
Keyboard LeftShift |
226 |
E2 |
Keyboard LeftAlt |
227 |
E3 |
Keyboard Left GUI10;23 |
228 |
E4 |
Keyboard RightControl |
229 |
E5 |
Keyboard RightShift |
230 |
E6 |
Keyboard RightAlt |
231 |
E7 |
Keyboard Right GUI10;24 |
LED Usage Page(0x08)
Usage ID |
Usage Name |
00 |
Undefined |
01 |
Num Lock |
02 |
Caps Lock |
03 |
Scroll Lock |
04 |
Compose |
05 |
Kana |
06 |
Power |
07 |
Shift |
08 |
Do Not Disturb |
09 |
Mute |
0A |
Tone Enable |
0B |
High Cut Filter |
0C |
Low Cut Filter |
0D |
Equalizer Enable |
0E |
Sound Field On |
0F |
Surround On |
10 |
Repeat |
11 |
Stereo |
12 |
Sampling Rate Detect |
13 |
Spinning |
14 |
CAV |
15 |
CLV |
16 |
Recording Format Detect |
17 |
Off-Hook |
18 |
Ring |
19 |
Message Waiting |
1A |
Data Mode |
1B |
Battery Operation |
1C |
Battery OK |
1D |
Battery Low |
1E |
Speaker |
Button Usage Page(0x09)
Usage ID |
Usage Name |
00 |
No button pressed |
01 |
Button 1 (primary/trigger) |
02 |
按钮2(次要) |
03 |
按钮3(大专) |
04 |
按钮4见注释 |
消费者使用情况页面(0x0C)
使用ID |
用法名称 |
00 |
未分配 |
01 |
消费者控制 |
02 |
数字键盘 |
03 |
可编程按钮 |
04 |
麦克风 |
05 |
耳机 |
06 |
图形均衡器 |
07-1F |
保留的 |
20 |
+10 |
21 |
+100 |
22 |
上午下午 |
23-3F |
保留的 |
三十 |
功率 |
31 |
重启 |
32 |
睡觉 |
33 |
睡觉后 |
34 |
睡眠模式 |
35 |
照明 |
36 |
功能按钮 |
37-3F |
保留的 |
40 |
菜单 |
41 |
菜单选择 |
42 |
菜单了 |
43 |
菜单向下 |
44 |
菜单左 |
45 |
菜单权利 |
46 |
菜单Es |
47 |
菜单值增加 |
48 |
菜单值减少 |
49-5F |
保留的 |
60 |
屏幕上的数据 |
61 |
关闭 |