USB 描述符及其間的關(guān)系
例如USB鼠標,USB鍵盤,U盤等等,那么USB主機是如何識別出不同的
設(shè)備的呢?這就要依賴于描述符了。
USB的描述符主要有設(shè)備描述符,配置描述符,接口描述符,
端點描述符,字符串描述符,HID描述符,報告描述符等等。
關(guān)于報告描述符,請看我以前寫的:《USBHID報告及報告描述符簡介》
http://group.ednchina.com/93/198.aspx。
一個USB設(shè)備有一個設(shè)備描述符,設(shè)備描述符里面決定了該設(shè)備有多
少種配置,每種配置描述符對應(yīng)著配置描述符;而在配置描述符中又定義
了該配置里面有多少個接口,每個接口有對應(yīng)的接口描述符;在接口描
述符里面又定義了該接口有多少個端點,每個端點對應(yīng)一個端點描述符;
端點描述符定義了端點的大小,類型等等。由此我們可以看出,USB的
描述符之間的關(guān)系是一層一層的,最上一層是設(shè)備描述符,下面是配置
描述符,再下面是接口描述符,再下面是端點描述符。在獲取描述符時,
先獲取設(shè)備描述符,然后再獲取配置描述符,根據(jù)配置描述符中的配置
集合長度,一次將配置描述符、接口描述符、端點描述符一起一次讀回。
其中可能還會有獲取設(shè)備序列號,廠商字符串,產(chǎn)品字符串等。
每種描述符都有自己獨立的編號,如下:
#defineDEVICE_DESCRIPTOR0x01//設(shè)備描述符
#defineCONFIGURATION_DESCRIPTOR0x02//配置描述符
#defineSTRING_DESCRIPTOR0x03//字符串描述符
#defineINTERFACE_DESCRIPTOR0x04//接口描述符
#defineENDPOINT_DESCRIPTOR0x05//端點描述符
下面分別詳細介紹一下各描述符。
1.設(shè)備描述符
//定義標準的設(shè)備描述符結(jié)構(gòu)
typedefstruct_DEVICE_DCESCRIPTOR_STRUCT
{
BYTEblength;//設(shè)備描述符的字節(jié)數(shù)大小
BYTEbDescriptorType;//設(shè)備描述符類型編號
WORDbcdUSB;//USB版本號
BYTEbDeviceClass;//USB分配的設(shè)備類代碼
BYTEbDeviceSubClass;//USB分配的子類代碼
BYTEbDeviceProtocol;//USB分配的設(shè)備協(xié)議代碼
BYTEbMaxPacketSize0;//端點0的最大包大小
WORDidVendor;//廠商編號
WORDidProduct;//產(chǎn)品編號
WORDbcdDevice;//設(shè)備出廠編號
BYTEiManufacturer;//設(shè)備廠商字符串的索引
BYTEiProduct;//描述產(chǎn)品字符串的索引
BYTEiSerialNumber;//描述設(shè)備序列號字符串的索引
BYTEbNumConfigurations;//可能的配置數(shù)量
}
DEVICE_DESCRIPTOR_STRUCT,*pDEVICE_DESCRIPTOR_STRUCT;
//實際的設(shè)備描述符示例
codeDEVICE_DESCRIPTOR_STRUCTdevice_descriptor=//設(shè)備描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT),//設(shè)備描述符的字節(jié)數(shù)大小,這里是18字節(jié)
DEVICE_DESCRIPTOR,//設(shè)備描述符類型編號,設(shè)備描述符是01
0x1001,//USB版本號,這里是USB01.10,即USB1.1。由于51是大端模式,所以高低字節(jié)交換
0x00,//USB分配的設(shè)備類代碼,0表示類型在接口描述符中定義
0x00,//USB分配的子類代碼,上面一項為0時,本項也要設(shè)置為0
0x00,//USB分配的設(shè)備協(xié)議代碼,上面一項為0時,本項也要設(shè)置為0
0x10,//端點0的最大包大小,這里為16字節(jié)
0x7104,//廠商編號,這個是需要跟USB組織申請的ID號,表示廠商代號。
0xf0ff,//該產(chǎn)品的編號,跟廠商編號一起配合使用,讓主機注冊該設(shè)備并加載相應(yīng)的驅(qū)動程序
0x0100,//設(shè)備出廠編號
0x01,//設(shè)備廠商字符串的索引,在獲取字符串描述符時,使用該索引號來識別不同的字符串
0x02,//描述產(chǎn)品字符串的索引,同上
0x03,//描述設(shè)備序列號字符串的索引,同上
0x01//可能的配置數(shù)為1,即該設(shè)備只有一個配置
};
2.配置描述符
//定義標準的配置描述符結(jié)構(gòu)
typedefstruct_CONFIGURATION_DESCRIPTOR_STRUCT
{
BYTEbLength;//配置描述符的字節(jié)數(shù)大小
BYTEbDescriptorType;//配置描述符類型編號
WORDwTotalLength;//此配置返回的所有數(shù)據(jù)大小
BYTEbNumInterfaces;//此配置所支持的接口數(shù)量
BYTEbConfigurationValue;//Set_Configuration命令所需要的參數(shù)值
BYTEiConfiguration;//描述該配置的字符串的索引值
BYTEbmAttributes;//供電模式的選擇
BYTEMaxPower;//設(shè)備從總線提取的最大電流
}
CONFIGURATION_DESCRIPTOR_STRUCT,*pCONFIGURATION_DESCRIPTOR_STRUCT;
評論