https://blog.csdn.net/skdev/article/details/48528293
報告說明,即上報事件的描述,描述所支持事件的格式及取值意義,比如鼠標按鍵上報格式,左鍵右鍵中間鍵分別對應的值等;報告描述跟JSON有些類似,都是結構數據,格式類似{usage:1,{id:0,用法:1.1,大小:1,count:1,min:0,max:5,format:xx}}
幾個主要的名詞解釋一下:
收集,集合,相當於{},用來包含一組描述;收藏有應用和物理之分,應用表示大項,裏有可以有很多物理子項
報告,報告,在上圖中只是一個ID號,來區分不同的報告。
主要項目,主項,出出哪些項
報告大小,每一項有多少位。
Report Count,總共有多少項
Logical Minimum,每個項的取值範圍中的最小值,即最小隻能取的值。
Logical Maximum,每個項的取值範圍中的最大值,即最大隻能取的值。
使用方法,用途,表示有哪些功能,一個使用代表一個功能。
一項描述基本上是由兩個字節構成,第一個字節表示名稱,第二個字節表示值,
如報告大小,8
報告大小是名稱,8是它的值。
Report Size對應的16制數據是0x75,在代碼裏上面的表現是0x75,0x08。
有些名稱不需要帶值,如Collection的結束符())爲0xC0,就沒有第二個字節。
名稱有分長字和短字,這裏只介紹短字,短字是由一個字節構成,結構如下:
第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~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位是01,這兩位是bType值,01表示類型爲Global;nn是第1~0位,是bSize,表示數值的字節數;第7~4位是bTag,如0000(0x0?)表示Usage Page。
在上面表格中,可以看到,第3~2位是10,這兩位是bType值,10表示類型爲Local;nn是第1~0位,是bSize,表示數值的字節數;第7~4位是bTag,如0000(0x0?)表示Usage。
下面是一個僞代碼描述的樣例,其中涉及到的頁碼可查看第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位相對應。下面用途表中列了幾個常用的表,其他詳細請參看《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 |
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 |