1. 程式人生 > >USB中的描述符詳解[二]

USB中的描述符詳解[二]

USB描述符的分類與介紹

USB的符述符分為幾類?有人可能會答:裝置描述符、配置描述符、介面描述符、端點描述符、字串描述符等。但這裡說的不是這樣的。上面的幾類描述符屬於USB標準描述符。另外還有HID描述符和Hub描述符。所以分類是這樣的:
1. 標準描述符
1) 裝置描述符
             2) 配置描述符
             3) 字串描述符
             4) 介面描述符
             5) 端點描述符
             6) 裝置限定描述符
             7) 其他速率配置描述符
2. HID描述符
3. Hub描述符

1.5 端點描述符

端點描述符用於指出USB端點的特性,包括其所支援的傳輸型別、傳輸方向等資訊。USB中規定,端點0沒有端點描述符,其餘端點必須包含端點描述符。端點描述符由6個欄位組成,共7個位元組。其格式如下:

 各欄位含義:
 bLength:用於表示端點描述符的長度,固定為7位元組,即0x07。
 bDescriptorType:用於表示介面描述符的型別值,固定為0x05。
 bEndpointAddress:用於表示端點的端點號以及端點的資料傳輸方向。第七位表示端點的資料傳輸方向,0表示OUT資料傳輸,1表示IN資料傳輸;第0~位表示端點號,例如001B表示端點1、010B表示端點2;其餘位均保留,必須置0。
 bmAttributes:用於表示端點的特性。其中第0位和第1位表示端點的資料傳輸型別,00B表示控制傳輸、01B表示同步傳輸、10B表示塊傳 輸、11B表示中斷傳輸;如果是同步傳輸,第2位和第3位表示同步型別,00B表示非同步、01B表示非同步、10B表示自適應、11B表示同步;第4、5 位表示端點的用法型別,00B表示資料端點、01B表示顯示反饋端點、10B表示隱匿反饋端點、11B保留。其餘位保留。
 wMaxPacketSize:用於表示端點所支援最大資料包的長度。其中第0~10位表示資料包的長度,第11位和12位指出每小幀最多傳輸的事務數,其餘位均保留,必須置0。
 bInterval:用於指定端點資料傳輸的訪問間隔。低速中斷端點,取值範圍為10~255,對應的訪問間隔為10~255ms;對於全速中斷端點,取值範圍為1~255,對應的訪問間隔為1~255ms;對於其他端點,可以參閱USB相關協議。

1.6 裝置限定描述符

裝置限定描述符用於指定另一傳輸速率下該裝置的總體資訊,如果高速USB裝置既需要採用高速傳輸又需要全速傳輸,則它必須支援裝置限定描述符(Device_Qualifier)。裝置限定描述符包含9個欄位,長度固定為10個位元組。其格式如下:

 各欄位含義:
 bLength:用於表示裝置限定描述符的長度,為固定值0x0a。
 bDescriptorType:用於表示裝置限定描述符的型別值,固定為0x06。
 bcdUSB:用於表示USB裝置及其描述符所遵循的USB規範版本,以BCD碼的形式表示,其值必須在版本2.0以上。
 bDeviceClass:用於表示USB裝置所屬的裝置類。該欄位值在1~0xFE之間的時候,表示為USB定義的某個裝置類,如0x03表示HID設 備類。當為0時,表示USB裝置的各個介面互相獨立,分別屬於不同的裝置類,在介面描述符中會進一步說明。當為0xFF時,表示該裝置為供應商自定義的。
 bDeviceSubClass:用於表示USB裝置所採用的裝置類協議,它對USB裝置類進行了更詳細的定義。例如,對於前面的HID裝置類,只有一個 子類程式碼0x01。而對於顯示裝置類(0x04)子類程式碼0x01表示CRT顯示器、0X02表示平面顯示器、0x03表示3D顯示器。當 bDeviceClass=0時,該欄位也必須為0;當該欄位為0xFF時,表示由供應商自定義的裝置子類。
 bDeviceProtocol:用於表示USB裝置所採用的裝置類協議,其值和bDeviceClass及bDevcieSubClass的值有關。當 該欄位為0時,表示不使用任何裝置協議。如果該USB裝置屬於某個裝置類和裝置子類,則應該繼續指明所採用的裝置類協議。當該欄位為0xFF時,表示由供 應商自定義裝置類協議。
 bMaxPacketSize0:用於表示USB裝置端點0支援最大資料包的長度,它以位元組為單位。對於低速USB裝置,bMaxPacketSize0 為8,對於全速USB裝置,bMaxPacketSize0為8、16、32或64;對於高速USB裝置bMaxPacketSize0為64。
 bNumConfigurations:表示USB裝置另一個速率所支援的配置數。
 bReserved:保留項,要置0。

1.7 其他速率配置描述符

