USB HID 協議入門


轉載請注明來源:cuixiaolei的技術博客


 

 

USB HID設備類的應用場合

  USB HID類是USB設備的一個標准設備類,包括的設備非常多。HID類設備定義它屬於人機交互操作的設備,用於控制計算機操作的一些方面,如USB鼠標、USB鍵盤、USB游戲操縱桿等。但HID設備類不一定要有人機接口,只要符合HID類別規范的設備都是HID設備。

  USB HID設備的一個好處就是操作系統自帶了HID類的驅動程序,而用戶無需去開發驅動程序,只要使用API系統調用即可完成通信。

 


 

USB HID設備類的通信管道

   所有的HID設備通過USB的控制管道(默認管道,即端點0)和中斷管道(端點1或端點2)與主機進行通信。

  管道        要求      說明

  控制(端點0)    必須      傳輸USB描述符、類請求代碼以及供查詢的消息數據

  中斷輸入      必須      傳輸從設備到主機的輸入數據

  中斷輸出      可選      傳輸從主機到設備的輸出數據

注:USB主機為PC,USB設備如鼠標等。

 

  控制管道主要用於下面3個方面

  • 接收/響應USB主機的控制請求以及相關的類數據
  • 在USB主機查詢時傳輸數據(如響應Get_Report請求等)
  • 接收USB主機的數據

 

  中斷管道主要用於下面兩個方面

  • USB主機接收USB設備的異步傳輸數據
  • USB主機發送有實時性要求的數據給USB設備

  從USB主機到USB設備的中斷輸出數據傳輸是可選的,當不支持中斷輸出數據時,USB主機通過控制管道將數據傳輸給USB設備。

 


 

與USB HID設備有關的描述符

  HID設備的描述符除了5個USB的標准描述符(設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符)外,還包括三個HID設備類特定的描述符:HID描述符、報告描述符、實體描述符。

  除了HID的三個特定描述符組成對HID設備的解釋外,5個標准描述符中與HID設備有關的部分有:

  • 設備描述符中:bDeviceClass, bDeviceSubClass, bDeviceProtocol三個值必須為0
  • 接口描述符中:bInterfaceClass的值必須時0x03, bInterfaceSubClass的值為0或1, 為1表示HID設備是一個啟動設備(Boot Device, 一般對PC機有意義,意思是BIOS啟動時能識別您使用的HID設備,切只有標准鼠標或者鍵盤才能稱為Boot Device),為0表示HID設備是操作系統啟動厚才能識別使用的設備。bInterfaceProtocol的取值含義如下:

  bInterfaceProtocol的取值(十進制)    含義

  0                    NONE

  1                    鍵盤

  2                    鼠標

  3-255                   保留

 

  下面分別對3個HID設備類特定描述符進行說明:

1.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           實體描述符

 

2.報告描述符

  HID設備的報告描述符比較復雜,也比較難理解。

  報告描述符的語法不同於USB標准描述符,它是以項目(item)方式排列而成,沒有固定長度。HID的報告描述符已經不是簡單的描述某個值對飲過的固定意義了,它已經能夠組合出很多種情況,而且需要PC上的HID驅動程序提供parser解釋器來對描述符的設備情形進行重新解釋,進而組合生成本HID硬件設備獨特的數據流格式,所以可以把它理解為“報告描述符腳本語言”更為貼切。我們使用“報告描述符”專用腳本語言,讓用戶來自己定義它們的HID設備都有什么數據,以及這些數據各個位(bit)都有什么意義。

  有關報告描述符的詳細信息可以參考USB HID協議,USB協會提供了一個HID描述符編輯工具稱作HID Descriptor Tool,用它可以方便生成我們的報告描述符。

  一個USB HID設備可以包含多種功能的報告描述符合集,這樣可以實現復合設備,如帶鼠標功能的USB鍵盤,這種復合鍵盤可以通過在報告描述符里包含鼠標和鍵盤兩種報告實現,兩個報告用報告ID來區分。

 

3.實體描述符

  實體描述符被用來描述設備的行為特性。實體描述符是可選的描述符,HID設備可以根據其本體的設備特性選擇是否包含實體描述符。HID的實體描述符結構如下表:

偏移量      域      大小      說明

0        bDesignator  1        用來指定本體的那一部分影響項目,見下表

1        bFlags     1        位指定標志

                        位0~4:Effort

                        位5~7:Qualifier,見下表

 

 

 

表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類命令(請求)

 

偏移量 大小 說明
0 bmRequestType 1

HID設備類請求特性如下:
位7:
0=從USB HOST到USB設備
1=從USB設備到USB HOST
位6~5:
01=請求類型為設備類請求
位4~0:
0001=請求對象為接口(interface)

因而,針對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描述符的信息請求其相關的描述符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM