二、USB描述符分類

  USB描述符有以下幾種:設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符、HID描述符

1、設備描述符

  設備描述符描述了USB設備的通用信息。一個USB設備只有一個設備描述符。比較特殊的是, 默認控制管道的數據包的長度(也就是USB設備端點0的長度)是在設備描述符中定義的, 而不像其他端點一樣是在端點描述符中定義的。

   描述設備速度,走的是USB1.1、USB2.0;設備的PID、VID等信息,設備描述符字段組成如下:

偏移量

字段名稱

長度(字節)

字段值

意義

0

bLength

1

數字

設備描述符的字節數大小

1

bDescriptor Type

1

常數

設備描述符類型編號

2

bcdUSB

2

BCD碼

USB版本號

4

bDeviceClass

1

USB分配的設備類代碼

5

bDeviceSubClass

1

子類

USB分配的子類代碼

6

bDeviceProtocol

1

協議

USB分配的設備協議代碼

7

BMaxPacketSize0

1

數字

端點0的最大包大小

8

idVendor

2

ID編號

廠商編號

10

idProduct

2

ID編號

產品編號

12

bcdDevice

2

BCD碼

設備出廠編號

14

iManufacturer

1

索引

描述廠商字符串的索引

15

iProduct

1

索引

描述產品字符串的索引

16

iSerialNumber

1

索引

描述設備序列號字符串的索引

17

bNumConfigurations

1

數字

可能的配置參數

(1)、bLength

這是一個以1字節二進制數爲內容的字段。 該字段表示整個設備描述符的字節數大小,而整個設備描述符佔用了17個字節, 因此bLength的值是固定的, 就是18, 用十六進制表示就是0x12。

(2)、bDescriptorType

設備描述符的類型,USB定義的設備描述符的類型編號爲常數0x01,因此,該字段的值爲固定值0x01。

(3)、bcdUSB

BCD碼爲內容的字段,該字段代表設備所遵循的USB協議的版本號。

如:USB1.1,其bcdUSB值爲0x0110

USB2.0,其bcdUSB值爲0x0200

一個2字節的數0xABCD, AB爲1個字節, CD爲另一個字節, 其中AB爲版本號的整數部分, C爲版本號的第一個小數部分, D爲版本號的第二個小數部分。

(4)、bDeviceClass

設備類型的代碼,值從0x01~0xFE爲USB定義的標準設備類,而值爲0xFF時表示該設備類型代碼是廠商自定義的類。如果設備類型不是在設備描述符中定義的, 則該值爲0, 比如人機接口設備 ( HID) 類。

(5)、bDEviceSubClass

設備類中的子類類型,和bDeviceClass一樣由USB規定和分配,當 bDeviceClass爲0時, 此值也爲0, 代表該子類類型不在設備描述符中定義。 值爲0xFF時, 也代表子類類型是由廠商所定義的。

(6)、bDeviceProduct

設備所遵循的協議,該值有USB協議規定,當值爲0xFF時,表示該設備採用廠商自己爲該類定義的協議。

(7)、bMaxPacketSize0

描述了端點0的最大包的大小, 低速設備的bMaxPacketSize0恆爲8, 全速設備可以是一般爲 8、16、32或64, 即0x08、0x10、0x20或0x40, 而高速設備則爲64。

(8)、idVendor

USB設備的生產廠商從USB開發者論壇(USB Implementers Forum)獲得的ID號。  

(9)、idProduct

設備的生產廠商所定義的該設備的產品ID號。

(10)、bcdDevice

設備生產廠商來定義, 代表該設備的產品版本號。

(11)、iMenufacturer

設備生產廠商的字符串的索引值。值爲0則代表沒有使用該字段。

(12)、iProduct

描述該產品的字符串的索引值。值爲0時表示沒有使用該字段。

(13)、iSerialNumber

設備的序列號的索引值。每個設備都有一個特定的序列號, 可供主機來識別不同的設備。

(14)、bNumConfigurations

該設備總共支持的配置描述符的數量。

                                                   Bus hound抓取的設備描述符

2、配置描述符

  配置描述符用於描述一個USB設備的屬性和能力等配置信息。一個USB設備只需要一個配置描述符就可以了。比如一個USB接口的鼠標,其功能僅僅是簡單的雙向數據中斷傳輸, 並且是總線供電, 因此按照這些要求來填寫一個配置描述符即可。但是, 有些設備如果需要具有幾種相對獨立的配置(但前提是屬於 同一種USB設備類), 比如一個USB接口的ISDN, 就可以有2種配置, 一種配置下建立 64 KB/ s 的雙向數據交換通道; 而同時可以有另一種 128 KB/ s 的雙向數據通道配置。這樣, 這個ISDN就可以根據不同的網絡情況來自動選擇任一種數據交換方式。配置描述符字段組成如下:

