USB HID類是USB設備的一個標準設備類,包括的設備很是多。HID類設備定義它屬於人機交互操做的設備,用於控制計算機操做的一些方面,如USB鼠標、USB鍵盤、USB遊戲操縱桿等。但HID設備類不必定要有人機接口,只要符合HID類別規範的設備都是HID設備。異步
USB HID設備的一個好處就是操做系統自帶了HID類的驅動程序,而用戶無需去開發驅動程序,只要使用API系統調用便可完成通訊。工具
全部的HID設備經過USB的控制管道(默認管道,即端點0)和中斷管道(端點1或端點2)與主機進行通訊。ui
管道 要求 說明編碼
控制(端點0) 必須 傳輸USB描述符、類請求代碼以及供查詢的消息數據操作系統
中斷輸入 必須 傳輸從設備到主機的輸入數據對象
中斷輸出 可選 傳輸從主機到設備的輸出數據blog
注:USB主機爲PC,USB設備如鼠標等。接口
控制管道主要用於下面3個方面遊戲
中斷管道主要用於下面兩個方面ip
從USB主機到USB設備的中斷輸出數據傳輸是可選的,當不支持中斷輸出數據時,USB主機經過控制管道將數據傳輸給USB設備。
HID設備的描述符除了5個USB的標準描述符(設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符)外,還包括三個HID設備類特定的描述符:HID描述符、報告描述符、實體描述符。
除了HID的三個特定描述符組成對HID設備的解釋外,5個標準描述符中與HID設備有關的部分有:
bInterfaceProtocol的取值(十進制) 含義
0 NONE
1 鍵盤
2 鼠標
3-255 保留
下面分別對3個HID設備類特定描述符進行說明:
HID描述符關聯於接口描述符,於是若是一個設備只有一個接口描述符,則不管它有幾個端點描述符,HID設備只有一個HID描述符。HID設備描述符主要描述HID規範的版本號, HID通訊所使用的額外描述符, 報表描述符的長度等。下表爲HID描述符的結構。
偏移量 域 大小 值 描述
0 bLength 1 數字 此描述符的長度,以字節爲單位
1 bDescriptorType 1 常量 描述符種類(此處0X21爲HID類)
2 bcdHID 2 數字 HID規範版本號(BCD碼),採用4個16進制的BCD格式編碼,如版本1.0,0x0100,版本1.1,0x10110
4 bCountryCode 1 數字 硬件目的國家的識別碼
5 bNumDescriptors 1 數字 支持的附屬描述符數目
6 bDescriptorType 1 常量 HID相關描述符的類型,見下表
7 wDescriptorLength 2 數字 報告描述符的總長度
9 bDescriptorType 1 常量 用於識別描述符類型的常量,使用有一個以上描述符的設備
10 wDescriptorLength 2 數字 描述符總長度,使用在有一個以上描述符的設備
HID相關描述符類型定義
描述符類型值 HID相關描述符類型
0x21 HID描述符
0x22 報表描述符
0x23 實體描述符
HID設備的報告描述符比較複雜,也比較難理解。
報告描述符的語法不一樣於USB標準描述符,它是以項目(item)方式排列而成,沒有固定長度。HID的報告描述符已經不是簡單的描述某個值對飲過的固定意義了,它已經可以組合出不少種狀況,並且須要PC上的HID驅動程序提供parser解釋器來對描述符的設備情形進行從新解釋,進而組合生成本HID硬件設備獨特的數據流格式,因此能夠把它理解爲「報告描述符腳本語言」更爲貼切。咱們使用「報告描述符」專用腳本語言,讓用戶來本身定義它們的HID設備都有什麼數據,以及這些數據各個位(bit)都有什麼意義。
有關報告描述符的詳細信息能夠參考USB HID協議,USB協會提供了一個HID描述符編輯工具稱做HID Descriptor Tool,用它能夠方便生成咱們的報告描述符。
一個USB HID設備能夠包含多種功能的報告描述符合集,這樣能夠實現複合設備,如帶鼠標功能的USB鍵盤,這種複合鍵盤能夠經過在報告描述符裏包含鼠標和鍵盤兩種報告實現,兩個報告用報告ID來區分。
實體描述符被用來描述設備的行爲特性。實體描述符是可選的描述符,HID設備能夠根據其本體的設備特性選擇是否包含實體描述符。HID的實體描述符結構以下表:
偏移量 域 大小 說明
0 bDesignator 1 用來指定本體的那一部分影響項目,見下表
1 bFlags 1 位指定標誌
位0~4:Effort
位5~7:Qualifier,見下表
表七、bDesignator取值含義表 | ||||
bDesignator取值 | 含義 | bDesignator取值 | 含義 | |
0x00 | 無 | 0x15 | 小指 | |
0x01 | 手 | 0x16 | 頭 | |
0x02 | 眼球 | 0x17 | 肩 | |
0x03 | 眉 | 0x18 | 腰骨 | |
0x04 | 眼皮 | 0x19 | 腰 | |
0x05 | 耳 | 0x1A | 大腿 | |
0x06 | 鼻 | 0x1B | 膝蓋 | |
0x07 | 嘴 | 0x1C | 小腿 | |
0x08 | 上脣 | 0x1D | 足 | |
0x09 | 下脣 | 0x1E | 腳 | |
0x0A | 顎 | 0x1F | 腳跟 | |
0x0B | 頸 | 0x20 | 拇指 | |
0x0C | 上臂 | 0x21 | 大拇指 | |
0x0D | 手肘 | 0x22 | 第二指 | |
0x0E | 前臂 | 0x23 | 第三指 | |
0x0F | 手腕 | 0x24 | 第四指 | |
0x10 | 手掌 | 0x25 | 小拇指 | |
0x11 | 拇指 | 0x26 | 眉 | |
0x12 | 食指 | 0x27 | 臉 | |
0x13 | 中指 | 0x28~0xFF | 保留 | |
0x14 | 無名指 |
表八、Qualifier取值含義 | ||||
Qualifier取值 | 含義 | Qualifier取值 | 含義 | |
0x00 | 無 | 0x04 | 其中之一 | |
0x01 | 右 | 0x05 | 中間 | |
0x02 | 左 | 0x06 | 保留 | |
0x03 | 二者同時 | 0x07 | 保留 |
偏移量 | 域 | 大小 | 說明 |
0 | bmRequestType | 1 | HID設備類請求特性以下: 於是,針對HID的設備類請求,僅僅10100001和00100001有效 |
1 | bRequest | 1 | HID類請求(參考表10) |
2 | wValue | 2 | 高字節說明描述符的類型(參考表5),而低字節爲非0值時被用來選定實體描述符。 |
4 | wIndex | 2 | 2字節數值,根據不一樣的bRequest有不一樣的意義 |
6 | wLength | 2 | 該請求的數據段長度 |
數值 | HID類請求描述符 | 註釋 |
0x01 | GET_REPORT | |
0x02 | GET_IDLE | |
0x03 | GET_PROTOCOL | 僅僅適應於支持啓動功能的HID設備(Boot Device) |
0x09 | SET_REPORT | |
0x0A | SET_IDLE | |
0x0B | SET_PROTOCOL | 僅僅適應於支持啓動功能的HID設備(Boot Device) |
USB主機在請求HID設備的配置描述符時,設備須要按照順序返回下面幾種描述符:配置描述符, 接口描述符, HID描述符, 端點描述符。HID描述符裏又包含了其附屬的描述符的類型和長度(如報告描述符),而後主機再根據HID描述符的信息請求其相關的描述符。