|
主機請求命令,設備上傳設備描述符,配置描述符,字符串描述符(可有可無),接口描述符,端點描述符。這些在上一篇詳細學習了。在接口描述符里還需要上傳一個HID報告描述符,這篇將解讀之。因報告描述符為整個HID設備的核心內容,分類解讀。
一、標準鍵盤: 標準鍵盤一般都是使用8個byte上傳數(shù)據(jù)給主機。如此定義: hid_keyboard_report_descriptor =
{
0x05, 0x01, // Usage Page (Generic Desktop), 用途頁
0x09, 0x06, // Usage (Keyboard), 定義用途為鍵盤
0xA1, 0x01, // Collection (Application), Collection開始,應用開始 0x85, 0x01, // Report ID (1) 報告ID
0x05, 0x07, // Usage Page (Key Codes); 普通按鍵為07H 多媒體為0CH 電源鍵為01H //第一個字節(jié)定義 Modifier byte
0x19, 0xE0, // Usage Minimum (224),
0x29, 0xE7, // Usage Maximum (231), 用途范圍從0XE0至0XE7,Table里對應8個控制
0x15, 0x00, // Logical Minimum (0),
0x25, 0x01, // Logical Maximum (1), 邏輯范圍為0-1,因為位操作,只能0或1
0x75, 0x01, // Report Size (1), 代表每個數(shù)據(jù)是1bit*1
0x95, 0x08, // Report Count (8), 總的個數(shù)有8個,也就是8*1bit剛好一個字節(jié)
0x81, 0x02, // Input (Data, Variable, Absolute), 可變值,變量,絕對值 //第二個字節(jié)定義 Reserved byte 0x95, 0x01, // Report Count (1), 1byte
0x75, 0x08, // Report Size (8), 8*1bit=1byte
0x81, 0x03, // Input (Constant,Variable,Absolute), 常量,變量,絕對值
//此為LED輸出位,按相應的鍵,主機將返回燈的對應位,點亮該燈 0x95, 0x05, // Report Count (5), 總的有5個燈,5*1bit
0x75, 0x01, // Report Size (1), 每個數(shù)據(jù)1bit
0x05, 0x08, // Usage Page (LEDs), 定義燈的用途頁
0x19, 0x01, // Usage Minimum (1), 用途范圍NumLock、Cap Lock、Scroll Lock、Compose、Kana
0x29, 0x05, // Usage Maximum (5),
0x91, 0x02, // Output (Data, Variable, Absolute), 輸出 可變值,變量,絕對值
//剩下的3位保留,但也要定義成輸出 0x95, 0x01, // Report Count (1),
0x75, 0x03, // Report Size (3), 3*1bit
0x91, 0x03, // Output (Constant), ;LED report padding //余下6byte為標準鍵盤鍵碼,不包括多媒體按鍵和電源按鍵,因為Usage Page不一樣
0x95, 0x06, // Report Count (6), 6*1byte=6byte
0x75, 0x08, // Report Size (8), 8*1bit=1byte
0x15, 0x00, // Logical Minimum (0), 邏輯范圍 從00H到FFH
0x25, 0xff, // Logical Maximum(255),
0x05, 0x07, // Usage Page (Key Codes), 用途頁為鍵盤
0x19, 0x00, // Usage Minimum (0), 邏輯范圍從00H到FFH
0x29, 0xff, // Usage Maximum (255),
0x81, 0x00, // Input (Data, Array), ;Key arrays (6 bytes)
0xC0 // End Collection 結束應用,必須要有開始和結束
}; 二、16位鼠標 hid_mouse_report_descriptor =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 用途頁
0x09, 0x02, // USAGE (Mouse) 總用途為鼠標
0xa1, 0x01, // COLLECTION (Application) 應用
0x85, 0x01, // Report ID (1) 報告ID
0x09, 0x01, // USAGE (Pointer) 應用為指針
0xa1, 0x00, // COLLECTION (Physical) 物理特性
//第一字節(jié)低5位,5個按鍵 0x05, 0x09, // USAGE_PAGE (Button) 按鍵:左鍵,右鍵,中鍵 0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x05, // USAGE_MAXIMUM (Button 5) 從button1~button5
0x15, 0x00, // LOGICAL_MINIMUM (0) 邏輯范圍0-1,只能位0或位1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x05, // REPORT_COUNT (5) 5*1bit
0x75, 0x01, // REPORT_SIZE (1) 1bit
0x81, 0x02, // INPUT (Data,Var,Abs) 可變量,變量,絕對值 //第一字節(jié)高3位,保留位
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3) 1*3bit
0x81, 0x01, // INPUT (Cnst,Var,Abs) 常量,變量,絕對值
//第二字節(jié)+第三字節(jié)低四位:X 第三字節(jié)高4位+第四字節(jié):Y
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x16, 0x01, 0xF8, // Logical Minimum (-2047)
0x26, 0xFF, 0x07, // Logical Maximum (2047) 邏輯值從-2047至2047 16位鼠標值
0x75, 0x0C, // REPORT_SIZE (12) 每個數(shù)據(jù)12bit
0x95, 0x02, // REPORT_COUNT (2) 2*12bit=3byte
0x81, 0x06, // INPUT (Data,Var,Rel) 可變量,變量,相對值(相對上次位移量)
//第五字節(jié):滾輪Wheel
0x09, 0x38, // USAGE (Wheel)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127) 邏輯值為00~7F和FF~80
0x75, 0x08, // REPORT_SIZE (8) 每個數(shù)據(jù)8bit
0x95, 0x01, // REPORT_COUNT (1) 1*8bit=1byte
0x81, 0x06, // INPUT (Data,Var,Rel) 可變量,變量,相對值
0xc0, // END_COLLECTION 結束物理特性
0xc0, // END_COLLECTION 結束應用
};
三、系統(tǒng)電源:Power Sleep Wakeup hid_systempower_report_descriptor =
{
0x05, 0x01, // Usage Page (Generic Desktop),
0x09, 0x80, // USAGE (System control) 系統(tǒng)電源在系統(tǒng)控制里
0xa1, 0x01, // Collection (Application),
0x85, 0x02, // Report ID (2) 報告ID
0x05, 0x01, // Usage Page (Generic Desktop), 根據(jù)Table 3個系統(tǒng)鍵用途頁在01H
//字節(jié)低3位有效
0x19, 0x81, // Usage Minimum (Powerdown),
0x29, 0x83, // Usage Maximum (Wakeup), 用途從Powerdown到Wakeup
0x15, 0x00, // Logical Minimum (0), 邏輯值為0-1,因為bit只能0或1
0x25, 0x01, // Logical Maximum (1),
0x95, 0x03, // Report Count (3), 共用了3*1bit
0x75, 0x01, // Report Size (1), 1bit
0x81, 0x06, // Input (Data,Var,Rel) 可變量,變量,相對值 //字節(jié)高5位保留
0x95, 0x01, // Report Count (1),
0x75, 0x05, // Report Size (5),
0x81, 0x01, // Input (Const,Ary,Abs) 常量,數(shù)組,絕對值
0xc0, // END_COLLECTION 結束應用}; 四:多媒體按鍵 1、映射表方式 hid_Multimedia_report_descriptor = { 0x05 , 0x0C, // USAGE_PAGE (Consumer Devices) 用途頁:0CH
0x09 , 0x01, // USAGE (Consumer Control)
0xA1 , 0x01, // COLLECTION (Application)
0x85 , 0x03, // REPORT_ID (3)
0x15 , 0x00, // LOGICAL_MINIMUM (0)
0x25 , 0x01, // LOGICAL_MAXIMUM (1) 邏輯值0-1
0x75 , 0x01, // REPORT_SIZE (1) 數(shù)據(jù)位1bit
0x95 , 0x12, // REPORT_COUNT (18) 18*1bit
//18個對應的映射表
0x0A , 0x94 , 0x01, // USAGE (My Computer) 0
0x0A , 0x92 , 0x01, // USAGE (AL Calculator) 1
0x0A , 0x83 , 0x01, // USAGE (Media) 2
0x0A , 0x23 , 0x02, // USAGE (WWW Home) 3
0x0A , 0x8A , 0x01, // USAGE (AL Email) 4
0x0A , 0x2A , 0x02, // USAGE (AC Favorite) 5
0x0A , 0x21 , 0x02, // USAGE (AC Search) 6
0x0A , 0x24 , 0x02, // USAGE (AC Back) 7
0x0A , 0x25 , 0x02, // USAGE (AC Forward) 8
0x0A , 0x26 , 0x02, // USAGE (AC Stop) 9
0x0A , 0x27 , 0x02, // USAGE (AC Refresh) 10
0x09 , 0xB6, // USAGE (Scan Previous Track) 11
0x09 , 0xB5, // USAGE (Scan Next Track) 12
0x09 , 0xB7, // USAGE (Stop) 13
0x09 , 0xCD, // USAGE (Play) 14
0x09 , 0xE9, // USAGE (Volume Up) 15
0x09 , 0xEA, // USAGE (Volume Down) 16
0x09 , 0xE2, // USAGE (Mute) 17
0x81 , 0x02, // INPUT (Data,Var,Abs) 可變量,變量,絕對值 //剩下6個保留位,注意上面增減這里也要更改
0x95 , 0x01, // REPORT_COUNT (1)
0x75 , 0x06, // REPORT_SIZE (6) 18+6=24bit=3byte 所以上面更改長度,這也需要相應的更改
0x81 , 0x03, // INPUT (Cnst,Var,Abs) 常量,變量,絕對值
0xC0, // END_COLLECTION}; 2、標準格式: hid_Multimedia_report_descriptor = { 0x05, 0x0c, // USAGE_PAGE (Consumer Devices)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x03, // Report ID (3) //需要2個字節(jié)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0x80, 0x03, // LOGICAL_MAXIMUM (0380H)
0x19, 0x00, // Usage Minimum (0)
0x2a, 0x80, 0x03, // Usage Maximum (0380H)
0x75, 0x10, // REPORT_SIZE (0x10) 2*16bit=2byte
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x00, // Input (Data,Ary,Abs) 可變量,數(shù)組,絕對值
0xc0, // END_COLLECTION }; 五、游戲手柄(正在開發(fā),以下未驗證,做參考): hid_joystick_report_descriptor =
{
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x04, // Usage (Joystick) 不明白joystick跟gamepad的區(qū)別
0xA1, 0x01, // Collection (Application)
0xA1, 0x02, // Collection (Logical)
0x85, 0x04, // Report ID 4 //前5個字節(jié):X、Y、Z、Rz和保留
0x75, 0x08, // Report Size (8) 每個數(shù)據(jù)8*1bit=1byte
0x95, 0x05, // Report Count (5) 5byte
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x35, 0x00, // Physical Minimum (0)
0x46, 0xFF, 0x00, // Physical Maximum (255)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x32, // Usage (Z)
0x09, 0x35, // Usage (Rz)
0x09, 0x00, // Usage (Undefined)
0x81, 0x02, // Input (Data, Variable, Absolute) 可變量,變量,絕對值 //第六字節(jié)低4位為苦力帽 01H~07H代表8個方向
0x75, 0x04, // Report Size (4) 每個數(shù)據(jù)4bit
0x95, 0x01, // Report Count (1) 1*4bit
0x25, 0x07, // Logical Maximum (7) 邏輯值從01H~07H
0x46, 0x3B, 0x01, // Physical Maximum (315) 不理解
0x65, 0x14, // Unit (Degrees) 8個角度的集合
0x09, 0x39, // Usage (Hat switch) 用途苦力帽
0x81, 0x42, // Input (Data, Variable, Absolute, Null State) //空狀態(tài)參考P195 //第六字節(jié)高4位+第七字節(jié) = 12位,代表12個按鍵
0x65, 0x00, // Unit (None) 空組合
0x75, 0x01, // Report Size (1) 每個數(shù)據(jù)1bit
0x95, 0x0C, // Report Count (12) 12個數(shù)據(jù)
0x25, 0x01, // Logical Maximum (1) 邏輯范圍0~1
0x45, 0x01, // Physical Maximum (1)
0x05, 0x09, // Usage Page (Button) 用途頁為按鍵
0x19, 0x01, // Usage Minimum (1) button1~button12
0x29, 0x0C, // Usage Maximum (12)
0x81, 0x02, // Input (Data, Variable, Absolute) 可變量,變量,絕對值
0xC0, // End Collection
//不清楚干嘛用,也許是輸出馬達
0xA1, 0x02, // Collection (Logical)
0x75, 0x08, // Report Size (8)
0x95, 0x04, // Report Count (4)
0x46, 0xFF, 0x00, // Physical Maximum (255)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x09, 0x02, // Usage (Reserved)
0x91, 0x02, // Output (Data, Variable, Absolute)
0xC0, // End Collection
0xC0, // End Collection}
|
|