1 標準協議
所有的USB設備都要求對主機發給自己的控制命令作出響應,USB規範定義了11個標準命令,它們分別是:Clear_Feature、 Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、 Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。所 有USB設備都必須支持這些命令(個別命令除外,如Set_Descriptor、Synch_Frame)。
1.1 USB命令的結構
表1、USB命令的結構 | ||||
偏移量 | 域 | 長度(字節) | 值 | 描述 |
0 | bmRequestType | 1 | 位圖 | 請求特徵: D7:傳輸方向 0=主機至設備 1=設備至主機 D6..5:種類 0=標準 1=類 2=廠商 3=保留 D4..0:接受者 0=設備 1=接口 2=端點 3=其他 4..31 保留 |
1 | bRequest | 1 | 值 | 命令類型編碼值(見表3) |
2 | wValue | 2 | 值 | 根據不同的命令,含義也不同 |
4 | wIndex | 2 | 索引或偏移 | 根據不同的命令,含義也不同,主要用於傳送索引或偏 移 |
6 | wLength | 2 | 如有數據傳送階段,此爲數據字節數。 |
1) bmRequestType(向誰請求)
D7:傳輸方向
0=主機至設備;1=設備至主機
D6..5:命令類型
D6D5=00:標準請求命令; D6D5=01:類請求命令;
D6D5=10:用戶定義命令; D6D5=11:保留。
D4..0:接受者類型
0=設備;1=接口 ;
2=端點;3=其它
4..31 保留
這個域表明此請求的特性。特別地,這個域表明了第二階段控制傳輸方向。如果wLength域被設作0的話,表明沒有數據傳送階段,那Direction位就會被忽略.
USB說明定義了一系列所有設備必須支持的標準請求。這些請求見下面的表<Standard Device Requests>。另外,一個設備類可定義更多的請求。設備廠商也可定義設備支持的請求.
請求可被導引到設備,設備接口,或某一個設備端結點(endpoint)上。這個請求域也指定了接收者。當指定的是接口或端結點(endpoint)時,wIndex域指出那個接口或端節點。
2) bmRequest(什麼請求)
這個域標識特別的請求。bmRequestType域的Type字段可修改此域的含義。本文僅定義Type 字段爲0即標準設備請求時bRequest域值的含義。
3) wValue域
此域用來傳送當前請求的參數,隨請求不同而變。
4) wIndex域
當bmRequestType的Recipient字段爲接口或端點時,wIndex域用來表明是哪一個接口或端結。
5) wLength域
這個域表明第二階段的數據傳輸長度。傳輸方向由bmRequstType域的Direction位指出。wLength域爲0則表明無數據傳輸。在輸入請求下,設備返回的數據長度不應多於wLength,但可以少於。在輸出請求下,wLength指出主機發出的確切數據量。如果主機發送多於wLength的數據,設備做出的響應是無定義的。
1.2 標準命令
表2、USB的11種標準命令 | ||||||
命令 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
Clear_Feature |
00000000B |
CLEAR_FEATURE |
特性選擇符 |
零 |
零 |
無 |
Get_Configuration |
10000000B |
GET_CONFIGURATION |
零 |
零 |
一 |
配置值 |
Get_Descriptor |
10000000B |
GET_DESCRIPTOR |
描述表種類(高字節,見表5)和索引(低字節) |
零或語言標誌 |
描述表長 |
描述表 |
Get_Interface |
10000001B |
GET_INTERFACE |
零 |
接口號 |
一 |
可選設置 |
Get_Status |
10000000B |
GET_STATUS |
零 |
零(返回設備狀態) |
二 |
設備, |
Set_Address |
00000000B |
SET_ADDRESS |
設備地址 |
零 |
零 |
無 |
Set_Configuration |
00000000B |
SET_CONFIGURATION |
配置值(高字節爲0,低字節表示要設置的配置值) |
零 |
零 |
無 |
Set_Descriptor |
00000000B |
SET_DESCRIPTOR |
描述表種類(高字節,見表5)和索引(低字節) |
零或語言標誌 |
描述表長 |
描述表 |
Set_Feature |
00000000B |
SET_FEATURE |
特性選擇符(1表示設備,0表示端點) |
零 |
零 |
無 |
Set_Interface |
00000001B |
SET_INTERFACE |
可選設置 |
接口號 |
零 |
無 |
Synch_Frame |
100000010B |
SYNCH_FRAME |
零 |
端點號 |
二 |
幀號 |
1.3 標準命令的編碼值
表3、USB標準命令的編碼值 |
|
bRequest |
Value |
GET_STATUS |
0 |
CLEAR_FEATURE |
1 |
爲將來保留 |
2 |
SET_FEATURE |
3 |
爲將來保留 |
4 |
SET_ADDRESS |
5 |
GET_DESCRIPTOR |
6 |
SET_DESCRIPTOR |
7 |
GET_CONFIGURATION |
8 |
SET_CONFIGURATION |
9 |
GET_INTERFACE |
10 |
SET_INTERFACE |
11 |
SYNCH_FRAME |
12 |
2 USB描述符
USB 協議爲USB設備定義了一套描述設備功能和屬性的有固定結構的描述符,包括標準的描述符即設備描述符、配置描述符、接口描述符、端點描述符和字符串描述 符,還有百標準描述符,如類描述符。USB設備通過這些描述符向USB主機彙報設備的各種各樣屬性,主機通過對這些描述符的訪問對設備進行類型識別、配置 併爲其提供相應的客戶端驅動程序。
USB設備通過描述符反映自己的設備特性。USB描述符是由特定格式排列的一組數據結構組成。
在USB設備枚舉過程中,主機端的協義軟件需要解析從USB設備讀取的所有描述符信息。在USB主向設備發送讀取描述符的請求後,USB設備將所有的描 述符以連續的數據流方式傳輸給USB主機。主機從第一個讀到的字符開始,根據雙方規定好的數據格式,順序地解析讀到的數據流。
USB描述符包含標準描述符、類描述符和廠商特定描述3種形式。任何一種設備必須USB標準描述符(隊字符串描述符可選外)。
在USB1.X中,規定了5種標準描述符:設備描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端點描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。
每個USB設備只有一個設備描述符,而一個設備中可包含一個或多個配置描述符,即USB設備可以有多種配置。設備的每一個配置中又可以包含一個或多個接口描述符,即USB設備可以支持多種功能(接口),接口的特性通過描述符提供。
在USB主機訪問USB設備的描述符時,USB設備依照設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符順序將所有描述符傳給主機。一設 備至少要包含設備描述符、配置描述符和接口描述符,如果USB設備沒有端點描述符,則它僅僅用默認管道與主機進行數據傳輸。
2.1 設備描述符
設備描述符給出了USB設備的一般信息,包括對設備及在設備配置中起全程作用的信息,包括製造商標識號ID、產品序列號、所屬設備類號、默認端點的最大 包長度和配置描述符的個數等。一個USB設備必須有且僅有一個設備描述符。設備描述符是設備連接到總線上時USB主機所讀取的第一個描述符,它包含了14 個字段,結構如下:
USB設備描述符的結構 |
||||
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bLength |
1 |
數字 |
此描述表的字節數 |
1 |
bDecriptorType |
1 |
常量 |
描述符的類型(此處應爲0x01,即設備描述符) |
2 |
bcdUSB |
2 |
BCD碼 |
此設備與描述表兼容的USB設備說明版本號(BCD 碼) |
4 |
bDeviceClass |
1 |
類 |
設備類碼: |
5 |
bDeviceSubClass |
1 |
子類 |
子類挖碼 |
6 |
bDevicePortocol |
1 |
協議 |
協議碼 |
7 |
bMaxPacketSize0 |
1 |
數字 |
端點0的最大包大小(僅8,16,32,64 |
8 |
idVendor |
2 |
ID |
廠商標誌(由USB-IF組織賦值) |
10 |
idProduct |
2 |
ID |
產品標誌(由廠商賦值) |
12 |
bcdDevice |
2 |
BCD 碼 |
設備發行號(BCD 碼) |
14 |
iManufacturer |
1 |
索引 |
描述廠商信息的字符串描述符的索引值。 |
15 |
iProduct |
1 |
索引 |
描述產品信息的字串描述符的索引值。 |
16 |
iSerialNumber |
1 |
索引 |
描述設備序列號信息的字串描述符的索引值。 |
17 |
bNumConfigurations |
1 |
數字 |
可能的配置描述符數目 |
其中bDescriptorType爲描述符的類型,其含義可查下表(此表也適用於標準命令Get_Descriptor中wValue域高字節的取值含義):
USB描述符的類型值 |
||
類型 | 描述符 | 描述符值 |
標準描述符 | 設備描述符(Device Descriptor) | 0x01 |
配置描述符(Configuration Descriptor) | 0x02 | |
字符串描述符(String Descriptor) | 0x03 | |
接口描述符(Interface Descriptor) | 0x04 | |
端點描述符(EndPont Descriptor) | 0x05 | |
類描述符 | 集線器類描述符(Hub Descriptor) | 0x29 |
人機接口類描述符(HID) | 0x21 | |
廠商定義的描述符 | 0xFF |
設備類代碼bDeviceClass可查下表:
設備的類別(bDeviceClass) |
||
值(十進制) |
值(十六進制) |
說明 |
0 |
0x00 |
接口描述符中提供類的值 |
2 |
0x02 |
通信類 |
9 |
0x09 |
集線器類 |
220 |
0xDC |
用於診斷用途的設備類 |
224 |
0xE0 |
無線通信設備類 |
255 |
0xFF |
廠商定義的設備類 |
2.2 配置描述符
配置描述符中包括了描述符的長度(屬於此描述符的所有接口描述符和端點描述符的長度的和)、供電方式(自供電/總線供電)、最大耗電量等。主果主機發出 USB標準命令Get_Descriptor要求得到設備的某個配置描述符,那麼除了此配置描述符以外,此配置包含的所有接口描述符與端點描述符都將提供 給USB主機。
USB配置描述符的結構 | ||||
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bLength |
1 |
數字 |
此描述表的字節數長度。 |
1 |
bDescriptorType |
1 |
常量 |
配置描述表類型(此處爲0x02) |
2 |
wTotalLength |
2 |
數字 |
此配置信息的總長(包括配置,接口,端點和設備類及廠商定義的描述符) |
4 |
bNumInterfaces |
1 |
數字 |
此配置所支持的接口個數 |
5 |
bCongfigurationValue |
1 |
數字 |
在SetConfiguration()請求中用作參數來選定此配置。 |
6 |
iConfiguration |
1 |
索引 |
描述此配置的字串描述表索引 |
7 |
bmAttributes |
1 |
位圖 |
配置特性: |
8 |
MaxPower |
1 |
mA |
在此配置下的總線電源耗費量。以 2mA 爲一個單位。 |
下面是一種硬盤的配置描述符示例:
一種硬盤的配置描述符 | |
字段 | 描述符值(十六進制) |
bLength |
0x09 |
bDescriptorType |
0x02 |
wTotalLength |
0x01F |
bNumInterfaces |
0x01 |
bCongfigurationValue |
0x01 |
iConfiguration |
0x00 |
bmAttributes |
0x0C |
MaxPower |
0x32 |
2.3 接口描述符
配置描述符中包含了一個或多個接口描述符,這裏的“接口”並不是指物理存在的接口,在這裏把它稱之爲“功能”更易理解些,例如一個設備既有錄音的功能又有揚聲器的功能,則這個設備至少就有兩個“接口”。
如果一個配置描述符不止支持一個接口描述符,並且每個接口描述符都有一個或多個端點描述符,那麼在響應USB主機的配置描述符命令時,USB設備的端點 描述符總是緊跟着相關的接口描述符後面,作爲配置描述符的一部分被返回。接口描述符不可直接用Set_Descriptor和 Get_Descriptor來存取。
如果一個接口僅使用端點0,則接口描述符以後就不再返回端點描述符,並且此接口表現的是一個控制接口的特性,它使用與端點0相關聯的默認管道進行數據傳輸。在這種情況下bNumberEndpoints域應被設置成0。接口描述符在說明端點個數並不把端點0計算在內。
USB接口描述符的結構 | ||||
偏移量 |
域 |
大小 |
值 |
說明 |
0 |
bLength |
1 |
數字 |
此表的字節數 |
1 |
bDescriptorType |
1 |
常量 |
接口描述表類(此處應爲0x04) |
2 |
bInterfaceNumber |
1 |
數字 |
接口號,當前配置支持的接口數組索引(從零開始)。 |
3 |
bAlternateSetting |
1 |
數字 |
可選設置的索引值。 |
4 |
bNumEndpoints |
1 |
數字 |
此接口用的端點數量,如果是零則說明此接口只用缺省控制管道。 |
5 |
bInterfaceClass |
1 |
類 |
接口所屬的類值: |
6 |
bInterfaceSubClass |
1 |
子類 |
子類碼 |
7 |
bInterfaceProtocol |
1 |
協議 |
協議碼:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一個接口支持設備類相關的請求此域的值指出了設備類說明中所定義的協議. |
8 |
iInterface |
1 |
索引 |
描述此接口的字串描述表的索引值。 |
對於bInterfaceClass字段,表示接口所屬的類別,USB協議根據功能將不同的接口劃分成不的類,其具體含義如下表所示:
USB協議定義的接口類別(bInterfaceClass) | |
值(十六進制) | 類別 |
0x01 | 音頻類 |
0x02 | CDC控制類 |
0x03 | 人機接口類(HID) |
0x05 | 物理類 |
0x06 | 圖像類 |
0x07 | 打印機類 |
0x08 | 大數據存儲類 |
0x09 | 集線器類 |
0x0A | CDC數據類 |
0x0B | 智能卡類 |
0x0D | 安全類 |
0xDC | 診斷設備類 |
0xE0 | 無線控制器類 |
0xFE | 特定應用類(包括紅外的橋接器等) |
0xFF | 廠商定義的設備 |
2.4 端點描述符
端點是設備與主機之間進行數據傳輸的邏輯接口,除配置使用的端點0(控制端點,一般一個設備只有一個控制端點)爲雙向端口外,其它均爲單向。端點描述符描述了數據的傳輸類型、傳輸方向、數據包大小和端點號(也可稱爲端點地址)等。
除了描述符中描述的端點外,每個設備必須要有一個默認的控制型端點,地址爲0,它的數據傳輸爲雙向,而且沒有專門的描述符,只是在設備描述符中定義了它的最大包長度。主機通過此端點向設備發送命令,獲得設備的各種描述符的信息,並通過它來配置設備。
USB端點描述符的結構 | ||||
偏移量 |
域 |
大小 |
值 |
說明 |
0 |
bLength |
1 |
數字 |
此描述表的字節數長度 |
1 |
bDescriptorType |
1 |
常量 |
端點描述表類(此處應爲0x05) |
2 |
bEndpointAddress |
1 |
端點 |
此描述表所描述的端點的地址、方向: |
3 |
bmAttributes |
1 |
位圖 |
此域的值描述的是在bConfigurationValue域所指的配置下端點的特性。 |
4 |
wMaxPacketSize |
2 |
數字 |
當前配置下此端點能夠接收或發送的最大數據包的大小。 |
6 |
bInterval |
1 |
數字 |
週期數據傳輸端點的時間間隙。 |