新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > USB協議深入分析 設備描述符配置包

        USB協議深入分析 設備描述符配置包

        作者: 時間:2016-11-28 來源:網絡 收藏
        設備描述符配置包http://blog.csdn.net/caimouse/article/details/1558975
        在USB通訊里,從主控器發出來的第一個配置包就是設備描述符配置包,目的只有一個,就是獲取插入的USB屬性,以便加載合適的驅動程序。現在就來詳細地分析一下設備描述符包的定義。
        在USB2.0的協議里找到9.3 USB Device Requests里就找到這個結構的定義,這里我使用C的定義結構如下:
        typedefstruct_USB_SETUP_PACKET
        {
        REQUEST_TYPEbmRequestType;
        BYTEbRequest;
        WORD_BYTEwValue;
        WORD_BYTEwIndex;
        WORDwLength;
        }USB_SETUP_PACKET;
        bmRequestType是包含有下面幾方面的內容:
        D7 D6 D5 D4 D3 D2 D1 D0
        在這一個字節里,又按位分為:
        D7位是表示后面傳送數據的方向位。
        當D7等于0時,表示后面的數據是從主控器發送到USB設備。在PC里,就是從PC機發送到USB的設備。
        當D7等于1時,表示后面的數據是從USB設備發送到主控器。在PC里,就是從USB設備發送到USB設備。在上次里,我收到并顯示出來的數據是80,就表示從USB設備里發送數據給PC。在這里再次給出上一次的包數據:
        80 06 00 01 00 00 40 00
        這里的80,就是D7位為1。
        D6-D5位是請求主分類型
        0 是表示標準的請求。
        1 是表示類別的請求。
        2 是表示廠商的請求。
        3 是保留。
        D4-D0位是表求接收這個包的接口。
        0 是表示USB設備接收。
        1 是表示接口接收。
        2 是表示端點接收。
        3 是表示其它接收,不知道的。
        4-31是保留。
        bRequest是本描述符的請求類型,也就是后面發送的數據是什么樣的東西。由于USB里有很多配置信息,比如獲取設備描述符,又有設置USB地址等等,就是通過這個字節來區分的。
        USB協議里查找表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
        在上面的數據包里,看到它的內容是06,那么它就是GET_DESCRIPTOR類型。也就是主控器想讀取USB設備的描述符,到這里就已經分析出來的意思,就是主控器想讀取USB描述符,但還不知道是什么描述符的內容。
        wValue是根據不同的請求而設置不同的值。一般就是傳送參數給設備標明這是什么請求。在上面GET_DESCRIPTOR獲取設備描述符里,它的值是00 01。在GET_DESCRIPTOR里這個字段的低字節表示描述符的索引,高字節表示描述符的類型。高字節的類型如下:
        DEVICE1
        CONFIGURATION2
        STRING3
        INTERFACE4
        ENDPOINT 5
        DEVICE_QUALIFIER 6
        OTHER_SPEED_CONFIGURATION 7
        INTERFACE_POWER1 8
        wValue值在這里的高字節是01,那么它就是設備描述符了。低字節是00,那么它就是表示從偏移地址0開始讀取設備描述符。由于在配置描述符里有很多配置,所以低字節在那里就可以用來識別獲取同樣類型的描述符不同的配置。
        wIndex是根據不同的請求而設置不同的值。一般用來說明端點號或者說明接口標識。在獲取描述符里,設置為0,或者是語言ID。在這個發送的描述符里,它是設置為00 00。
        wLength是根據請求來決定下一階段發送數據的長度。前面請求第一個字節里,已經說明下一階段數據傳送的方向,這里說明了傳送數據的長度。不管是發送數據,還是接收數據,都不要超過這個數據長度,否則主機會出問題,或者設備有問題。在這個獲取設備描述里,它的長度是40 00,按小端格式去解釋,就是64個字節。
        到這里,就把主控器發下來的數據解釋完成了,知道去做什么的事情和回應。下一次就去分析怎么樣返回設備描述符。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 盈江县| 德格县| 平凉市| 虞城县| 北流市| 江都市| 闸北区| 太原市| 杂多县| 仁怀市| 巴彦淖尔市| 西丰县| 雷州市| 永登县| 乌拉特前旗| 郎溪县| 九龙县| 丹巴县| 四会市| 阳新县| 海口市| 祁阳县| 衡阳市| 大足县| 大埔县| 原平市| 三江| 类乌齐县| 澜沧| 尚志市| 开鲁县| 洮南市| 固原市| 古丈县| 金平| 德昌县| 静海县| 德化县| 锦屏县| 涞水县| 罗定市|