USB的描述符及各種描述符之間的依賴(lài)關(guān)系.USB是個(gè)通用的總線(xiàn),端口都是統一的。但是USB設備卻各種各樣,例如USB鼠標,USB鍵盤(pán),U盤(pán)等等,那么USB主機是如何識別出不同的設備的呢?這就要依賴(lài)于描述符了。
USB的描述符主要有設備描述符,配置描述符,接口描述符,端點(diǎn)描述符,字符串描述符,HID描述符,報告描述符等等。
本文引用地址:http://dyxdggzs.com/article/201612/330287.htm設備描述符記錄的信息:設備所使用的USB協(xié)議版本號,設備類(lèi)型,端點(diǎn)0的最大包大小,廠(chǎng)商ID(VID)和產(chǎn)品(PID),設備版本號,廠(chǎng)商字符串索引,產(chǎn)品字符串索引,設備序列號索引,可能的配置數等.
配置描述符記錄的信息:配置所包含的接口數,配置的編號,供電方式,是否支持遠程喚醒,電流需求量等.
接口描述符記錄的信息:接口的編號,接口的端點(diǎn)數,接口所使用的類(lèi),子類(lèi),協(xié)議等.
端點(diǎn)描述符記錄的信息:端點(diǎn)號及方向,端點(diǎn)的傳輸類(lèi)型,最大包長(cháng)度,查詢(xún)時(shí)間間隔等.
字符串描述符記當的信息:提供一些方便人們閱讀的信息,它不是必需的.
一個(gè)USB設備有一個(gè)設備描述符,設備描述符里面決定了該設備有多少種配置,每種配置描述符對應著(zhù)配置描述符;而在配置描述符中又定義了該配置里面有多少個(gè)接口,每個(gè)接口有對應的接口描述符;在接口描述符里面又定義了該接口有多少個(gè)端點(diǎn),每個(gè)端點(diǎn)對應一個(gè)端點(diǎn)描述符;端點(diǎn)描述符定義了端點(diǎn)的大小,類(lèi)型等等。由此我們可以看出,USB的描述符之間的關(guān)系是一層一層的,最上一層是設備描述符,下面是配置描述符,再下面是接口描述符,再下面是端點(diǎn)描述符。在獲取描述符時(shí),先獲取設備描述符,然后再獲取配置描述符,根據配置描述符中的配置集合長(cháng)度,一次將配置描述符、接口描述符、端點(diǎn)描述符一起一次讀回。其中可能還會(huì )有獲取設備序列號,廠(chǎng)商字符串,產(chǎn)品字符串等。
舉個(gè)例子說(shuō)明它們之間的關(guān)系:8號教學(xué)樓的808教室.8號樓就是設備,而808或其它教室就是端點(diǎn).而配置和接口,是為了方便管理端點(diǎn)而抽象出來(lái)的概念.一個(gè)設備可以有多個(gè)配置,但是同一時(shí)刻只能有一個(gè)配置有效.每個(gè)配置下又可有很多接口.當我們需要不同的功能時(shí),只要選擇不同的配置即可.如我們把教學(xué)樓分為兩個(gè)配置:平時(shí)上課用和期末考試用。當我們做為考試用時(shí),要將所有的教室都用上。即該配置下只有一個(gè)接口,接口下有很多端點(diǎn)--教室。而平時(shí)上課用時(shí),把教室分為兩類(lèi),即兩個(gè)接口。一類(lèi)是教師休息室,有N個(gè)教室(即該接口有N個(gè)端點(diǎn)),一類(lèi)上課的課室,有M個(gè)教室(即該接口有M個(gè)端點(diǎn))。教師休息室和課室是不能共用的(在USB中也是如此,同一個(gè)端點(diǎn)號不能出現在同一個(gè)配置下的兩個(gè)或多個(gè)不同的接口中).但是教師休息室和課室在考試用時(shí)都可以當做考場(chǎng)(這在USB中也是如此,同一個(gè)端點(diǎn)號可用在不同的配置中)。
每種描述符都有自己獨立的編號,如下:
#define DEVICE_DESCRIPTOR0x01//設備描述符
#define CONFIGURATION_DESCRIPTOR0x02//配置描述符
#define STRING_DESCRIPTOR0x03//字符串描述符
#define INTERFACE_DESCRIPTOR0x04//接口描述符
#define ENDPOINT_DESCRIPTOR0x05//端點(diǎn)描述符
下面分別詳細介紹一下各描述符。
1.設備描述符
//定義標準的設備描述符結構
typedef struct _DEVICE_DCESCRIPTOR_STRUCT
{
BYTE blength;//設備描述符的字節數大小
BYTE bDescriptorType;//設備描述符類(lèi)型編號
WORD bcdUSB;//USB版本號
BYTE bDeviceClass;//USB分配的設備類(lèi)代碼
BYTE bDeviceSubClass;//USB分配的子類(lèi)代碼
BYTE bDeviceProtocol;//USB分配的設備協(xié)議代碼
BYTE bMaxPacketSize0;//端點(diǎn)0的最大包大小
WORD idVendor;//廠(chǎng)商編號
WORD idProduct;//產(chǎn)品編號
WORD bcdDevice;//設備出廠(chǎng)編號
BYTE iManufacturer;//設備廠(chǎng)商字符串的索引
BYTE iProduct;//描述產(chǎn)品字符串的索引
BYTE iSerialNumber;//描述設備序列號字符串的索引
BYTE bNumConfigurations;//可能的配置數量
}
DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;
//實(shí)際的設備描述符示例
code DEVICE_DESCRIPTOR_STRUCT device_descriptor=//設備描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT),//設備描述符的字節數大小,這里是18字節
DEVICE_DESCRIPTOR,//設備描述符類(lèi)型編號,設備描述符是01
0x1001,//USB版本號,這里是USB01.10,即USB1.1。由于51是大端模式,所以高低字節交換
0x00,//USB分配的設備類(lèi)代碼,0表示類(lèi)型在接口描述符中定義
0x00,//USB分配的子類(lèi)代碼,上面一項為0時(shí),本項也要設置為0
0x00,//USB分配的設備協(xié)議代碼,上面一項為0時(shí),本項也要設置為0
0x10,//端點(diǎn)0的最大包大小,這里為16字節
0x7104,//廠(chǎng)商編號,這個(gè)是需要跟USB組織申請的ID號,表示廠(chǎng)商代號。
0xf0ff,//該產(chǎn)品的編號,跟廠(chǎng)商編號一起配合使用,讓主機注冊該設備并加載相應的驅動(dòng)程序
0x0100,//設備出廠(chǎng)編號
0x01,//設備廠(chǎng)商字符串的索引,在獲取字符串描述符時(shí),使用該索引號來(lái)識別不同的字符串
0x02,//描述產(chǎn)品字符串的索引,同上
0x03,//描述設備序列號字符串的索引,同上
0x01//可能的配置數為1,即該設備只有一個(gè)配置
};
2.配置描述符
//定義標準的配置描述符結構
typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT
{
BYTE bLength;//配置描述符的字節數大小
BYTE bDescriptorType;//配置描述符類(lèi)型編號
WORD wTotalLength;//此配置返回的所有數據大小
BYTE bNumInterfaces;//此配置所支持的接口數量
BYTE bConfigurationValue;//Set_Configuration命令所需要的參數值
BYTE iConfiguration;//描述該配置的字符串的索引值
BYTE bmAttributes;//供電模式的選擇
BYTE MaxPower;//設備從總線(xiàn)提取的最大電流
}
CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;
評論