當(dāng)BLE遇上MEMS——HID報(bào)告描述符介紹本帖最后由 lb8820265 于 2020-9-13 19:13 編輯HID(human interface device)也就是人機(jī)接口設(shè)備,我們常見(jiàn)的鼠標(biāo)鍵盤游戲手柄等都是HID,操作系統(tǒng)自帶HID驅(qū)動(dòng)的,有USB接口的,也有藍(lán)牙接口的,都是相似的通信協(xié)議。因此這里參考USB接口的HID協(xié)議進(jìn)行介紹。主要參考https://www.usb.org/hid網(wǎng)站中的兩篇文檔《Device Class Definition for HID 1.11 》《HID Usage Tables 1.2 》,可以直接在官網(wǎng)下載,也可以從本文附件中下載。
HID有自己協(xié)議,叫做報(bào)告描述符,用來(lái)描述發(fā)送的數(shù)據(jù)代表的含義(并不是發(fā)送的數(shù)據(jù)),包括是什么設(shè)備:鼠標(biāo)、鍵盤、手柄等,和每一字節(jié)的含義。下面以鍵盤的報(bào)告描述符為例具體介紹。 參考例程: nRF5_SDK_15.3.0_59ac345examplesle_peripheralle_app_hids_keyboard main.c函數(shù)中的報(bào)告描述符如下表。 報(bào)告描述符簡(jiǎn)介0x05, 0x01, // Usage Pg (Generic Desktop)這是一個(gè)global類Usage Page作用數(shù)據(jù)0x09, 0x06, // Usage (Keyboard)表示這是一個(gè)鍵盤0xA1, 0x01, // Collection: (Application)表示下面所包含的是對(duì)鍵盤的解釋0x05, 0x07, // Usage Pg (Key Codes)定義的是按鍵碼0x19, 0xE0, // Usage Min (224)0x29, 0xE7, // Usage Max (231)按鍵碼分別是 224~231,共總有 8 個(gè)按鍵碼0x15, 0x00, // Log Min (0)0x25, 0x01, // Log Max (1)按鍵碼的值是 0 和 1,分別代表放開(kāi)和按下0x75, 0x01, // Report Size (1)0x95, 0x08, // Report Count (8)用 8 個(gè) bit 分別表示 8 個(gè)按鍵的狀態(tài)0x81, 0x02, // Input: (Data, Variable,Absolute)將這 8 個(gè) bit 添加到本報(bào)告中0x95, 0x01, // Report Count (1)0x75, 0x08, // Report Size (8)0x81, 0x01, // Input: (Constant)另外再預(yù)留 8 個(gè) bit 備用,暫時(shí)沒(méi)用0x95, 0x05, // Report Count (5)0x75, 0x01, // Report Size (1)定義 5 個(gè) 1bit0x05, 0x08, // Usage Pg (LEDs)這是 LED0x19, 0x01, // Usage Min (1)0x29, 0x05, // Usage Max (5)5 個(gè) bit 分別對(duì)應(yīng) LED1~LED50x91, 0x02, // Output: (Data, Variable,Absolute)將這 5 個(gè) bit 添加到本報(bào)告中,LED 需要作為 OUT0x95, 0x01, // Report Count (1)0x75, 0x03, // Report Size (3)0x91, 0x01, // Output: (Constant)再增加 3 個(gè) bit,與上面 5 個(gè) bit 組成一個(gè)字節(jié)0x95, 0x06, // Report Count (6)0x75, 0x08, // Report Size (8)定義 6 個(gè)字節(jié)0x15, 0x00, // Log Min (0)0x25, 0x65, // Log Max (101)每個(gè)字節(jié)的取值范圍是 0~1010x05, 0x07, // Usage Pg (Key Codes)這個(gè)也是鍵盤碼0x19, 0x00, // Usage Min (0)0x29, 0x65, // Usage Max (101)分別是鍵盤碼 0~鍵盤碼 1010x81, 0x00, // Input: (Data, Array)將這 6 個(gè)字節(jié)添加到本報(bào)告中,表示同時(shí)可產(chǎn)生 6 個(gè)鍵值。0xC0, // End Collection結(jié)束表中左邊每一列由一個(gè)或者兩個(gè)數(shù)字組成,第一個(gè)數(shù)字是前綴,第二個(gè)是數(shù)據(jù)(可無(wú)) 例如:0x05, 0x01, // USAGE_PAGE (Generic Desktop) 單位需要多本通信工程師職稱證書掛資質(zhì),歡迎聯(lián)系 150-0759-9549-微同 0x05表示前綴,0x01為數(shù)據(jù)部分,先看前綴,0x05轉(zhuǎn)換成二進(jìn)制,就是00000101,按照HID類協(xié)議的定義,這個(gè)字節(jié)被分成3個(gè)部分:(參考hid1_11.pdf) bit0~bit1代表的是這個(gè)前綴后面跟的數(shù)據(jù)長(zhǎng)度,兩位可以表示最大4字節(jié)的數(shù)據(jù),即bsize
bit2~bit3代表的是這個(gè)前綴的類型,總共可以有三種類型:00=main,01=global,10=local,11=reserved; bit4~bit7代表前綴的tag,這里根據(jù)bit2~bit3的不同類型有不同的定義,例如global類型下的定義如下圖。(參考hid1_11.pdf) 0000就表示Usage Page。所以前綴0x05代表的含義就是:一個(gè)global類型Usage Page作用數(shù)據(jù)量為1的前綴。
那我們做一個(gè)練習(xí)題:第二行出現(xiàn)的0x09,二進(jìn)制就是:00001001,這就是local類型Usage Page作用數(shù)據(jù)量為1的前綴(local類型具體可以查看hid1_11.pdf的Local Items章節(jié))。 下面來(lái)看數(shù)據(jù)0x01的作用 前綴是global類型Usage Page作用,那么這就要查看Usage Page作用的具體介紹。(參考hut1_2.pdf) 0x01表示Generic Desktop,表示桌面控制類型的設(shè)備,但具體是什么設(shè)備就要看第二行。
前面介紹了第二行0x09表示local類型Usage Page作用,參數(shù)為0x06,0x06表示鍵盤,查表如下。 這里主要就是介紹報(bào)告描述符的查閱方法,其他的描述符同樣可以按照上述方法進(jìn)行查閱。
鍵盤描述符的后定義的是發(fā)送數(shù)據(jù)的類型與格式。如下: 翻譯出來(lái)就是,該協(xié)議支持一次最多發(fā)送6個(gè)按鈕(鍵值0~101),支持最多同時(shí)按下8個(gè)功能按鍵(鍵值224~231)。鍵值表詳見(jiàn)附件。
舉例 例如我想要發(fā)送向上按鈕,查表得出向上的鍵值是0x52(82),所以發(fā)送的8Byte數(shù)據(jù)為。 Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x000x000x520x000x000x000x000x00例如我想發(fā)送Ctrl+A,查表得出左Ctrl的鍵值為0xE0(224),也就是第一字節(jié)的第一位為1,A的鍵值為4。所以發(fā)送的8Byte數(shù)據(jù)為。 Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x800x000x040x000x000x000x000x00此帖出自MEMS傳感器論壇 |