usb-descriptor(二)

迷霧綠洲發表於2016-12-29

3、介面描述符

  配置描述符中包含了一個或多個介面描述符,這裡的“介面”並不是指物理存在的介面,在這裡把它稱之為“功能”更易理解些,例如一個裝置既有錄音的功能又有揚聲器的功能,則這個裝置至少就有兩個“介面”。

  如果一個配置描述符不止支援一個介面描述符,並且每個介面描述符都有一個或多個端點描述符,那麼在響應USB主機的配置描述符命令時,USB裝置的端點描述符總是緊跟著相關的介面描述符後面,作為配置描述符的一部分被返回。介面描述符不可直接用Set_Descriptor和Get_Descriptor來存取。

  如果一個介面僅使用端點0,則介面描述符以後就不再返回端點描述符,並且此介面表現的是一個控制介面的特性,它使用與端點0相關聯的預設管道進行資料傳輸。在這種情況下bNumberEndpoints域應被設定成0。介面描述符在說明端點個數並不把端點0計算在內。

表10、USB介面描述符的結構

偏移量 大小 說明
0 bLength 1 數字 此表的位元組數
1 bDescriptorType 1 常量 介面描述表類(此處應為0x04)
2 bInterfaceNumber 1 數字 介面號,當前配置支援的介面陣列索引(從零開始)。
3 bAlternateSetting 1 數字 可選設定的索引值。
4 bNumEndpoints 1 數字 此介面用的端點數量,如果是零則說明此介面只用預設控制管道。
5 bInterfaceClass 1 口所屬的類值:零值為將來的標準保留。 如果此域的值設為FFH,則此介面類由廠商說明。 所有其它的值由USB 說明保留。
6 bInterfaceSubClass 1 子類碼這些值的定義視bInterfaceClass域而定。 如果bInterfaceClass域的值為零則此域的值必須為零。bInterfaceClass域不為FFH則所有值由USB 所保留。
7 bInterfaceProtocol 1 協議 協議碼:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一個介面支援裝置類相關的請求此域的值指出了裝置類說明中所定義的協議.
8 iInterface 1 索引 描述此介面的字串描述表的索引值。

表11、USB協議定義的介面類別(bInterfaceClass)

值(十六進位制) 類別
0x01 音訊類
0x02 CDC控制類
0x03 人機介面類(HID)
0x05 物理類
0x06 影象類
0x07 印表機類
0x08 大資料儲存類
0x09 集線器類
0x0A CDC資料類
0x0B 智慧卡類
0x0D 安全類
0xDC 診斷裝置類
0xE0 無線控制器類
0xFE 特定應用類(包括紅外的橋接器等)
0xFF 廠商定義的裝置

4、端點描述符

  端點是裝置與主機之間進行資料傳輸的邏輯介面,除配置使用的端點0(控制端點,一般一個裝置只有一個控制端點)為雙向埠外,其它均為單向。端點描述符描述了資料的傳輸型別、傳輸方向、資料包大小和端點號(也可稱為端點地址)等。

  除了描述符中描述的端點外,每個裝置必須要有一個預設的控制型端點,地址為0,它的資料傳輸為雙向,而且沒有專門的描述符,只是在裝置描述符中定義了它的最大包長度。主機通過此端點向裝置傳送命令,獲得裝置的各種描述符的資訊,並通過它來配置裝置。

表12、USB端點描述符的結構

偏移量 大小 說明
0 bLength 1 數字 此描述表的位元組數長度
1 bDescriptorType 1 常量 端點描述表類(此處應為0x05)
2 bEndpointAddress 1 端點 此描述表所描述的端點的地址、方向:Bit 3..0 : 端點號.Bit 6..4 : 保留,為零 Bit 7: 方向,如果控制端點則略。 0:輸出端點(主機到裝置) 1:輸入端點(裝置到主機)
3 bmAttributes 1 點陣圖 此域的值描述的是在bConfigurationValue域所指的配置下端點的特性。Bit 1..0 :傳送型別 00=控制傳送 01=同步傳送 10=批傳送 11=中斷傳送 所有其它的位都保留。
4 wMaxPacketSize 2 數字 當前配置下此端點能夠接收或傳送的最大資料包的大小。 對於實進傳輸,此值用於為每幀的資料淨負荷預留時間。在實際執行時,管道可能不完全需要預留的頻寬,實際頻寬可由裝置通過一種非USB定義的機制彙報給主機。對於中斷傳輸,批量傳輸和控制傳輸,端點可能傳送比之短的資料包
6 bInterval 1 數字 週期資料傳輸端點的時間間隙。 此域的值對於批傳送的端點及控制傳送的端點無意義。對於同步傳送的端點此域必需為1,表示週期為1ms。對於中斷傳送的端點此域值的範圍為1ms到255ms。

下表是一種滑鼠的端點描述符的示例,該端點是一箇中斷端點:

表13、一種滑鼠的端點描述符示例

值(十六進位制)
bLength 0x07
bDescriptorType 0x05
bEndpointAddress 0x81
bmAttributes 0x03
wMaxPacketSize 0x04
bInterval 0x0A

5、字串描述符

  字串描述符是一種可選的USB標準描述符,描述瞭如制商、裝置名稱或序列號等資訊。如果一個裝置無字串描述符,則其它描述符中與字串有關的索引值都必須為0。字串使用的是Unicode編碼。

  主機請示得到某個字串描述符時一般分成兩步:首先主機向裝置發出USB標準命令Get_Descriptor,其中所使用的字串的索引值為0,裝置返回一個字串描述符,此描述符的結構如下:

表14、USB字串描述符(響應主機請求時返回的表示語言ID的字串描述符)

偏移量 大小 描述
0 bLength 1 N+2 此描述表的位元組數
1 bDescriptorType 1 常量 字串描述表型別(此處應為0x03)
2 wLANGID[0] 2 數字 語言標識(LANGID)碼0
N wLANGID[x] 2 數字 語言標識(LANGID) 碼X

該字串描述符雙位元組的語言ID的陣列,wLANGID[0]~wLANGID[x]指明瞭裝置支援的語言,具體含義可檢視USB_LANGIDs.pdf。

  主機根據自己需要的語言,再次向裝置發出USB標準命令Get_Descriptor,指明所要求得到的字串的索引值和語言。這次裝置所返回的是Unicode編號的字串描述符,其結構如下:

表15、Unicode字串描述符(響應主機請求時真正表示字串編碼的字串描述符)

偏移量 大小 描述
0 bLength 1 此描述表的位元組數(bString域的數值N+2)
1 bDescriptorType 1 常量 字串描述表型別(此處應為0x03)
2 bString N 數字 UNICODE 編碼的字串

bString域為裝置實際返回的以UNICODE編碼的字串流,我們在編寫裝置端硬體驅動的時候需要將字串轉換為UNICODE編碼,您可以通過一些UNICODE轉換工具進行轉換。