USB HID 協議入門

2021-10-21 04:00:47 字數 4180 閱讀 1814

usb hid類是usb裝置的乙個標準裝置類,包括的裝置非常多。hid類裝置定義它屬於人機互動操作的裝置,用於控制計算機操作的一些方面,如usb滑鼠、usb鍵盤、usb遊戲操縱桿等。但hid裝置類不一定要有人機介面,只要符合hid類別規範的裝置都是hid裝置。

usb hid裝置的乙個好處就是作業系統自帶了hid類的驅動程式,而使用者無需去開發驅動程式,只要使用api系統呼叫即可完成通訊。

所有的hid裝置通過usb的控制管道(預設管道,即端點0)和中斷管道(端點1或端點2)與主機進行通訊。

管道        要求      說明

控制(端點0)    必須      傳輸usb描述符、類請求**以及供查詢的訊息資料

中斷輸入      必須      傳輸從裝置到主機的輸入資料

中斷輸出      可選      傳輸從主機到裝置的輸出資料

注:usb主機為pc,usb裝置如滑鼠等。

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

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

從usb主機到usb裝置的中斷輸出資料傳輸是可選的,當不支援中斷輸出資料時,usb主機通過控制管道將資料傳輸給usb裝置。

hid裝置的描述符除了5個usb的標準描述符(裝置描述符、配置描述符、介面描述符、端點描述符、字串描述符)外,還包括三個hid裝置類特定的描述符:hid描述符、報告描述符、實體描述符。

除了hid的三個特定描述符組成對hid裝置的解釋外,5個標準描述符中與hid裝置有關的部分有:

binte***ceprotocol的取值(十進位制)    含義

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鍵盤,這種復合鍵盤可以通過在報告描述符裡包含滑鼠和鍵盤兩種報告實現,兩個報告用報告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保留

偏移量域

大**明

0bmrequesttype

1hid裝置類請求特性如下:

位7:0=從usb host到usb裝置

1=從usb裝置到usb host

位6~5:

01=請求型別為裝置類請求

位4~0:

0001=請求物件為介面(inte***ce)

因而,針對hid的裝置類請求,僅僅10100001和00100001有效

1brequest

1hid類請求(參考表10)

2wvalue

2高位元組說明描述符的型別(參考表5),而低位元組為非0值時被用來選定實體描述符。

4windex

22位元組數值,根據不同的brequest有不同的意義

6wlength

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描述符的資訊請求其相關的描述符。

關於USBHID協議以及滑鼠鍵盤描述符的解釋

前面有提到關於scsi協議的usb裝置實現。現在來談談usbhid裝置。hid全稱human inte ce device。hid協議裡增加了hid描述符和報告描述符,以及特定的關於hid的類請求。hid裝置的通訊是通過報表來進行的。據說,報告描述符是usb裝置中最難的描述符了。關於hid描述符可以...

VC 識別USB HID裝置

遇到問題 和論壇中一樣,不過前輩是2007年遇到的。有乙個usb裝置,在裝置管理器中顯示為乙個磁碟驅動器,但是它是沒有碟符的,在ondevicechange中,當這個裝置插入或者拔插的時候產生多個dbt devnodes changed,而dbt devicearrival,dbt devicere...

OSPF協議入門

ospf是乙個基於鏈路狀態的動態路由協議 屬於igp的一種 基本思路 在自治系統中的每一台執行ospf的路由器收集各自的介面 鄰接資訊成為鏈路狀態,通過flooding演算法在整個系統廣播自己的鏈路狀態,使得整個系統內部維護有個同步的鏈路狀態資料庫,割據這一資料庫,路由器計算出以自己為根,其它網路節...