其他速率配置描述符用於指定另一傳輸速率下該裝置的配置資訊,如果高速USB裝置既需要採用高速傳輸又需要全速傳輸,則它必須支援其他速率配置描述符。其他速率配置描述符包含8個欄位,長度固定為9個位元組。其格式如下:

 各欄位含義:
 bLength:描述符的長度,固定為0x09。
 bDescriptorType:描述符型別,固定為0x07。
 wTotalLength:用於表示其他速率配置資訊的總長度,包括配置描述符、介面描述符、端點描述符、裝置類定義描述符和供應商自定義描述符的總和。
 bNumInterfaces:用於表示其他速率配置所支援的介面數。
 bConfigurationValue:用於表示其他速率配置值。
 iConfiguration:用於指出配置字串描述符的索引值,具體字串的內容在字串描述符中定義。如果沒有配置字串,可以置0。
 bmAttributes:用於表示配置特性。它量按位定址的,第6位置1表示使用匯流排電源;第5位置1表示支援遠端喚醒功能;該欄位的其他位均保留,一般來說,第0~4位應該置0,第7位應該置1。

 bMaxPower:用於表示USB裝置執行時所需要消耗的匯流排電流,單位以2mA為基準。USB裝置可以從USB總線上獲得最大電流為500mA,因此該欄位的最大值為250。

2 HID描述符

USB裝置中有一大類就是HID裝置,即Human Interface Devices,人機介面裝置。這類裝置包括滑鼠、鍵盤等,主要用於人與計算機進行互動。它是USB協議最早支援的一種裝置類。HID裝置可以作為低速、 全速、高速裝置用。由於HID裝置要求使用者輸入能得到及時響應,故其傳輸方式通常採用中斷方式。
在USB協議中,HID裝置的定義放置在介面描述符中,USB的裝置描述符和配置描述符中不包含HID裝置的資訊。因此,對於某些特定的HID裝置,可以定義多個介面,只有其中一個介面為HID裝置類即可。
當定義一個裝置為HID裝置時,其裝置描述符應為:

 其介面描述符應該:

             bInterfaceClass=0x03

另外(介面描述符):
對無引導的HID裝置,子類程式碼bInterfaceSubClass應置0,此時bInterfaceProtocol無效,置零即可。即為:

            bInterfaceClass=0x03
            bInterfaceSubClass=0
            bInterfaceProtocol=0

對支援引導的USB裝置,子類程式碼bInterfaceSubClass應置1,此時bInterfaceProtocol可以為1或2,1表示鍵盤介面,3表示滑鼠介面。其參考設定如下:

            bInterfaceClass=0x03
            bInterfaceSubClass=1
            bInterfaceProtocol=1或2

HID裝置支援USB標準描述符中的五個:裝置描述符、配置描述符、介面描述符、端點描述符、字串描述符。除此之外,HID裝置還有三種特殊的描 述符:HID描述符、報告描述符、物理描述符。一個USB裝置只能支援一個HID描述符,但可以支援多個報告描述符,而物理描述符則可以有也可以沒有。

2.1 HID描述符

HID描述符用於識別HID裝置中所包含的額外描述符,例如報告描述符或物理描述符等。其格式如下:

 各欄位含義:

bLength:HID描述符長度。
bDescriptorType:HID描述符型別,值為0x21。
bcdHID:HID裝置所遵循的HID版本號,為4位16進位制的BCD碼資料。1.0即0x0100,1.1即0x0101,2.0即0x0200。
bCountryCode:HID裝置國家/地區程式碼。
bNumDescriptor:HID裝置支援的其他裝置描述符的數量。由於HID裝置至少需要包括一個報告描述符,故其值至小為0x01。
bDescriptorType:HID描述符附屬的類別描述符長度。
bDescriptorType/wDescriptorLength:可選欄位,用於表示HID描述符附屬的類別描述符型別及長度。
2.2 報告描述符
HID裝置的報告描述符是一種資料報表,主要用於定義HID裝置和USB主機之間的資料交換格式,HID裝置報告描述符的型別值為0x22。
報告描述符使用自定義的資料結構,用於傳輸特定的資料包。例如對於鍵盤,需要在資料包中指明按鍵的值,報告描述符把這些資料打包發給主機,主機對發來的資料進行處理。它有四個組成部分,其格式如下:

 各欄位含義:
bSize:佔用兩個位,指示資料部分,即[data]欄位的長度,00b表沒有資料位元組,01b表只有一個數據位元組,10b表示有兩個資料位元組,11b表有4個數據位元組。
bType:資料項型別,用於指明資料項的型別。00b主資料型別,01b全域性資料型別,10b區域性資料型別,11b保留。
bTag:資料項標籤,用於指明資料項的功能。報告描述符需要包含的資料項標籤有:輸入輸出資料項標籤、用法資料項標籤、用法頁資料項標籤、邏輯最小和最大值資料項標籤、報告大小資料項標籤以及報告計數資料項標籤。
[data]:資料位元組,隨著前面bSize定義的大小而變化。

2.3 物理描述符

HID裝置的物理描述符主要用於報告物理裝置的啟用資訊,其型別值為0x23,它是可選的,對大部分裝置不需要使用此描述符。