新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > USB 描述符及其間的關(guān)系

        USB 描述符及其間的關(guān)系

        作者: 時(shí)間:2016-12-12 來源:網(wǎng)絡(luò) 收藏
        USB是個(gè)通用的總線,端口都是統(tǒng)一的。但是USB設(shè)備卻各種各樣,
        例如USB鼠標(biāo),USB鍵盤,U盤等等,那么USB主機(jī)是如何識(shí)別出不同的
        設(shè)備的呢?這就要依賴于描述符了。
        USB的描述符主要有設(shè)備描述符,配置描述符,接口描述符,
        端點(diǎn)描述符,字符串描述符,HID描述符,報(bào)告描述符等等。
        關(guān)于報(bào)告描述符,請看我以前寫的:《USBHID報(bào)告及報(bào)告描述符簡介》
        http://group.ednchina.com/93/198.aspx。
        一個(gè)USB設(shè)備有一個(gè)設(shè)備描述符,設(shè)備描述符里面決定了該設(shè)備有多
        少種配置,每種配置描述符對應(yīng)著配置描述符;而在配置描述符中又定義
        了該配置里面有多少個(gè)接口,每個(gè)接口有對應(yīng)的接口描述符;在接口描
        述符里面又定義了該接口有多少個(gè)端點(diǎn),每個(gè)端點(diǎn)對應(yīng)一個(gè)端點(diǎn)描述符;
        端點(diǎn)描述符定義了端點(diǎn)的大小,類型等等。由此我們可以看出,USB的
        描述符之間的關(guān)系是一層一層的,最上一層是設(shè)備描述符,下面是配置
        描述符,再下面是接口描述符,再下面是端點(diǎn)描述符。在獲取描述符時(shí),
        先獲取設(shè)備描述符,然后再獲取配置描述符,根據(jù)配置描述符中的配置
        集合長度,一次將配置描述符、接口描述符、端點(diǎn)描述符一起一次讀回。
        其中可能還會(huì)有獲取設(shè)備序列號,廠商字符串,產(chǎn)品字符串等。

        每種描述符都有自己獨(dú)立的編號,如下:


        #defineDEVICE_DESCRIPTOR0x01//設(shè)備描述符
        #defineCONFIGURATION_DESCRIPTOR0x02//配置描述符
        #defineSTRING_DESCRIPTOR0x03//字符串描述符
        #defineINTERFACE_DESCRIPTOR0x04//接口描述符
        #defineENDPOINT_DESCRIPTOR0x05//端點(diǎn)描述符


        下面分別詳細(xì)介紹一下各描述符。
        1.設(shè)備描述符

        本文引用地址:http://www.104case.com/article/201612/328715.htm

        //定義標(biāo)準(zhǔn)的設(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;//端點(diǎn)0的最大包大小
        WORDidVendor;//廠商編號
        WORDidProduct;//產(chǎn)品編號
        WORDbcdDevice;//設(shè)備出廠編號
        BYTEiManufacturer;//設(shè)備廠商字符串的索引
        BYTEiProduct;//描述產(chǎn)品字符串的索引
        BYTEiSerialNumber;//描述設(shè)備序列號字符串的索引
        BYTEbNumConfigurations;//可能的配置數(shù)量


        }
        DEVICE_DESCRIPTOR_STRUCT,*pDEVICE_DESCRIPTOR_STRUCT;

        //實(shí)際的設(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分配的子類代碼,上面一項(xiàng)為0時(shí),本項(xiàng)也要設(shè)置為0
        0x00,//USB分配的設(shè)備協(xié)議代碼,上面一項(xiàng)為0時(shí),本項(xiàng)也要設(shè)置為0
        0x10,//端點(diǎn)0的最大包大小,這里為16字節(jié)
        0x7104,//廠商編號,這個(gè)是需要跟USB組織申請的ID號,表示廠商代號。
        0xf0ff,//該產(chǎn)品的編號,跟廠商編號一起配合使用,讓主機(jī)注冊該設(shè)備并加載相應(yīng)的驅(qū)動(dòng)程序
        0x0100,//設(shè)備出廠編號
        0x01,//設(shè)備廠商字符串的索引,在獲取字符串描述符時(shí),使用該索引號來識(shí)別不同的字符串
        0x02,//描述產(chǎn)品字符串的索引,同上
        0x03,//描述設(shè)備序列號字符串的索引,同上
        0x01//可能的配置數(shù)為1,即該設(shè)備只有一個(gè)配置

        };


        2.配置描述符



        //定義標(biāo)準(zhǔn)的配置描述符結(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;


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

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 崇仁县| 包头市| 福建省| 广西| 曲靖市| 北辰区| 栖霞市| 汉阴县| 买车| 正定县| 五家渠市| 白银市| 合水县| 昂仁县| 钟山县| 宜兴市| 辽中县| 富平县| 双牌县| 太原市| 文登市| 大连市| 延安市| 丰县| 福安市| 皮山县| 景宁| 利津县| 修武县| 成都市| 双柏县| 建昌县| 滦平县| 锡林郭勒盟| 五大连池市| 齐齐哈尔市| 潜山县| 济南市| 肇东市| 长春市| 延安市|