一、USB命令
在USB規(guī)范里,對(duì)命令一詞提供的單詞為“Request”,但這里為了更好的理解主機(jī)與設(shè)備之間的主從關(guān)系,將它定義成“命令”。
所有的USB設(shè)備都要求對(duì)主機(jī)發(fā)給自己的控制命令作出響應(yīng),USB規(guī)范定義了11個(gè)標(biāo)準(zhǔn)命令,它們分別是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。所有USB設(shè)備都必須支持這些命令(個(gè)別命令除外,如Set_Descriptor、Synch_Frame)。
不同的命令雖然有不同的數(shù)據(jù)和使用目的,但所有的USB命令結(jié)構(gòu)是一樣的。下表所示為USB命令的結(jié)構(gòu):
表1、USB命令的結(jié)構(gòu) |
偏移量 |
域 |
長度(字節(jié)) |
值 |
描述 |
0 |
bmRequestType |
1 |
位圖 |
請(qǐng)求特征: D7:傳輸方向 0=主機(jī)至設(shè)備 1=設(shè)備至主機(jī) D6..5:種類 0=標(biāo)準(zhǔn) 1=類 2=廠商 3=保留 D4..0:接受者 0=設(shè)備 1=接口 2=端點(diǎn) 3=其他 4..31 保留 |
1 |
bRequest |
1 |
值 |
命令類型編碼值(見表3) |
2 |
wValue |
2 |
值 |
根據(jù)不同的命令,含義也不同 |
4 |
wIndex |
2 |
索引或偏移 |
根據(jù)不同的命令,含義也不同,主要用于傳送索引或偏 移 |
6 |
wLength |
2 |
|
如有數(shù)據(jù)傳送階段,此為數(shù)據(jù)字節(jié)數(shù)。 |
下表列出了USB的11種標(biāo)準(zhǔn)命令
表2、USB的11種標(biāo)準(zhǔn)命令 |
命令 |
bmRequestType
|
bRequest
|
wValue
|
wIndex
|
wLength
|
Data
|
Clear_Feature |
00000000B 00000001B 00000010B
|
CLEAR_FEATURE
|
特性選擇符
|
零 接口號(hào) 端點(diǎn)號(hào)
|
零
|
無
|
Get_Configuration |
10000000B
|
GET_CONFIGURATION
|
零
|
零
|
一
|
配置值
|
Get_Descriptor |
10000000B
|
GET_DESCRIPTOR
|
描述表種類(高字節(jié),見表5)和索引(低字節(jié))
|
零或語言標(biāo)志
|
描述表長
|
描述表
|
Get_Interface |
10000001B
|
GET_INTERFACE
|
零
|
接口號(hào)
|
一
|
可選設(shè)置
|
Get_Status |
10000000B 10000001B 10000010B
|
GET_STATUS
|
零
|
零(返回設(shè)備狀態(tài)) 接口號(hào)(對(duì)像時(shí)接口時(shí)) 端點(diǎn)號(hào)(對(duì)象是端點(diǎn)時(shí))
|
二
|
設(shè)備, 接口 ,或 端點(diǎn)狀態(tài)
|
Set_Address |
00000000B
|
SET_ADDRESS
|
設(shè)備地址
|
零
|
零
|
無
|
Set_Configuration |
00000000B
|
SET_CONFIGURATION
|
配置值(高字節(jié)為0,低字節(jié)表示要設(shè)置的配置值)
|
零
|
零
|
無
|
Set_Descriptor |
00000000B
|
SET_DESCRIPTOR
|
描述表種類(高字節(jié),見表5)和索引(低字節(jié))
|
零或語言標(biāo)志
|
描述表長
|
描述表
|
Set_Feature |
00000000B 00000001B 00000010B
|
SET_FEATURE
|
特性選擇符(1表示設(shè)備,0表示端點(diǎn))
|
零 接口號(hào) 端點(diǎn)號(hào)
|
零
|
無
|
Set_Interface |
00000001B
|
SET_INTERFACE
|
可選設(shè)置
|
接口號(hào)
|
零
|
無
|
Synch_Frame |
100000010B
|
SYNCH_FRAME
|
零
|
端點(diǎn)號(hào)
|
二
|
幀號(hào)
|
其中bRequest為命令編碼值,含意見表3:
表3、USB標(biāo)準(zhǔn)命令的編碼值
|
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
|
二、USB描述符
USB協(xié)議為USB設(shè)備定義了一套描述設(shè)備功能和屬性的有固定結(jié)構(gòu)的描述符,包括標(biāo)準(zhǔn)的描述符即設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符和字符串描述符,還有百標(biāo)準(zhǔn)描述符,如類描述符。USB設(shè)備通過這些描述符向USB主機(jī)匯報(bào)設(shè)備的各種各樣屬性,主機(jī)通過對(duì)這些描述符的訪問對(duì)設(shè)備進(jìn)行類型識(shí)別、配置并為其提供相應(yīng)的客戶端驅(qū)動(dòng)程序。
USB設(shè)備通過描述符反映自己的設(shè)備特性。USB描述符是由特定格式排列的一組數(shù)據(jù)結(jié)構(gòu)組成。
在USB設(shè)備枚舉過程中,主機(jī)端的協(xié)義軟件需要解析從USB設(shè)備讀取的所有描述符信息。在USB主向設(shè)備發(fā)送讀取描述符的請(qǐng)求后,USB設(shè)備將所有的描述符以連續(xù)的數(shù)據(jù)流方式傳輸給USB主機(jī)。主機(jī)從第一個(gè)讀到的字符開始,根據(jù)雙方規(guī)定好的數(shù)據(jù)格式,順序地解析讀到的數(shù)據(jù)流。
USB描述符包含標(biāo)準(zhǔn)描述符、類描述符和廠商特定描述3種形式。任何一種設(shè)備必須USB標(biāo)準(zhǔn)描述符(隊(duì)字符串描述符可選外)。
在USB1.X中,規(guī)定了5種標(biāo)準(zhǔn)描述符:設(shè)備描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端點(diǎn)描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。
每個(gè)USB設(shè)備只有一個(gè)設(shè)備描述符,而一個(gè)設(shè)備中可包含一個(gè)或多個(gè)配置描述符,即USB設(shè)備可以有多種配置。設(shè)備的每一個(gè)配置中又可以包含一個(gè)或多個(gè)接口描述符,即USB設(shè)備可以支持多種功能(接口),接口的特性通過描述符提供。
在USB主機(jī)訪問USB設(shè)備的描述符時(shí),USB設(shè)備依照設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符、字符串描述符順序?qū)⑺忻枋龇麄鹘o主機(jī)。一設(shè)備至少要包含設(shè)備描述符、配置描述符和接口描述符,如果USB設(shè)備沒有端點(diǎn)描述符,則它僅僅用默認(rèn)管道與主機(jī)進(jìn)行數(shù)據(jù)傳輸。
1、設(shè)備描述符
設(shè)備描述符給出了USB設(shè)備的一般信息,包括對(duì)設(shè)備及在設(shè)備配置中起全程作用的信息,包括制造商標(biāo)識(shí)號(hào)ID、產(chǎn)品序列號(hào)、所屬設(shè)備類號(hào)、默認(rèn)端點(diǎn)的最大包長度和配置描述符的個(gè)數(shù)等。一個(gè)USB設(shè)備必須有且僅有一個(gè)設(shè)備描述符。設(shè)備描述符是設(shè)備連接到總線上時(shí)USB主機(jī)所讀取的第一個(gè)描述符,它包含了14個(gè)字段,結(jié)構(gòu)如下:
表4、USB設(shè)備描述符的結(jié)構(gòu)
|
偏移量
|
域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
數(shù)字
|
此描述表的字節(jié)數(shù)
|
1
|
bDecriptorType
|
1
|
常量
|
描述符的類型(此處應(yīng)為0x01,即設(shè)備描述符)
|
2
|
bcdUSB
|
2
|
BCD碼
|
此設(shè)備與描述表兼容的USB設(shè)備說明版本號(hào)(BCD 碼)
|
4
|
bDeviceClass
|
1
|
類
|
設(shè)備類碼: 如果此域的值為0則一個(gè)設(shè)置下每個(gè)接口指出它自己的類,各個(gè)接口各自獨(dú)立工作。 如果此域的值處于1~FEH之間,則設(shè)備在不同的接口上支持不同的類。并這些接口可能不能獨(dú)立工作。此值指出了這些接口集體的類定義。 如果此域設(shè)為FFH,則此設(shè)備的類由廠商定義。
|
5
|
bDeviceSubClass
|
1
|
子類
|
子類挖碼 這些碼值的具體含義根據(jù)bDeviceClass 域來看。 如bDeviceClass 域?yàn)榱悖擞蛞岔殲榱?nbsp; 如bDeviceClass 域?yàn)镕FH,此域的所有值保留。
|
6
|
bDevicePortocol
|
1
|
協(xié)議
|
協(xié)議碼 這些碼的值視bDeviceClass 和 bDeviceSubClass 的值而定。 如果設(shè)備支持設(shè)備類相關(guān)的協(xié)議,此碼標(biāo)志了設(shè)備類的值。如果此域的值為零,則此設(shè)備不支持設(shè)備類相關(guān)的協(xié)議,然而,可能它的接口支持設(shè)備類相關(guān)的協(xié)議。如果此域的值為FFH,此設(shè)備使用廠商定義的協(xié)議。
|
7
|
bMaxPacketSize0
|
1
|
數(shù)字
|
端點(diǎn)0的最大包大?。▋H8,16,32,64 為合法值)
|
8
|
idVendor
|
2
|
ID
|
廠商標(biāo)志(由USB-IF組織賦值)
|
10
|
idProduct
|
2
|
ID
|
產(chǎn)品標(biāo)志(由廠商賦值)
|
12
|
bcdDevice
|
2
|
BCD 碼
|
設(shè)備發(fā)行號(hào)(BCD 碼)
|
14
|
iManufacturer
|
1
|
索引
|
描述廠商信息的字符串描述符的索引值。
|
15
|
iProduct
|
1
|
索引
|
描述產(chǎn)品信息的字串描述符的索引值。
|
16
|
iSerialNumber
|
1
|
索引
|
描述設(shè)備序列號(hào)信息的字串描述符的索引值。
|
17
|
bNumConfigurations
|
1
|
數(shù)字
|
可能的配置描述符數(shù)目
|
其中bDescriptorType為描述符的類型,其含義可查下表(此表也適用于標(biāo)準(zhǔn)命令Get_Descriptor中wValue域高字節(jié)的取值含義):
表5、USB描述符的類型值
|
類型 |
描述符 |
描述符值 |
標(biāo)準(zhǔn)描述符 |
設(shè)備描述符(Device Descriptor) |
0x01 |
配置描述符(Configuration Descriptor) |
0x02 |
字符串描述符(String Descriptor) |
0x03 |
接口描述符(Interface Descriptor) |
0x04 |
端點(diǎn)描述符(EndPont Descriptor) |
0x05 |
類描述符 |
集線器類描述符(Hub Descriptor) |
0x29 |
人機(jī)接口類描述符(HID) |
0x21 |
廠商定義的描述符 |
|
0xFF |
設(shè)備類代碼bDeviceClass可查下表:
表6、設(shè)備的類別(bDeviceClass)
|
值(十進(jìn)制)
|
值(十六進(jìn)制)
|
說明 |
0
|
0x00
|
接口描述符中提供類的值 |
2
|
0x02
|
通信類 |
9
|
0x09
|
集線器類 |
220
|
0xDC
|
用于診斷用途的設(shè)備類 |
224
|
0xE0
|
無線通信設(shè)備類 |
255
|
0xFF
|
廠商定義的設(shè)備類 |
下表列出了一個(gè)USB鼠標(biāo)的設(shè)備描述符的例子,供大家分析一下:
表7、一種鼠標(biāo)的設(shè)備描述符示例
|
字段 |
描述符值(十六制) |
bLength
|
0x12 |
bDecriptorType
|
0x01 |
bcdUSB
|
x0110 |
bDeviceClass
|
0x00 |
bDeviceSubClass
|
0x00 |
bDevicePortocol
|
0x00 |
bMaxPacketSize0
|
0x08 |
idVendor
|
0x045E(Microsoft Corporation) |
idProduct
|
0x0047 |
bcdDevice
|
0x300 |
iManufacturer
|
0x01 |
iProduct
|
0x03 |
iSerialNumber
|
0x00 |
bNumConfigurations
|
0x01 |
2、配置描述符
配置描述符中包括了描述符的長度(屬于此描述符的所有接口描述符和端點(diǎn)描述符的長度的和)、供電方式(自供電/總線供電)、最大耗電量等。主果主機(jī)發(fā)出USB標(biāo)準(zhǔn)命令Get_Descriptor要求得到設(shè)備的某個(gè)配置描述符,那么除了此配置描述符以外,此配置包含的所有接口描述符與端點(diǎn)描述符都將提供給USB主機(jī)。
表8、USB配置描述符的結(jié)構(gòu) |
偏移量
|
域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
數(shù)字
|
此描述表的字節(jié)數(shù)長度。
|
1
|
bDescriptorType
|
1
|
常量
|
配置描述表類型(此處為0x02)
|
2
|
wTotalLength
|
2
|
數(shù)字
|
此配置信息的總長(包括配置,接口,端點(diǎn)和設(shè)備類及廠商定義的描述符)
|
4
|
bNumInterfaces
|
1
|
數(shù)字
|
此配置所支持的接口個(gè)數(shù)
|
5
|
bCongfigurationValue
|
1
|
數(shù)字
|
在SetConfiguration()請(qǐng)求中用作參數(shù)來選定此配置。
|
6
|
iConfiguration
|
1
|
索引
|
描述此配置的字串描述表索引
|
7
|
bmAttributes
|
1
|
位圖
|
配置特性: D7: 保留(設(shè)為一) D6: 自給電源 D5: 遠(yuǎn)程喚醒 D4..0:保留(設(shè)為一) 一個(gè)既用總線電源又有自給電源的設(shè)備會(huì)在MaxPower域指出需要從總線取的電量。并設(shè)置D6為一。運(yùn)行時(shí)期的實(shí)際電源模式可由GetStatus(DEVICE) 請(qǐng)求得到。
|
8
|
MaxPower
|
1
|
mA
|
在此配置下的總線電源耗費(fèi)量。以 2mA 為一個(gè)單位。
|
下面是一種硬盤的配置描述符示例:
表9、一種硬盤的配置描述符示例 |
字段 |
描述符值(十六進(jìn)制) |
bLength
|
0x09 |
bDescriptorType
|
0x02 |
wTotalLength
|
0x01F |
bNumInterfaces
|
0x01 |
bCongfigurationValue
|
0x01 |
iConfiguration
|
0x00 |
bmAttributes
|
0x0C |
MaxPower
|
0x32 |
3、接口描述符
配置描述符中包含了一個(gè)或多個(gè)接口描述符,這里的“接口”并不是指物理存在的接口,在這里把它稱之為“功能”更易理解些,例如一個(gè)設(shè)備既有錄音的功能又有揚(yáng)聲器的功能,則這個(gè)設(shè)備至少就有兩個(gè)“接口”。
如果一個(gè)配置描述符不止支持一個(gè)接口描述符,并且每個(gè)接口描述符都有一個(gè)或多個(gè)端點(diǎn)描述符,那么在響應(yīng)USB主機(jī)的配置描述符命令時(shí),USB設(shè)備的端點(diǎn)描述符總是緊跟著相關(guān)的接口描述符后面,作為配置描述符的一部分被返回。接口描述符不可直接用Set_Descriptor和Get_Descriptor來存取。
如果一個(gè)接口僅使用端點(diǎn)0,則接口描述符以后就不再返回端點(diǎn)描述符,并且此接口表現(xiàn)的是一個(gè)控制接口的特性,它使用與端點(diǎn)0相關(guān)聯(lián)的默認(rèn)管道進(jìn)行數(shù)據(jù)傳輸。在這種情況下bNumberEndpoints域應(yīng)被設(shè)置成0。接口描述符在說明端點(diǎn)個(gè)數(shù)并不把端點(diǎn)0計(jì)算在內(nèi)。
表10、USB接口描述符的結(jié)構(gòu) |
偏移量
|
域
|
大小
|
值
|
說明
|
0
|
bLength
|
1
|
數(shù)字
|
此表的字節(jié)數(shù)
|
1
|
bDescriptorType
|
1
|
常量
|
接口描述表類(此處應(yīng)為0x04)
|
2
|
bInterfaceNumber
|
1
|
數(shù)字
|
接口號(hào),當(dāng)前配置支持的接口數(shù)組索引(從零開始)。
|
3
|
bAlternateSetting
|
1
|
數(shù)字
|
可選設(shè)置的索引值。
|
4
|
bNumEndpoints
|
1
|
數(shù)字
|
此接口用的端點(diǎn)數(shù)量,如果是零則說明此接口只用缺省控制管道。
|
5
|
bInterfaceClass
|
1
|
類
|
接口所屬的類值: 零值為將來的標(biāo)準(zhǔn)保留。 如果此域的值設(shè)為FFH,則此接口類由廠商說明。 所有其它的值由USB 說明保留。
|
6
|
bInterfaceSubClass
|
1
|
子類
|
子類碼 這些值的定義視bInterfaceClass域而定。 如果bInterfaceClass域的值為零則此域的值必須為零。 bInterfaceClass域不為FFH則所有值由USB 所保留。
|
7
|
bInterfaceProtocol
|
1
|
協(xié)議
|
協(xié)議碼:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一個(gè)接口支持設(shè)備類相關(guān)的請(qǐng)求此域的值指出了設(shè)備類說明中所定義的協(xié)議.
|
8
|
iInterface
|
1
|
索引
|
描述此接口的字串描述表的索引值。
|
對(duì)于bInterfaceClass字段,表示接口所屬的類別,USB協(xié)議根據(jù)功能將不同的接口劃分成不的類,其具體含義如下表所示:
表11、USB協(xié)議定義的接口類別(bInterfaceClass) |
值(十六進(jìn)制) |
類別 |
0x01 |
音頻類 |
0x02 |
CDC控制類 |
0x03 |
人機(jī)接口類(HID) |
0x05 |
物理類 |
0x06 |
圖像類 |
0x07 |
打印機(jī)類 |
0x08 |
大數(shù)據(jù)存儲(chǔ)類 |
0x09 |
集線器類 |
0x0A |
CDC數(shù)據(jù)類 |
0x0B |
智能卡類 |
0x0D |
安全類 |
0xDC |
診斷設(shè)備類 |
0xE0 |
無線控制器類 |
0xFE |
特定應(yīng)用類(包括紅外的橋接器等) |
0xFF |
廠商定義的設(shè)備 |
4、端點(diǎn)描述符
端點(diǎn)是設(shè)備與主機(jī)之間進(jìn)行數(shù)據(jù)傳輸?shù)倪壿嫿涌?,除配置使用的端點(diǎn)0(控制端點(diǎn),一般一個(gè)設(shè)備只有一個(gè)控制端點(diǎn))為雙向端口外,其它均為單向。端點(diǎn)描述符描述了數(shù)據(jù)的傳輸類型、傳輸方向、數(shù)據(jù)包大小和端點(diǎn)號(hào)(也可稱為端點(diǎn)地址)等。
除了描述符中描述的端點(diǎn)外,每個(gè)設(shè)備必須要有一個(gè)默認(rèn)的控制型端點(diǎn),地址為0,它的數(shù)據(jù)傳輸為雙向,而且沒有專門的描述符,只是在設(shè)備描述符中定義了它的最大包長度。主機(jī)通過此端點(diǎn)向設(shè)備發(fā)送命令,獲得設(shè)備的各種描述符的信息,并通過它來配置設(shè)備。
表12、USB端點(diǎn)描述符的結(jié)構(gòu) |
偏移量
|
域
|
大小
|
值
|
說明
|
0
|
bLength
|
1
|
數(shù)字
|
此描述表的字節(jié)數(shù)長度
|
1
|
bDescriptorType
|
1
|
常量
|
端點(diǎn)描述表類(此處應(yīng)為0x05)
|
2
|
bEndpointAddress
|
1
|
端點(diǎn)
|
此描述表所描述的端點(diǎn)的地址、方向: Bit 3..0 : 端點(diǎn)號(hào). Bit 6..4 : 保留,為零 Bit 7: 方向,如果控制端點(diǎn)則略。 0:輸出端點(diǎn)(主機(jī)到設(shè)備) 1:輸入端點(diǎn)(設(shè)備到主機(jī))
|
3
|
bmAttributes
|
1
|
位圖
|
此域的值描述的是在bConfigurationValue域所指的配置下端點(diǎn)的特性。 Bit 1..0 :傳送類型 00=控制傳送 01=同步傳送 10=批傳送 11=中斷傳送 所有其它的位都保留。
|
4
|
wMaxPacketSize
|
2
|
數(shù)字
|
當(dāng)前配置下此端點(diǎn)能夠接收或發(fā)送的最大數(shù)據(jù)包的大小。 對(duì)于實(shí)進(jìn)傳輸,此值用于為每幀的數(shù)據(jù)凈負(fù)荷預(yù)留時(shí)間。在實(shí)際運(yùn)行時(shí),管道可能不完全需要預(yù)留的帶寬,實(shí)際帶寬可由設(shè)備通過一種非USB定義的機(jī)制匯報(bào)給主機(jī)。對(duì)于中斷傳輸,批量傳輸和控制傳輸,端點(diǎn)可能發(fā)送比之短的數(shù)據(jù)包
|
6
|
bInterval
|
1
|
數(shù)字
|
周期數(shù)據(jù)傳輸端點(diǎn)的時(shí)間間隙。 此域的值對(duì)于批傳送的端點(diǎn)及控制傳送的端點(diǎn)無意義。對(duì)于同步傳送的端點(diǎn)此域必需為1,表示周期為1ms。對(duì)于中斷傳送的端點(diǎn)此域值的范圍為1ms到255ms。
|
下表是一種鼠標(biāo)的端點(diǎn)描述符的示例,該端點(diǎn)是一個(gè)中斷端點(diǎn):
表13、一種鼠標(biāo)的端點(diǎn)描述符示例 |
域 |
值(十六進(jìn)制) |
bLength
|
0x07 |
bDescriptorType
|
0x05 |
bEndpointAddress
|
0x81 |
bmAttributes
|
0x03 |
wMaxPacketSize
|
0x04 |
bInterval
|
0x0A |
5、字符串描述符
字符串描述符是一種可選的USB標(biāo)準(zhǔn)描述符,描述了如制商、設(shè)備名稱或序列號(hào)等信息。如果一個(gè)設(shè)備無字符串描述符,則其它描述符中與字符串有關(guān)的索引值都必須為0。字符串使用的是Unicode編碼。
主機(jī)請(qǐng)示得到某個(gè)字符串描述符時(shí)一般分成兩步:首先主機(jī)向設(shè)備發(fā)出USB標(biāo)準(zhǔn)命令Get_Descriptor,其中所使用的字符串的索引值為0,設(shè)備返回一個(gè)字符串描述符,此描述符的結(jié)構(gòu)如下:
表14、USB字符串描述符(響應(yīng)主機(jī)請(qǐng)求時(shí)返回的表示語言ID的字符串描述符) |
偏移量
|
域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
N+2
|
此描述表的字節(jié)數(shù)
|
1
|
bDescriptorType
|
1
|
常量
|
字串描述表類型(此處應(yīng)為0x03)
|
2
|
wLANGID[0]
|
2
|
數(shù)字
|
語言標(biāo)識(shí)(LANGID) 碼0
|
…
|
…
|
…
|
…
|
…
|
N
|
wLANGID[x]
|
2
|
數(shù)字
|
語言標(biāo)識(shí)(LANGID) 碼X
|
該字符串描述符雙字節(jié)的語言ID的數(shù)組,wLANGID[0]~wLANGID[x]指明了設(shè)備支持的語言,具體含義可查看USB_LANGIDs.pdf。
主機(jī)根據(jù)自己需要的語言,再次向設(shè)備發(fā)出USB標(biāo)準(zhǔn)命令Get_Descriptor,指明所要求得到的字符串的索引值和語言。這次設(shè)備所返回的是Unicode編號(hào)的字符串描述符,其結(jié)構(gòu)如下:
表15、Unicode字符串描述符(響應(yīng)主機(jī)請(qǐng)求時(shí)真正表示字符串編碼的字符串描述符) |
偏移量
|
域
|
大小
|
值
|
描述
|
0
|
bLength
|
1
|
數(shù)字
|
此描述表的字節(jié)數(shù)(bString域的數(shù)值N+2)
|
1
|
bDescriptorType
|
1
|
常量
|
字串描述表類型(此處應(yīng)為0x03)
|
2
|
bString
|
N
|
數(shù)字
|
UNICODE 編碼的字串
|
bString域?yàn)樵O(shè)備實(shí)際返回的以UNICODE編碼的字符串流,我們?cè)诰帉懺O(shè)備端硬件驅(qū)動(dòng)的時(shí)候需要將字符串轉(zhuǎn)換為UNICODE編碼,您可以通過一些UNICODE轉(zhuǎn)換工具進(jìn)行轉(zhuǎn)換。這里推薦由百合電子工作室開發(fā)的一款USB描述符生成工具“USB Unicode 字符串描述符生成器”,它專門為編寫設(shè)備端驅(qū)動(dòng)程序的需要而定制,可以非常方便將您需要的字符串轉(zhuǎn)換成UNICODE格式,進(jìn)而導(dǎo)入您的C或匯編程序代碼中,以下是它的界面:

USB Unicode 字符串描述符生成器-生成C語言格式

USB Unicode 字符串描述符生成器-生成匯編格式
溫馨提示:
百合電子工作室有一個(gè)關(guān)于USB開發(fā)方面的開源項(xiàng)目-Easy USB 51 Programer,整個(gè)開發(fā)過程寫得非常詳細(xì),不防參考一下,您還可以進(jìn)入她的論壇參與此項(xiàng)目的討論。
注:本篇文章部分內(nèi)容摘自《USB協(xié)議》和《USB技術(shù)及應(yīng)用設(shè)計(jì)》