偏移量

字段名稱

長度(字節)

字段值

意義

0

bLength

1

數字

設備描述符的字節數大小

1

bDescriptor Type

1

常數

配置描述符類型編號

2

wTotalLength

2

數字

此配置所返回的所有數據大小

4

bNumInterfaces

1

數字

此配置所支持的接口數量

5

bConfigurationsValue

1

數字

Set_Configuration命令需要的參數值

6

iConfiguration

1

索引

描述改配置的字符串的索引值

7

bmAttributes

1

位圖

供電模式的選擇

8

MaxPower

1

mA

設備從總線提取的最大電流

(1)、bLedgth

整個配置描述符的長度, 因此bLength是固定的, 值爲9, 即0x09, 二進制表示爲 00001001。

(2)、bDescriptorType

USB給配置描述符分配的類型編號, 值爲常數0x02。

(3)、wTotalLength

該置所返回的所有描述符(包括配置、接口和端點描述符)的大小總和。

(4)、bNumInterfaces

該配置所支持的接口總數。

(5)、bConfigurationValue

該字段的值作爲參數, 可被Set_Configuration和 Get_Configuration命令來調用, 用於該命令選定這個配置。

(6)、iConfiguration

該字段指向描述該配置描述符的字符串。 如果該設備沒有用字符串描述該配置, 那麼此字段爲0。

(7)、bmAttributes

該字段1字節二進制數的每一位代表一個固定的含義:

D7:Reserve,固定爲1;

D6:供電方式的選擇, 值爲1表示自供電, 值爲0表示總線供電;

D5:遠程喚醒功能的選擇, 值爲1表示支持遠程喚醒, 值爲0則不支持;

D4~D0:沒有意義, 均把值固定爲0。

(8)、MaxPower

設備從總線上獲取的電流總量。電流值爲字段值的兩倍,設備可以獲取到的最大電流爲500mA,所以字段值最大爲0xFA;

                                                  Bus hound上抓取的配置描述符

3、接口描述符

  接口描述符用於描述一個特定接口的屬性。接口一般是由一系列端點所組成的集合體,用於實現某種特定的USB的數據傳輸功能。一般一個USB設備只需具有一個接口。比如,USB移動存儲設備中就只有一個用於實現Mass Storage類的接口, 在該接口下使用了批量輸入Bulk_IN和批量輸出Bulk_OUT 2個非0 端點用於傳輸文件。接口描述符還可以在配置後加以改變。前面已經提到, 標準的USB設備類型都是在 設備描述符中定義的, 但是有些類是基於接口在接口描述符中定義的, 如HID設備。接口描述符字段組成如下:

偏移量

字段名稱

長度(字節)

字段值

意義

0

bLength

1

數字

設備描述符的字節數大小

1

bDescriptor Type

1

常數

接口描述符類型編號

2

bInterfaceNumber

1

數字

該接口的編號

3

bAlternateSetting

1

數字

備用的接口描述符編號

4

bNumENDpoits

1

數字

該接口使用的端點數,不包括端點0

5

bInterfaceClass

1

接口類型

6

bInterfaceSubClass

1

子類

接口子類類型

7

bInterface

1

協議

接口遵循的協議

8

iInterface

1

索引

描述該接口的字符串索引值

(1)、bLength

整個配置描述符的長度,固定爲0x09.

(2)、bDescriptorType

由USB給配置描述符分配的類型編號, 值爲常數0x04。

(3)、bInterfaceNumber

接口的編號,如果一個配置擁有N個接口, 那麼這些接口都是互不相干的, 每一個接口都有惟一的編號, USB就是通過此字段來識別不同的接口。默認值爲0。

(4)、bAlternateSetting

USB設備的配置與USB配置描述符是一一對應的, 即一個配置只能有一個配置描述符。USB允許多個接口描述符來描述同一個接口, 而且這些描述符都可以通過命令來切換。這裏,此字段就是每一個這類描述符惟一的編號。USB可以通過調用這個字段來切換描述同一個接口的不同描述符。控制傳輸中可以通過Get_Interface和Set_Interface來獲取、設置目前正在使用的描述一個確定接口的接口描述符的編號。

(5)、bNumEndpoints

