<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > USB入門(mén)系列之七 —USB的描述符及各種描述符之間的依賴(lài)關(guān)系

USB入門(mén)系列之七 —USB的描述符及各種描述符之間的依賴(lài)關(guān)系

作者: 時(shí)間:2016-12-14 來(lái)源:網(wǎng)絡(luò ) 收藏
USB是個(gè)通用的總線(xiàn),端口都是統一的。但是USB設備卻各種各樣,
例如USB鼠標,USB鍵盤(pán),U盤(pán)等等,那么USB主機是如何識別出不同的
設備的呢?這就要依賴(lài)于描述符了。
USB的描述符主要有設備描述符,配置描述符,接口描述符,
端點(diǎn)描述符,字符串描述符,HID描述符,報告描述符等等。
關(guān)于報告描述符,請看我以前寫(xiě)的:《USB HID報告及報告描述符簡(jiǎn)介 》

一個(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)品字符串等。

每種描述符都有自己獨立的編號,如下:
#define DEVICE_DESCRIPTOR 0x01 //設備描述符
#define CONFIGURATION_DESCRIPTOR 0x02 //配置描述符
#define STRING_DESCRIPTOR 0x03 //字符串描述符
#define INTERFACE_DESCRIPTOR 0x04 //接口描述符
#define ENDPOINT_DESCRIPTOR 0x05 //端點(diǎn)描述符

下面分別詳細介紹一下各描述符。

本文引用地址:http://dyxdggzs.com/article/201612/329597.htm

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;

2.接口描述符

//定義標準的接口描述符結構

typedef struct _INTERFACE_DESCRIPTOR_STRUCT
{
BYTE bLength; //接口描述符的字節數大小
BYTE bDescriptorType; //接口描述符的類(lèi)型編號
BYTE bInterfaceNumber; //該接口的編號
BYTE bAlternateSetting; //備用的接口描述符編號
BYTE bNumEndpoints; //該接口使用的端點(diǎn)數,不包括端點(diǎn)0
BYTE bInterfaceClass; //接口類(lèi)型
BYTE bInterfaceSubClass; //接口子類(lèi)型
BYTE bInterfaceProtocol; //接口遵循的協(xié)議
BYTE iInterface; //描述該接口的字符串索引值
}
INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;

4.端點(diǎn)描述符

//定義標準的端點(diǎn)描述符結構

typedef struct _ENDPOINT_DESCRIPTOR_STRUCT
{
BYTE bLegth; //端點(diǎn)描述符字節數大小
BYTE bDescriptorType; //端點(diǎn)描述符類(lèi)型編號
BYTE bEndpointAddress; //端點(diǎn)地址及輸入輸出屬性
BYTE bmAttributes; //端點(diǎn)的傳輸類(lèi)型屬性
WORD wMaxPacketSize; //端點(diǎn)收、發(fā)的最大包大小
BYTE bInterval; //主機查詢(xún)端點(diǎn)的時(shí)間間隔
}
ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;

下面是一個(gè)配置描述符集合的定義
typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
{
CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
INTERFACE_DESCRIPTOR_STRUCT interface_descritor;
ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;

配置描述符集合的示例


code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor= //配置描述符集合
{
//configuration_descriptor //配置描述符
{
sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字節數大小,這里為9
CONFIGURATION_DESCRIPTOR, //配置描述符類(lèi)型編號,配置描述符為2
(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+
sizeof(INTERFACE_DESCRIPTOR_STRUCT)+
sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)*256+
(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+
sizeof(INTERFACE_DESCRIPTOR_STRUCT)+
sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)/256, //配置描述符集合的總大小
0x01, //只包含一個(gè)接口
0x01, //該配置的編號
0x00, //iConfiguration字段
0x80, //采用總線(xiàn)供電,不支持遠程喚醒
0xC8 //從總線(xiàn)獲取最大電流400mA
},
//interface_descritor //接口描述符
{
sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字節數大小,這里為9
INTERFACE_DESCRIPTOR, //接口描述符類(lèi)型編號,接口描述符為3
0x00, //接口編號為4
0x00, //該接口描述符的編號為0
ENDPOINT_NUMBER, //非0端點(diǎn)數量為2,只使用端點(diǎn)主端點(diǎn)輸入和輸出
0x08, //定義為USB大容量存儲設備
0x06, //使用的子類(lèi),為簡(jiǎn)化塊命令
0x50, //使用的協(xié)議,這里使用單批量傳輸協(xié)議
0x00 //接口描述符字符串索引,為0,表示沒(méi)有字符串
},

//endpoint_descriptor[]
{
{ //主端點(diǎn)輸入描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點(diǎn)描述符的字節數大小,這里為7
ENDPOINT_DESCRIPTOR, //端點(diǎn)描述符類(lèi)型編號,端點(diǎn)描述符為5
MAIN_POINT_IN, //端點(diǎn)號,主輸入端點(diǎn)
ENDPOINT_TYPE_BULK, //使用的傳輸類(lèi)型,批量傳輸
0x4000, //該端點(diǎn)支持的最大包尺寸,64字節
0x00 //中斷掃描時(shí)間,對批量傳輸無(wú)效
},

{ //主端點(diǎn)輸出描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點(diǎn)描述符的字節數大小,這里為7
ENDPOINT_DESCRIPTOR, //端點(diǎn)描述符類(lèi)型編號,端點(diǎn)描述符為5
MAIN_POINT_OUT, //端點(diǎn)號,主輸出端點(diǎn)
ENDPOINT_TYPE_BULK, //使用的傳輸類(lèi)型,批量傳輸
0x4000, //該端點(diǎn)支持的最大包尺寸,64字節
0x00 //中斷掃描時(shí)間,對批量傳輸無(wú)效
}
}
};

其中關(guān)于端點(diǎn)的類(lèi)型定義如下
//定義的端點(diǎn)類(lèi)型
#define ENDPOINT_TYPE_CONTROL 0x00 //控制傳輸
#define ENDPOINT_TYPE_ISOCHRONOUS 0x01 //同步傳輸
#define ENDPOINT_TYPE_BULK 0x02 //批量傳輸
#define ENDPOINT_TYPE_INTERRUPT 0x03 //中斷傳輸

端點(diǎn)號的定義如下
#define MAIN_POINT_OUT 0x02 //2號輸出端點(diǎn)
#define MAIN_POINT_IN 0x82 //2號輸入端點(diǎn)



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>