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