{{Ptl}}模板已棄用。 {{Ptl}}模板已棄用。
此處記錄本人學習HID期間總結出來的知識點,這些知識點可以作為快速對照的手冊或解答學習期間疑惑的輔助文本。
此處文檔均描述1.11版本的HID接口。開發HID接口所需的基礎知識點如下:
HID接口的特點就是包羅萬象,上到滑鼠鍵盤遊戲手柄、下到醫療設施鍵盤、盲文閱讀器、FIDO聯機身份驗證器都可以直接使用這個接口進行人機互動。
HID設備用於功能實現的基礎是「數據報表」,數據報表需要設備在配置期間聲明「數據報表格式」,配置結束後,就需要按照所聲明的格式,將對應數據通過「數據報表」與主機進行交換。
在USB主機{{Ptl}}模板已棄用。一個HID設備時,設備需要在傳輸配置描述符之後,單獨根據USB請求傳輸「數據報表格式描述符」(亦稱「報告描述符」)。 數據報表格式描述符的作用看起來很簡單但實施起來困難,具體作用如下:
數據報表格式描述符的基本組成格式為「報表格式項目」,報表項目有「長項目」和「短項目」兩種數據格式,但由於HID1.11從不使用「長項目」,所以只能學習「短項目」數據格式,且報表項目統一由「報頭」和「報文」構成。
| 數據報送順序先報→後報 | |||||||||||||||||||||||
| 報頭 | 報文 | ||||||||||||||||||||||
| 報頭編碼 | 報頭分類 | 數據長度 | 報文第1位元組 | 報文第0位元組 | |||||||||||||||||||
| {{Ptl}}模板已棄用。 | {{Ptl}}模板已棄用。 | {{Ptl}}模板已棄用。 | {{Ptl}}模板已棄用。 | {{Ptl}}模板已棄用。 | {{Ptl}}模板已棄用。 | {{Ptl}}模板已棄用。 | {{Ptl}}模板已棄用。 | 01H | 00H | ||||||||||||||
按照現實生活類比,「報頭」表示特性類別,「報文」表示對應內容。
| ↓「報頭」 | ↓「報文」 |
| 姓名 | 李皇諦 |
|---|---|
| 性別 | 男性 |
| 個性簽名 | 男人有夢,不過如三:至親、摯愛、致遠。 |
| 個人持有帳戶主頁 |
「報頭」內存行裡的內容,不僅會決定報頭對應的屬性類別,還會決定報文的數據長度。
| 「內存行」名詞註解 |
|---|
|
學習HID乃至USB之前,必須精通數電基礎。 「內存」一般指DRAM緩存,「內存」所存放的數據「內存行」是其構建的基礎單位。 「內存行」表示存放對應數據的一組邏輯位,如無特殊說明,一行內存為1位元組,佔用8個邏輯位。
|
| 報文類型 | 原始數據 | 解析結果 |
|---|---|---|
| 空報文 | 0xC0, | END_COLLECTION |
| 1位元組報文 | 0x05, 0x01, | USAGE_PAGE(Generic Desktop) |
| 2位元組報文 | 0x26, 0x7F, 0xFF, | LOGICAL_MAXIMUM(32767) |
| 4位元組報文 | 0x0B, 0x20, 0x00, 0xD0, 0xF1, | USAGE(0xF1D0:FIDO_Alliance, 0x0020:Input_Report_Data) |
| 觀前提示 |
| |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0位元組 void |
| |||||||||||||||
| 1位元組 BYTE |
| |||||||||||||||
| 2位元組 WORD |
| |||||||||||||||
| 4位元組 DWORD |
| |||||||||||||||
「報頭」由3個欄位構成,總大小為1位元組。4個邏輯位的「報頭聲明」、2個邏輯位的「報頭分類」和2個邏輯位的「數據長度」,且「數據長度」會影響「報文」的數據大小。
| 原始數據 | 報頭分類(翻譯)1 | 報文長度 | 注意事項 |
|---|---|---|---|
| 0x00 | MAIN/基礎功能 | 0位元組 |
|
| 0x01 | GLOBAL/廣義聲明 | 1位元組 | |
| 0x02 | LOCAL/狹義聲明 | 2位元組 | |
| 0x03 | LONG/長項目修飾符2 | 3位元組 |
| 原始數據 | 報頭名稱 | 使用方法 | |
|---|---|---|---|
| MAIN / 基礎功能 控制HID解析器執行報表製成或分組 | |||
| 0x80 | INPUT 打包數據入表 |
報表打包:根據修飾屬性和註冊的用途清單,創建對應內存行/寄存器。
| |
| 0x90 | OUTPUT 打包數據出表 | ||
| 0xB0 | FEATURE 打包設備特性表 | ||
| 0xA0 | COLLECTION 集合起始域 |
集合或分組:創建報文分組,提高HID解析器和電腦軟體的解析效率。
| |
| 0xC0 | END_COLLECTION 集合結束域 | ||
| |||
| GLOBAL / 廣義聲明 修飾一個數據報表的擴展屬性 | |||
| 0x00 | USAGE_PAGE 定位用途類別 |
用途註冊:向HID解析器添加可能會用到的用途。其中此報頭用於定位用途所在的類別表格編號。
| |
| 0x10 | LOGICAL_MINIMUM 數字域最小值 |
數據極值:劃定有效數據的最大值/最小值範圍。
| |
| 0x20 | LOGICAL_MAXIMUM 數字域最大值 | ||
| 0x30 | PHYSICAL_MINIMUM 實體域最小值 | ||
| 0x40 | PHYSICAL_MAXIMUM 實體域最大值 | ||
| 0x50 | UNIT_EXPONENT 實體域10乘倍數 |
實體域單位聲明:聲明數據對應的單位與10乘倍數。
| |
| 0x60 | UNIT 實體域單位與導數 | ||
| 0x80 | REPORT_ID 數據報表編號 |
多重數據報表:聲明對應報表所處的編號。
| |
| 0x70 | REPORT_SIZE 項目佔用大小 |
數據格式:聲明單次註冊(數據打包)所需要的項目數量與單個項目的佔用大小。
| |
| 0x90 | REPORT_COUNT 打包所需項目個數 | ||
| 0xA0 | PUSH 廣義聲明存檔 |
廣義聲明緩存區:用於快速複製廣義聲明修飾的屬性
| |
| 0xB0 | POP 廣義聲明讀檔 | ||
| |||
| LOCAL / 狹義聲明 具有限定範圍的屬性修飾符 | |||
| |||