USB HID 設(shè)備類協(xié)議入門
USB HID類是比較大的一個類,HID類設(shè)備屬于人機交互操作的設(shè)備。用于控制計算機操作的一些方面,如USB鼠標,USB鍵盤,USB游戲操縱桿,USB觸摸板,USB軌跡球、電話撥號設(shè)備、VCR遙控等等設(shè)備。另外,使用HID設(shè)備的一個好處就是,操作系統(tǒng)自帶了HID類的驅(qū)動程序,而用戶無需去開發(fā)很麻煩的驅(qū)動程序,只要直接使用API調(diào)用即可完成通信。所以很多簡單的USB設(shè)備,喜歡枚舉成HID設(shè)備,這樣就可以不用安裝驅(qū)動而直接使用。
本文引用地址:http://www.biyoush.com/article/201612/329068.htm二、USB HID類可采用的通信管道
所有的HID設(shè)備通過USB的控制管道(默認管道,即端點0)和中斷管道與主機通信。
表1、USB HID規(guī)范定義的HID設(shè)備可用端點 | ||
管道 | 要求 | 說明 |
控制(端點0) | 必須 | 傳輸USB描述符、類請求代碼以及供查詢的消息數(shù)據(jù)等 |
中斷輸入 | 必須 | 傳輸從設(shè)備到主機的輸入數(shù)據(jù) |
中斷輸出 | 可選 | 傳輸從主機到設(shè)備的輸出數(shù)據(jù) |
控制管道主要用于以下3個方面:
- 接收/響應(yīng)USB主機的控制請示及相關(guān)的類數(shù)據(jù)
- 在USB主機查詢時傳輸數(shù)據(jù)(如響應(yīng)Get_Report請求等)
- 接收USB主機的數(shù)據(jù)
中斷管道主要用于以下兩個方面:
- USB主機接收USB設(shè)備的異步傳輸數(shù)據(jù)
- USB主機發(fā)送有實時性要求的數(shù)據(jù)給USB設(shè)備
從USB主機到USB設(shè)備的中斷輸出數(shù)據(jù)傳輸是可選的,當不支持中斷輸出數(shù)據(jù)傳輸時,USB主機通過控制管道將數(shù)據(jù)傳輸給USB設(shè)備。
三、與USB HID設(shè)備有關(guān)的描述符
HID設(shè)備的描述符除了5個USB的標準描述符(設(shè)備描述符、配置描述符、接口描述符、端點描述符、字符串描述符,見百合電子工作室的另一篇文章:USB開發(fā)基礎(chǔ)--USB命令(請求)和USB描述符)外,還包括3個HID設(shè)備類特定描述符:HID描述符、報告描述符、實體描述符。
除了HID的三個特定描述符組成對HID設(shè)備的解釋外,5個標準描述符中與HID設(shè)備有關(guān)的部分有:
- 設(shè)備描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三個字段的值必須為零。
- 接口描述符中bInterfaceClass的值必須為0x03,bInterfaceSubClass的值為0或1,為1表示HID設(shè)備符是一個啟動設(shè)備(Boot Device,一般對PC機而言才有意義,意思是BIOS啟動時能識別并使用您的HID設(shè)備,且只有標準鼠標或鍵盤類設(shè)備才能成為Boot Device。如果為0則只有在操作系統(tǒng)啟動后才能識別并使用您的HID設(shè)備),bInterfaceProtocol的取值含義如下表所示:
表2、HID接口描述符中bInterfaceProtocol的含義 | |
bInterfaceProtocol的取值(十進制) | 含義 |
0 | NONE |
1 | 鍵盤 |
2 | 鼠標 |
3~255 | 保留 |
下面分別對這3個HID設(shè)備類特定描述符進行說明。
1、HID描述符
HID描述符關(guān)聯(lián)于接口描述符,因而如果一個設(shè)備只有一個接口描述符,則無論它有幾個端點描述符,HID設(shè)備只有一個HID描述符。HID設(shè)備描述符主要描述HID規(guī)范的版本號、HID通信所使用的額外描述符、報表描述符的長度等。表2所示為HID描述符的結(jié)構(gòu):
表3、USB HID類描述符的結(jié)構(gòu) | ||||
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | 數(shù)字 | 此描述符的長度(以字節(jié)為單位) |
1 | bDescriptorType | 1 | 常量 | 描述符種類(此處為0x21即HID類描述符) |
2 | bcdHID | 2 | 數(shù)字 | HID規(guī)范版本號(BCD碼),采用4個16進制的BCD格式編碼,如版本1.0的BCD碼為0x0100,版本為1.1的BCD碼為0x0110 |
4 | bCountryCode | 1 | 數(shù)字 | 硬件目的國家的識別碼(BCD碼)(見表3) |
5 | bNumDescritors | 1 | 數(shù)字 | 支持的附屬描述符數(shù)目 |
6 | bDescriptorType | 1 | 常量 | HID相關(guān)描述符的類型,取值見表5 |
7 | wDescriptorLength | 2 | 數(shù)字 | 報告描述符總長度 |
9 | bDescriptorType | 1 | 常量 | 用于識別描述符類型的常量,使用在有一個以上描述符的設(shè)備 |
10 | wDescriptorLength | 2 | 數(shù)字 | 描述符總長度,使用在有一個以上描述符的設(shè)備 |
表4、HID硬件目的國家識別碼 | ||||
識別碼(十進制) | 國家和地區(qū) | 識別碼(十進制) | 國家和地區(qū) | |
00 | 不支持 | 18 | Netherlands/Dutch | |
01 | Arabic | 19 | Norwegian | |
02 | Belgian | 20 | Persian (Farsi) | |
03 | Canadian-Bilingual | 21 | Poland | |
04 | Canadian-French | 22 | Portuguese | |
05 | Czech Republic | 23 | Russia | |
06 | Danish | 24 | Slovakia | |
07 | Finnish | 25 | Spanish | |
08 | French | 26 | Swedish | |
09 | German | 27 | Swiss/French | |
10 | Greek | 28 | Swiss/German | |
11 | Hebrew | 29 | Switzerland | |
12 | Hungary | 30 | Taiwan | |
13 | International (ISO) | 31 | Turkish-Q | |
14 | Italian | 32 | UK | |
15 | Japan (Katakana) | 33 | US | |
16 | Korean | 34 | Yugoslavia | |
17 | Latin American | 35 | Turkish-F | |
36~255 | Reserved |
表5、HID相關(guān)描述符類型定義 | |
描述符類型值 | HID相關(guān)描述符類型 |
0x21 | HID描述符 |
0x22 | 報表描述符 |
0x23 | 實體描述符 |
2、報告描述符
HID設(shè)備的報告描述符比較復(fù)雜也比較難理解。
報告描述符的語法不同于USB標準描述符,它是以項目(items)方式排列而成,無一定的長度。HID的報告描述符已經(jīng)不是簡簡單單的描述某個值對應(yīng)某個固定意義了,它已經(jīng)能夠組合出很多種情況,并且需要PC上的HID驅(qū)動程序提供parser解釋器來對描述的設(shè)備情形進行重新解釋,進而組合生成出本HID硬件設(shè)備獨特的數(shù)據(jù)流格式,所以我覺得可以把它理解為“報告描述符腳本語言”更為貼切。我們使用“報告描述符”專用腳本語言,讓用戶來自己定義他們的HID設(shè)備都有什么數(shù)據(jù)、以及這些數(shù)據(jù)各個位(bit)都有什么意義。
有關(guān)報告描述符的詳細信息可參考USB HID協(xié)議,USB協(xié)會提供了一個HID描述符編輯工具稱作HID Descriptor Tool,用它可方便生成我們的報告描述符。
3、實體描述符
實體描述符被用來描述設(shè)備的行為特性。實體描述符是可選的描述符,HID設(shè)備可以根據(jù)其本體的設(shè)備特性選擇是否包含實體描述符。表5所示為HID的實體描述符結(jié)構(gòu)。
表6、HID實體描述符的結(jié)構(gòu) | |||
偏移量 | 域 | 大小 | 說明 |
0 | bDesignator | 1 | 用來指定本體的哪一部分影響項目(含義見表6) |
1 | bFlags | 1 | 位指定標志 位0~4:Effort 位5~7:Qualifier(含義見表7) |
表7、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 | 無名指 |
表8、Qualifier取值含義 | ||||
Qualifier取值 | 含義 | Qualifier取值 | 含義 | |
0x00 | 無 | 0x04 | 其中之一 | |
0x01 | 右 | 0x05 | 中間 | |
0x02 | 左 | 0x06 | 保留 | |
0x03 | 兩者同時 | 0x07 | 保留 |
四、USB HID類命令(請求)
HID設(shè)備類特定的命令(請求)有6個,它們分別是Get_Report、Get_Idle、Get_Protocol、Set_Report、Set_Idle和Set_Protocol。
HID類請求(命令)數(shù)據(jù)包格式如表8所示:
表9、HID類請求(命令)包格式 | |||
偏移量 | 域 | 大小 | 說明 |
0 | bmRequestType | 1 | HID設(shè)備類請求特性如下: 因而,針對HID的設(shè)備類請求,僅僅10100001和00100001有效 |
1 | bRequest | 1 | HID類請求(參考表9) |
2 | wValue | 2 | 高字節(jié)說明描述符的類型(參考表5),而低字節(jié)為非0值時被用來選定實體描述符。 |
4 | wIndex | 2 | 2字節(jié)數(shù)值,根據(jù)不同的bRequest有不同的意義 |
6 | wLength | 2 | 該請求的數(shù)據(jù)段長度 |
表10、HID類請求 | ||
數(shù)值 | HID類請求描述符 | 注釋 |
0x01 | GET_REPORT | |
0x02 | GET_IDLE | |
0x03 | GET_PROTOCOL | 僅僅適應(yīng)于支持啟動功能的HID設(shè)備(Boot Device) |
0x09 | SET_REPORT | |
0x0A | SET_IDLE | |
0x0B | SET_PROTOCOL | 僅僅適應(yīng)于支持啟動功能的HID設(shè)備(Boot Device) |
USB主機在請求HID設(shè)備的配置描述符時,設(shè)備首先返回的描述符為:配置描述符、接口描述符、HID描述符、端點描述符。HID描述符里包含了其附屬的描述的類型和長度(如報告描述符),然后主機再根據(jù)HID描述符的信息請求其相關(guān)的描述符。
評論