本文對前面提到的USB列舉過程中的標準請求以及各種描述符做出大致解釋,方便後面的實操。
USB協定定義了一個8位元組的標準裝置請求,主要用在裝置的列舉過程。這8位元組的數據是在控制傳輸的建立過程通過預設控制端點0發出的。在這8位元組的數據中,包含了數據過程所需要傳輸數據的傳輸方向,長度以及數據型別。
USB標準裝置請求的數據結構:
偏移量/位元組 | 域 | 大小/位元組 | 取值 | 說明 |
---|---|---|---|---|
0 | bmRequestType | 1 | 點陣圖 | 請求特性:【D7:數據的傳輸方向;0-主機到裝置;1-裝置到主機】【D6-5:請求的型別;0-標準請求;1-類;2-廠商;3-保留】【D4-0:請求的接收者;0-裝置;1-介面;2-端點;3-其他;4~保留】 |
1 | bRequest | 1 | 數值 | 請求程式碼 |
2 | wValue | 2 | 數值 | 該域的意義由具體的請求決定 |
4 | wIndex | 2 | 索引或偏移量 | 該域的意義由具體的請求決定 |
6 | wLength | 2 | 位元組數 | 數據過程所需要傳輸的位元組數 |
針對標準請求(bmRequestType[6:5]=00),USB協定定義了11個 標準請求程式碼(bRequest):
bmRequestType | bRequest | wValue | wIndex | wLength | 數據過程 |
---|---|---|---|---|---|
0x00/0x01/0x02 | 1(CLEAR_FEATURE) | 特性選擇 | 0/介面號/端點號 | 0 | 無 |
0x80 | 8(GET_CONFIGURATION) | 0 | 0 | 1 | 設定值 |
0x80 | 6(GET_DESCRIPTOR) | 描述符型別(高位元組)或索引(低位元組) | 0或者語言ID | 描述符長度 | 描述符 |
0x81 | 10(GET_INTERFACE) | 0 | 介面號 | 1 | 備用介面號 |
0x80/0x81/0x82 | 0(GET_STATUS) | 0 | 0/介面號/端點號 | 2 | 裝置,介面或者端點狀態 |
0x00 | 5(SET_ADDRESS) | 裝置地址 | 0 | 0 | 無 |
0x00 | 9(SET_CONFIGURATION) | 設定值 | 0 | 0 | 無 |
0x00 | 7(SET_DESCRIPTOR) | 描述符型別和索引 | 0或語言ID | 描述符長度 | 描述符 |
0x00/0x01/0x02 | 3(SET_FEATURE) | 特性選擇 | 0/介面號/端點號 | 0 | 沒有 |
0x01 | 11(SET_INTERFACE) | 備用介面號 | 介面號 | 0 | 無 |
0x82 | 12(SYNCH_FRAME) | 0 | 端點號 | 2 | 幀號 |
裝置描述符主要記錄的資訊有:裝置所使用的USB協定版本號,裝置型別,端點0的最大包大小,廠商ID(VID)和產品ID(PID),裝置版本號,廠商字串索引,產品字串索引,裝置序列號索引,可能的設定數等。
裝置描述符結構 :
偏移量/位元組 | 域 | 大小/位元組 | 說明 |
---|---|---|---|
0 | bLength | 1 | 該描述符的長度(18位元組) |
1 | bDescriptorType | 1 | 描述符型別(裝置描述符爲0x01),見表 |
2 | bcdUSB | 2 | 本裝置所使用的USB協定版本(USB2.0 0x00 0x02),小端模式 |
4 | bDeviceClass | 1 | 裝置所使用的類程式碼,由USB協會規定,見表;對於大多數標準的USB裝置類,該欄位通常設定爲0;當bDeviceClass爲0的時候,下面 下麪的bDeviceSubClass和bDeviceProtocol也必須爲0;如果bDevice爲0xff,表示廠商自定義裝置類 |
5 | bDeviceSubClass | 1 | 裝置所使用的子類程式碼,當bDeviceClass不爲0或者0xff的時候,由USB協會規定,見表 |
6 | bDeviceProtocol | 1 | 裝置所使用的協定,由USB協會規定,見表;爲0的時候表示不適用類所定義的協定,爲0xff的時候表示廠商自定義協定;bDeviceProtocl與bDeviceClass和bDeviceSubClass結合起來用纔有具體意義 |
7 | bMaxPackeSize0 | 1 | 端點0的最大包長度,取值可以爲8,16,32,64 |
8 | idVender | 2 | 廠商ID(VID),一般不能隨意使用,小端模式 |
10 | idProduct | 2 | 產品ID(PID),小端模式 |
12 | bcdDevice | 2 | 產品版本號,自定義,,小端模式 |
14 | iManufacturer | 1 | 描述廠商字串的索引值,爲0表示沒有廠商字串 |
15 | iProduct | 1 | 描述產品字串的索引值,爲0表示沒有產品字串 |
16 | iSerialNumber | 1 | 裝置的序列號字串的索引值,如果產品VID和PID一樣,可以通過這個來區別 |
17 | bNumConfigurations | 1 | 表示裝置有多少種設定,一般爲1,每種設定都會有一個設定描述符 |
設定描述符主要記錄的資訊有:設定所包含的介面數,設定的編號,供電方式,是否支援遠端喚醒,電流需求量。
設定描述符結構:
偏移量/位元組 | 域 | 大小/位元組 | 說明 |
---|---|---|---|
0 | bLength | 1 | 該描述符的長度(9位元組) |
1 | bDescriptorType | 1 | 描述符型別(設定描述符爲0x02) |
2 | wTotalLength | 2 | 表示整個設定描述符集合的總長度,包括設定描述符,介面描述符,類特殊描述符(如果有)端點描述符,小端模式 |
4 | bNumInterface | 1 | 表示該設定所支援的介面數量 |
5 | bConfiguration | 1 | 表示該設定的值;主機端在設定設定請求是會發送一個設定值,如果與它相配,該設定就被啓用 |
6 | iConfiguration | 1 | 描述該設定字串的索引值,爲0表示沒有設定字串 |
7 | bmAttributes | 1 | 用來描述裝置的一些特性,【7:保留,必須設定1】【6:供電方式,1表示裝置自供電】【5:是否支援遠端喚醒,1表示支援】【4-0:保留,設定爲0】 |
8 | bMaxPower | 1 | 裝置需用從匯流排獲取的最大電流,單位2mA |
介面描述符主要記錄的信號有:介面的編號,介面的端點數,介面所使用的類,子類,協定等。
介面描述符不能單獨返回,必須附着在設定描述符後一併返回
介面描述符結構:
偏移量/位元組 | 域 | 大小/位元組 | 說明 |
---|---|---|---|
0 | bLength | 1 | 該描述符的長度(9位元組) |
1 | bDescriptorType | 1 | 該描述符型別(介面描述符爲0x04) |
2 | bInterfaceNumber | 1 | 表示該介面的編號,從0開始一次遞增 |
3 | bAlternateSetting | 1 | 該介面備用編號,從0開始一次遞增,很少用 |
4 | bNumEndpoints | 1 | 該介面使用的端點數(不包括0端點),如果該欄位爲0,則表示沒有非0端點,只使用預設控制端點 |
5 | bInterfaceClass | 1 | 該介面所使用的類,由USB協會規定 |
6 | bInterfaceSubClass | 1 | 該介面所使用的子類,由USB協會規定 |
7 | bInterfaceProtocol | 1 | 該介面所使用的協定,由USB協會規定 |
8 | iConfiguration | 1 | 描述該介面的字串索引,爲0則表示沒有字串 |
HID類的裝置在設定描述符中還需要一個HID描述符,它是一個類描述符,跟在介面描述符後面。
HID描述符結構:
偏移量/位元組 | 域 | 大小/位元組 | 說明 |
---|---|---|---|
0 | bLength | 1 | 該描述符的長度(9+位元組) |
1 | bDescriptorTyp | 1 | 描述符型別(HID描述符位0x21) |
2 | bcdHID | 2 | HID協定的版本號,小端模式 |
4 | bCountyCode | 1 | 裝置所適用的國家,見表 |
5 | bNumberDescriptors | 1 | 下級描述符的數量,至少爲1,至少有一個報告描述符,下級描述符可以爲報告描述符或者物理描述符 |
6 | bDescriptorTyp | 1 | 下級描述型別,0x22報告描述符,0x23物理描述符 |
7 | bDescriptorLength | 2 | 下級描述符長度,小端模式 |
9 | bDescriptorTyp(可選) | 1 | 下級描述型別,0x22報告描述符,0x23物理描述符 |
10 | bDescriptorLength(可選) | 2 | 下級描述符長度,小端模式 |
… | … | … |
端點描述符主要記錄的資訊有:端點號及方向,端點的傳輸型別,最大包長度,查尋時間間隔等。
端點描述符不能單獨返回,必須附着在設定描述符後一併返回
端點描述符結構:
偏移量/位元組 | 域 | 大小/位元組 | 說明 |
---|---|---|---|
0 | bLength | 1 | 該描述符的長度(7位元組) |
1 | bDescriptorType | 1 | 描述符型別(端點描述符爲0x05) |
2 | bEndpointAddress | 1 | 表示該端點的地址,【7:端點傳輸方向,1輸入,0輸出】【6-4:保留】【3-0:端點號】 |
3 | bmAttributes | 1 | 該端點屬性【1-0:傳輸型別,0控制傳輸,1等時傳輸,2批次傳輸,3中斷傳輸】當不爲等時傳輸的時候【7-2:保留設爲0】;當爲等時傳輸的時候【3-2:同步型別,0無同步,1非同步,2適配,3同步】【5-4:表示用途,0數據端點,1反饋端點,2暗含反饋的數據端點,3保留】【7-6:保留】 |
4 | wMaxPackeSize | 2 | 該端點所支援的最大包長度,小端模式;【10-0:表示最大長度】其他位保留 |
6 | bInterval | 1 | 表示該端點查詢時間。對於中斷端點,表示查詢的幀間隔數,單位ms。其他參照USB2.0協定 |
字串描述符主要記錄一些方便人們閱讀的資訊,他不是必需的。當某個描述符中的字串索引值爲非0時,就表示它具有那個字串描述符,注意索引值不能重複。USB主機使用獲取字串描述符和索引值來獲取對應的字串;當索引值時0的時候,表示獲取語言ID。
語言ID是一個描述該裝置支援的語言種類的陣列,每個ID號佔2位元組。
語言ID描述符結構:
偏移量/位元組 | 域 | 大小/位元組 | 說明 |
---|---|---|---|
0 | bLength | 1 | 該描述符長度 |
1 | bDescriptorType | 1 | 描述符型別(字串爲0x03) |
2 | wLANGID[0] | 2 | 語言ID號0 |
4 | wLANGID[1] | 2 | 語言ID號1 |
… | … | … |
字串描述符結構:
偏移量/位元組 | 域 | 大小/位元組 | 說明 |
---|---|---|---|
0 | bLength | 1 | 該描述符長度 |
1 | bDescriptorType | 1 | 描述符型別(字串爲0x03) |
2 | bString | N | UNICODE編碼的字串 |
- USB HID 裝置時通過報告report來傳送數據的,報告有輸入報告和輸出報告;
- 報告描述符是用來描述一個報告的結構以及該報告裏面的數據是用來幹什麼的;
- 一個報告描述符可以描述多個報告,不同的報告通過報告ID來識別,報告ID放在報告的最前面,即第一個位元組,如果沒有規定報告id是,報告就沒有id欄位;
- 報告描述符由條目組成(item);短條目 = 字首 + 可選數據段;
條目字首的結構:
【D7~4:bTga】 | 【D3-2:bType】 | 【D1-0:bSize】 |
---|---|---|
0=主條目(main);1=全域性條目(global);2=區域性條目(local);3=保留 | 數據段位元組數 |
HID專案列表:
專案標誌bTag | 條目型別bType | 專案字首,表示數據長度 | 功能說明 |
---|---|---|---|
Input(1000) | Main(00) | 1000 00 nn(0x81+) | 定義輸入報表,數據段的第一個位元組指定報表數據域的屬性 |
Output(1001) | 1001 00 nn(0x91+) | 定義輸出報表,數據段的第一個位元組指定報表數據域的屬性 | |
Feature(1011) | 1011 00 nn(0xB1+) | 定義送完裝置的設定資訊,數據段的第一個位元組指定報表數據域的屬性 | |
Collection(1010) | 1010 00 nn(0xA1+) | 定義2個以上數據(input,output,feature)的關係爲集合,Collection爲開集合,End Collection爲關集合。Collection專案的數據部說明Collection型別 | |
End Collecton(1100) | 1100 00 nn(0xC0) | 無數據部表示關集合 | |
Usage Page(0000) | Global(01) | 0000 01 nn(0x05+) | 指定裝置的功能(用途頁) |
Logical Minimum(0001) | 0001 01 nn(0x15+) | 指定邏輯最小值 | |
Logical Maximum(0010) | 0010 01 nn(0x25+) | 指定邏輯最大值 | |
Physical Minimum(0011) | 0011 01 nn(0x35+) | 指定物理最小值 | |
Physical Maximum(0100) | 0100 01 nn(0x45+) | 指定物理最大值 | |
Unit Exponent(0101) | 0101 01 nn(0x55+) | 定義數值是基於10的指數 | |
Unit(0110) | 0110 01 nn(0x65+) | 物理單位 | |
Report Size(0111) | 0111 01 nn(0x75+) | 指定報表一個數據域所包含的位數 | |
Report ID(1000) | 1000 01 nn(0x85+) | 指定協定的報表ID | |
Report Count(1001) | 1001 01 nn(0x95+) | 報表中數據域的數目 | |
Push(1010) | 1010 01 nn(0xA5+) | 將Global專案狀態表送入堆疊 | |
Pop(1011) | 1011 01 nn(0xB5+) | 從堆疊恢復Golbal專案狀態表 | |
1100~1111 | 保留 | ||
Usage ID(0000) | Local(10) | 0000 10 nn(0x09+) | 用法索引值,表示對專案或集合建議的用法,用於當一個專案描述多個控制,對每一個變數和陣列元素都有建議用法 |
Usage Minimum(0001) | 0001 10 nn(0x19+)用途最小值 | ||
Usage Maximum(0010) | 0010 10 nn(0x29+)用途最大值 | ||
Designator Index(0011) | 0011 10 nn(0x39+) | 確定用於控制的實體,指向物理描述符中的目標 | |
Designator Minimum(0100) | 0100 10 nn(0x49+) | 目標起始索引值 | |
Designator Maximum(0101) | 0101 10 nn(0x59+) | 目標結束索引值 | |
String Index(0110) | 0110 10 nn(0x69+) | 確定字串描述符中的索引值 | |
String Minimum(0111) | 0111 10 nn(0x79+) | 字串序列起始索引值 | |
String Maximum(1000) | 1000 10 nn(0x89+) | 字串序列結束索引值 | |
Delimiter(1001) | 1001 10 nn(0x99+) | 定義一組local專案的開始和結束,1=開始,0=結束 | |
1010~1111 | 保留 |
Input,Output,Feature專案的數據項說明:
位 | 值 | 名稱 | 含義 |
---|---|---|---|
0 | 0 | Data | 數據:表示專案的內容是可更改的(讀/寫) |
1 | Constant | 常數:表示專案的內容是不可更改的(只讀) | |
1 | 0 | Array | 陣列:報告全部控制的狀態。如在鍵盤報表中每一個建在報表中佔一位,報表傳輸全部鍵的狀態,可以同時按下任意多個鍵 |
1 | Variable | 變數:報告作用中的控制。如在鍵盤報表中值報告按下的鍵的編號,可以同時按下的鍵的數目等於報表的計數 | |
2 | 0 | Absolute | 絕對:表示數值以一個固定值爲基準。遊戲桿通常是報告絕對數據 |
1 | Relative | 相對:表示數據的改變以上一個讀數爲準 | |
3 | 0 | No Warp | 不迴轉 |
1 | Warp | 迴轉 | |
4 | 0 | Linear | 線性:表示測量數據與報表數據是線性關係 |
1 | Non-Linear | 非線性 | |
5 | 0 | Preferred | 優選狀態:表示控制在沒有使用者互動是會回到一個特定的狀態,如按鍵就有優選狀態,在無操作是保持未按下狀態 |
1 | Non-Preferred | 非優選狀態 | |
6 | 0 | No Null Position | 無空狀態位置:表示控制永遠在傳送有效的數據 |
1 | Null State | 空狀態:表示控制支援一個沒有傳送有效數據的狀態 | |
7 | 0 | Non-Volatile | 不可變的:表示裝置只有在主機請求時才改變數值 |
1 | Volatile | 可變的:表示裝置可以自己改變數值 | |
8 | 0 | Bit Field | 位欄位:表示每一個位或是一個位元組內的一組位可以代表一份數據 |
1 | Buffered Bytes | 緩衝位元組:表示資訊包含一個或多個位元組 | |
9~ | 保留 |
Collection和End Collection專案:
- 所有的的報表型別都可以使用集合專案來將相關的Main型別專案組成羣組,所有在Collection和End Collection之間的Main型別專案都是Collection的一部分
- Collection有3種類型:Application,Physical和Logical,數據項的值爲別爲1,0和2
- Application包含有共同用途的專案或執行單一功能的專案;
- Physical包含在一個單一集合點上的數據專案,可以將每個位置的數據集合成一個Physical Collection
- Logical形成一個數據結構,包含有Collection所連結的不同類型的專案
集合型別 | 縮寫 | 取值 | 說明 |
---|---|---|---|
Physical | CP | 0x00 | 用於包含單個集合點的控制 |
Application | CA | 0x01 | 用於包含多種報告、多種應用 |
Logical | CL | 0x02 | 用於包含多種不同結構的報告數據 |
Report | 0x03 | 用於包含一個單獨的報告(含有報告ID) | |
Named Array | Nary | 0x04 | |
Usage Switch | US | 0x05 | |
Usage Modifier | UM | 0x06 | |
Reserved | 0x07~0x7F | (保留)未來擴充套件 | |
Reserved | 0x80~0xFF | (保留)使用者自定義 |
UsagePage專案的數據部分爲1-2個位元組,目前定義的全部都是1個位元組,UsagePage定義了常用的裝置功能
Page ID | Page Name | 含義 |
---|---|---|
00 | Undefined | 未定義 |
01 | Generic Desktop Controls | 通用桌面控制 |
02 | Simulation Controls | 模擬控制 |
03 | VR Controls | 虛擬現實控制 |
04 | Sport Controls | 運動控制 |
05 | Game Controls | 遊戲控制 |
06 | Generic Device Controls | 通用裝置控制 |
07 | Keyboard/Keypad | 鍵盤 |
08 | LEDs | LED陣 |
09 | Button | 按鈕 |
0A | Ordinal | 順序 |
0B | Telephony | 電話 |
0C | Consumer | 使用者 |
0D | Digitizer | 數位化儀 |
0E | Reserved | 保留 |
0F | PID Page | 人體介面裝置 |
10 | Unicode | Uincode碼 |
11-13 | Reserved | 保留 |
14 | Alphanumeric Display | 字元顯示 |
15-3f | Revsered | 保留 |
40 | Medical Instruments | 醫學裝置 |
41-7f | Reserved | 保留 |
80-83 | Monitor pages | 監控器頁 |
84-87 | Power pages | 電源頁 |
88-8B | Reserved | 保留 |
8C | Bar Code Scanner page | 條形碼頁 |
8D | Scale page | 天平 |
8E | Magnetic Stripe Reading(MSR)Devices | 詞條閱讀裝置 |
8F | Reserved Point of Sale pages | |
90 | Camera Control Page | 照相機控制頁 |
91 | Arcade Page | |
92-FEFF | Reserved | 保留 |
FF00-FFFF | Vendor-defined | 使用者自定義 |
關於Usage Page的每一個有效定義項,都有一個相應的下一級定義,如Usage Page的數據項數值爲1,則裝置定義爲Generic Desktop Controls,關於該類裝置的具體功能可以在HID Usage Tables中查到具體的定義。
Generic Desktop Controls用法定義:
Usage ID | Usage Name | Usage Type | 含義 |
---|---|---|---|
00 | Undefined | 未定義 | |
01 | Pointer | CP(物理集合) | 指針定義 |
02 | Mouse | CA(應用集合) | 滑鼠 |
03 | Reserved | ||
04 | Joystick | CA(應用集合) | 遊戲遙桿 |
05 | Game Pad | CA(應用集合) | 遊戲板 |
06 | Keyboard | CA(應用集合) | 鍵盤 |
07 | Keypad | CA(應用集合) | 鍵板(數位小鍵盤) |
08 | Mutil-axis Controller | CA(應用集合) | 多軸控制器 |
09 | Tablet PC System Controls | CA(應用集合) | 平板計算機系統控制 |
0A-2F | Reserved | ||
30 | X | DV(動態值) | X座標 |
31 | X | DV(動態值) | Y座標 |
32 | Z | DV(動態值) | Z座標 |
33 | Rx | DV(動態值) | X軸旋轉 |
34 | Ry | DV(動態值) | Y軸旋轉 |
35 | Rz | DV(動態值) | Z軸旋轉 |
36 | Slider | DV(動態值) | 滑動條 |
37 | Dial | DV(動態值) | 刻度盤 |
38 | Wheel | DV(動態值) | 旋鈕 |
39 | Hat swicth | DV(動態值) | 碰觸開關 |
3A | Counter Buffer | CL(邏輯集合) | |
3B | Byte Count | DV(動態值) | |
3C | Motion Wakeup | OSC | |
3D | Start | OOC |