新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > USB協(xié)議深入分析 設(shè)備描述符配置包

        USB協(xié)議深入分析 設(shè)備描述符配置包

        作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
        設(shè)備描述符配置包http://blog.csdn.net/caimouse/article/details/1558975
        在USB通訊里,從主控器發(fā)出來(lái)的第一個(gè)配置包就是設(shè)備描述符配置包,目的只有一個(gè),就是獲取插入的USB屬性,以便加載合適的驅(qū)動(dòng)程序?,F(xiàn)在就來(lái)詳細(xì)地分析一下設(shè)備描述符包的定義。
        在USB2.0的協(xié)議里找到9.3 USB Device Requests里就找到這個(gè)結(jié)構(gòu)的定義,這里我使用C的定義結(jié)構(gòu)如下:
        typedefstruct_USB_SETUP_PACKET
        {
        REQUEST_TYPEbmRequestType;
        BYTEbRequest;
        WORD_BYTEwValue;
        WORD_BYTEwIndex;
        WORDwLength;
        }USB_SETUP_PACKET;
        bmRequestType是包含有下面幾方面的內(nèi)容:
        D7 D6 D5 D4 D3 D2 D1 D0
        在這一個(gè)字節(jié)里,又按位分為:
        D7位是表示后面?zhèn)魉蛿?shù)據(jù)的方向位。
        當(dāng)D7等于0時(shí),表示后面的數(shù)據(jù)是從主控器發(fā)送到USB設(shè)備。在PC里,就是從PC機(jī)發(fā)送到USB的設(shè)備。
        當(dāng)D7等于1時(shí),表示后面的數(shù)據(jù)是從USB設(shè)備發(fā)送到主控器。在PC里,就是從USB設(shè)備發(fā)送到USB設(shè)備。在上次里,我收到并顯示出來(lái)的數(shù)據(jù)是80,就表示從USB設(shè)備里發(fā)送數(shù)據(jù)給PC。在這里再次給出上一次的包數(shù)據(jù):
        80 06 00 01 00 00 40 00
        這里的80,就是D7位為1。
        D6-D5位是請(qǐng)求主分類型
        0 是表示標(biāo)準(zhǔn)的請(qǐng)求。
        1 是表示類別的請(qǐng)求。
        2 是表示廠商的請(qǐng)求。
        3 是保留。
        D4-D0位是表求接收這個(gè)包的接口。
        0 是表示USB設(shè)備接收。
        1 是表示接口接收。
        2 是表示端點(diǎn)接收。
        3 是表示其它接收,不知道的。
        4-31是保留。
        bRequest是本描述符的請(qǐng)求類型,也就是后面發(fā)送的數(shù)據(jù)是什么樣的東西。由于USB里有很多配置信息,比如獲取設(shè)備描述符,又有設(shè)置USB地址等等,就是通過(guò)這個(gè)字節(jié)來(lái)區(qū)分的。
        USB協(xié)議里查找表9-4,就可看到如下的編碼:
        GET_STATUS 0
        CLEAR_FEATURE 1
        Reserved for future use 2
        SET_FEATURE 3
        Reserved for future use 4
        SET_ADDRESS 5
        GET_DESCRIPTOR 6
        SET_DESCRIPTOR 7
        GET_CONFIGURATION 8
        SET_CONFIGURATION 9
        GET_INTERFACE 10
        SET_INTERFACE 11
        SYNCH_FRAME 12
        在上面的數(shù)據(jù)包里,看到它的內(nèi)容是06,那么它就是GET_DESCRIPTOR類型。也就是主控器想讀取USB設(shè)備的描述符,到這里就已經(jīng)分析出來(lái)的意思,就是主控器想讀取USB描述符,但還不知道是什么描述符的內(nèi)容。
        wValue是根據(jù)不同的請(qǐng)求而設(shè)置不同的值。一般就是傳送參數(shù)給設(shè)備標(biāo)明這是什么請(qǐng)求。在上面GET_DESCRIPTOR獲取設(shè)備描述符里,它的值是00 01。在GET_DESCRIPTOR里這個(gè)字段的低字節(jié)表示描述符的索引,高字節(jié)表示描述符的類型。高字節(jié)的類型如下:
        DEVICE1
        CONFIGURATION2
        STRING3
        INTERFACE4
        ENDPOINT 5
        DEVICE_QUALIFIER 6
        OTHER_SPEED_CONFIGURATION 7
        INTERFACE_POWER1 8
        wValue值在這里的高字節(jié)是01,那么它就是設(shè)備描述符了。低字節(jié)是00,那么它就是表示從偏移地址0開(kāi)始讀取設(shè)備描述符。由于在配置描述符里有很多配置,所以低字節(jié)在那里就可以用來(lái)識(shí)別獲取同樣類型的描述符不同的配置。
        wIndex是根據(jù)不同的請(qǐng)求而設(shè)置不同的值。一般用來(lái)說(shuō)明端點(diǎn)號(hào)或者說(shuō)明接口標(biāo)識(shí)。在獲取描述符里,設(shè)置為0,或者是語(yǔ)言ID。在這個(gè)發(fā)送的描述符里,它是設(shè)置為00 00。
        wLength是根據(jù)請(qǐng)求來(lái)決定下一階段發(fā)送數(shù)據(jù)的長(zhǎng)度。前面請(qǐng)求第一個(gè)字節(jié)里,已經(jīng)說(shuō)明下一階段數(shù)據(jù)傳送的方向,這里說(shuō)明了傳送數(shù)據(jù)的長(zhǎng)度。不管是發(fā)送數(shù)據(jù),還是接收數(shù)據(jù),都不要超過(guò)這個(gè)數(shù)據(jù)長(zhǎng)度,否則主機(jī)會(huì)出問(wèn)題,或者設(shè)備有問(wèn)題。在這個(gè)獲取設(shè)備描述里,它的長(zhǎng)度是40 00,按小端格式去解釋,就是64個(gè)字節(jié)。
        到這里,就把主控器發(fā)下來(lái)的數(shù)據(jù)解釋完成了,知道去做什么的事情和回應(yīng)。下一次就去分析怎么樣返回設(shè)備描述符。



        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 盖州市| 深州市| 邯郸县| 宣城市| 青冈县| 天气| 阳信县| 开远市| 凉山| 陈巴尔虎旗| 碌曲县| 博湖县| 沿河| 深州市| 阿克陶县| 邓州市| 濉溪县| 永新县| 南漳县| 安远县| 苏尼特右旗| 肥城市| 余江县| 浦东新区| 黑山县| 天柱县| 项城市| 宁武县| 龙州县| 固安县| 临湘市| 嘉义县| 明光市| 彰化县| 东山县| 天峻县| 澎湖县| 商都县| 旌德县| 周口市| 京山县|