該接口使用的端點總數(除端點0之外)。如果此值爲0, 則意味着該接口只使用了端點0。

(6)、bInterfaceClass

該接口所屬的類別。這個類別編號由USB來分配。當值爲0xFF時, 表示該接口是廠商所定義的接口類型。而值0保留。

(7)、bInterfaceSubClass

接口所屬的類別中的子類類型。這個子類編號也由USB分配。同bInterfaceClass字段一樣, 當其值爲0xFF時代表該接口由廠商自己所定義。而值0保留。

(8)、bInterfaceProtocol

此接口類所遵循的類的協議。因而, 該字段的值跟bInterfaceClass和bInterfaceSubClass字段是相關的。其值從1~0xFE由USB分配, 代表不同標準的設備類的協議。 當值爲0時, 表示該接口不遵循任何類協議; 而值爲0xFF時, 表示該接口應用了廠商自定義的類協議。

(9)、iInterface

指向字符串描述符中相應的字符串內容, 用於描述該接口。 如果設備沒有啓用字符串描述符 , 則該值爲0。

                                                  Bus hound中抓取到的接口描述符

4、端點描述符

端點描述符用於描述接口所使用的非0端點的屬性, 包括輸入/輸出方向、端點號和端點容量即包的大小等。端點描述符字段組成如下:

偏移量

字段名稱

長度(字節)

字段值

意義

0

bLength

1

數字

設備描述符的字節數大小

1

bDescriptorType

1

常數

端點描述符類型編號

2

bEndpointAddress

1

端點

端點地址及輸入輸出屬性

3

bmAttributes

1

位圖

端點傳輸類型屬性

4

wMaxPacketSize

2

數字

端點收、發的最大包的大小

5

bIterval

1

數字

主機查詢端點的時間間隔

(1)、bLength

這個端點描述符的長度。

(2)、bDescriptorType

USB爲端點描述符分配的類型編號, 因此, 此字段的值固定, 即爲0x05。

(3)、bEndpointAddress

D7 端點方向

0       OUT端點

1       IN端點

D6~D4     保留

D3~D0     端點編號

(4)、bmAttributes

D5~D4 用途

00     數據端點

01     反饋端點

10     隱式反饋數據端點

11     保留

D3~D2 同步類型

00     非同步

01     異步

10     自適應

11     同步

D1~D0 傳輸類型

00     控制傳輸

01     同步傳輸

10     塊傳輸

11     中斷傳輸

如果該端點不是同步端點,D5~D2保留且必須置0。

(5)、wMaxPacketSize

該端點最大包的大小。其中D10~D0位共11位爲有效內容。在USB協議1 .1中D15~D11位保留, 值爲0, 且最大包的大小範圍爲0~1023。

(6)、bIterval

主機輪詢設備的週期。在USB協議1.1中, 對於中斷端點, 該字段的值爲1~255,時間單位ms,因此假設值爲250, 則表示時間間隔爲250ms; 對於同步端點, 該字段值固定爲1 ; 而批量端點和控制端點則忽略該字段 ,值無效。

                                                 Bus hound中抓取的端點描述符

5、字符串描述符

  字符串描述符是一個可選的描述符,長度不固定。字符串描述符字段組成如下:

偏移量

字段名稱

長度(字節)

字段值

意義

0

bLength

1

數字

設備描述符的字節數大小

1

bDescriptorType

1

常數

字符串描述符類型編號

2

bString

N

數字

UNICODE編碼的字符串

(1)、bLength

整個字符串描述符的長度。

(2)、bDescriptorType

USB爲端點描述符分配的類型編號, 因此, 此字段的值固定, 即爲0x03。

(3)、bString

一個以UNICODE編碼的字符爲內容的字符串。

                                                   Bus hound抓取的字符串描述符

7、HID描述符

         bLength: 描述符長度。

         bDescriptorType:描述符類型,HID描述符的類型爲0x21。

         bcdHID: 所遵循的HID協議版本。

         bCountryCode: 國家代碼。

         bNumDescriptors: 下級描述符數量,通常至少需要一個報告描述符。

         bDescriptorType: 下級描述符類型,例如報告描述符。

         wDescriptorLength: 下級描述符長度。

                                                 Bus hound中抓取的HID描述符

總的來說,描述符的作用就是,讓主機知道你是什麼設備信息(PID、VID、序列號...),跑的是那種速度的協議(USB1.0、USB1.1、USB2.0...),然後給你分配相應的地址。

如有錯誤或者疑問,請及時提出。謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章