在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > USB入門系列之七 —USB的描述符及各種描述符之間的依賴關(guān)系

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

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

            一個USB設(shè)備有一個設(shè)備描述符,設(shè)備描述符里面決定了該設(shè)備有多
            少種配置,每種配置描述符對應(yīng)著配置描述符;而在配置描述符中又定義
            了該配置里面有多少個接口,每個接口有對應(yīng)的接口描述符;在接口描
            述符里面又定義了該接口有多少個端點,每個端點對應(yīng)一個端點描述符;
            端點描述符定義了端點的大小,類型等等。由此我們可以看出,USB的
            描述符之間的關(guān)系是一層一層的,最上一層是設(shè)備描述符,下面是配置
            描述符,再下面是接口描述符,再下面是端點描述符。在獲取描述符時,
            先獲取設(shè)備描述符,然后再獲取配置描述符,根據(jù)配置描述符中的配置
            集合長度,一次將配置描述符、接口描述符、端點描述符一起一次讀回。
            其中可能還會有獲取設(shè)備序列號,廠商字符串,產(chǎn)品字符串等。

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

            下面分別詳細(xì)介紹一下各描述符。

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

            1.設(shè)備描述符

            //定義標(biāo)準(zhǔn)的設(shè)備描述符結(jié)構(gòu)

            typedef struct _DEVICE_DCESCRIPTOR_STRUCT
            {
            BYTE blength; //設(shè)備描述符的字節(jié)數(shù)大小
            BYTE bDescriptorType; //設(shè)備描述符類型編號
            WORD bcdUSB; //USB版本號
            BYTE bDeviceClass; //USB分配的設(shè)備類代碼
            BYTE bDeviceSubClass; //USB分配的子類代碼
            BYTE bDeviceProtocol; //USB分配的設(shè)備協(xié)議代碼
            BYTE bMaxPacketSize0; //端點0的最大包大小
            WORD idVendor; //廠商編號
            WORD idProduct; //產(chǎn)品編號
            WORD bcdDevice; //設(shè)備出廠編號
            BYTE iManufacturer; //設(shè)備廠商字符串的索引
            BYTE iProduct; //描述產(chǎn)品字符串的索引
            BYTE iSerialNumber; //描述設(shè)備序列號字符串的索引
            BYTE bNumConfigurations; //可能的配置數(shù)量
            }
            DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;

            //實際的設(shè)備描述符示例
            code DEVICE_DESCRIPTOR_STRUCT device_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)品的編號,跟廠商編號一起配合使用,讓主機(jī)注冊該設(shè)備并加載相應(yīng)的驅(qū)動程序
            0x0100, //設(shè)備出廠編號
            0x01, //設(shè)備廠商字符串的索引,在獲取字符串描述符時,使用該索引號來識別不同的字符串
            0x02, //描述產(chǎn)品字符串的索引,同上
            0x03, //描述設(shè)備序列號字符串的索引,同上
            0x01 //可能的配置數(shù)為1,即該設(shè)備只有一個配置
            };

            2.配置描述符

            //定義標(biāo)準(zhǔn)的配置描述符結(jié)構(gòu)

            typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT
            {
            BYTE bLength; //配置描述符的字節(jié)數(shù)大小
            BYTE bDescriptorType; //配置描述符類型編號
            WORD wTotalLength; //此配置返回的所有數(shù)據(jù)大小
            BYTE bNumInterfaces; //此配置所支持的接口數(shù)量
            BYTE bConfigurationValue; //Set_Configuration命令所需要的參數(shù)值
            BYTE iConfiguration; //描述該配置的字符串的索引值
            BYTE bmAttributes; //供電模式的選擇
            BYTE MaxPower; //設(shè)備從總線提取的最大電流
            }
            CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;

            2.接口描述符

            //定義標(biāo)準(zhǔn)的接口描述符結(jié)構(gòu)

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

            4.端點描述符

            //定義標(biāo)準(zhǔn)的端點描述符結(jié)構(gòu)

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

            下面是一個配置描述符集合的定義
            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), //配置描述符的字節(jié)數(shù)大小,這里為9
            CONFIGURATION_DESCRIPTOR, //配置描述符類型編號,配置描述符為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, //只包含一個接口
            0x01, //該配置的編號
            0x00, //iConfiguration字段
            0x80, //采用總線供電,不支持遠(yuǎn)程喚醒
            0xC8 //從總線獲取最大電流400mA
            },
            //interface_descritor //接口描述符
            {
            sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字節(jié)數(shù)大小,這里為9
            INTERFACE_DESCRIPTOR, //接口描述符類型編號,接口描述符為3
            0x00, //接口編號為4
            0x00, //該接口描述符的編號為0
            ENDPOINT_NUMBER, //非0端點數(shù)量為2,只使用端點主端點輸入和輸出
            0x08, //定義為USB大容量存儲設(shè)備
            0x06, //使用的子類,為簡化塊命令
            0x50, //使用的協(xié)議,這里使用單批量傳輸協(xié)議
            0x00 //接口描述符字符串索引,為0,表示沒有字符串
            },

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

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

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

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



            關(guān)鍵詞: USB描述符依賴關(guān)

            評論


            技術(shù)專區(qū)

            關(guān)閉