新聞中心

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

        USB協議深入分析 返回設備描述符

        作者: 時間:2016-11-28 來源:網絡 收藏
        回應設備描述符
        上一次已經介紹怎么樣收到主控器的獲取設備描述符的數據,這里就解釋怎么樣發送回應數據給主控器。
        先從USB協議里找到標準設備的定義,我把它用C語言定義如下:
        typedefstruct_USB_DEVICE_DESCRIPTOR{
        BYTEbLength;
        BYTEbDescriptorType;
        WORDbcdUSB;
        BYTEbDeviceClass;
        BYTEbDeviceSubClass;
        BYTEbDeviceProtocol;
        BYTEbMaxPacketSize0;
        WORDidVendor;
        WORDidProduct;
        WORDbcdDevice;
        BYTEiManufacturer;
        BYTEiProduct;
        BYTEiSerialNumber;
        BYTEbNumConfigurations;
        }USB_DEVICE_DESCRIPTOR;
        返回給主控器的數據結構就是上面的內容,只要把上面的結構填寫合適的內容,就可以發送回去給主控器。在我的USB設備里,我把它填寫如下的數據:
        12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01
        看到這串數據是不明白是什么東西的,現在就來仔細地分析它的具體定義。下面就按著一個字段一個字段地分析它。
        bLength是本結構的數據長度,這樣可以方便以后兼容不同的版本協議。因為不同的結構是不同的長度,這樣就可以區分不同的協議了。比如有一天想添加一個字段,那么它的長度就會改變,這時就可以根據不同的長度進行解釋不同的協議了。這次返回的結構長度是0x12,也就是18個字節,它的長度是從bLength長度開始,也就是說是完全整個結構的長度。
        bDescriptorType是描述符的類型。它的定義跟主控器發下來描述符的類型是一樣的,如下:
        DEVICE1
        CONFIGURATION2
        STRING3
        INTERFACE4
        ENDPOINT 5
        DEVICE_QUALIFIER 6
        OTHER_SPEED_CONFIGURATION 7
        INTERFACE_POWER1 8
        由于返回的是設備描述符,所以就選擇了1,也就是包里顯示的第二個字節01。用這個類型來區分不同的描述符。
        bcdUSB是USB發布的協議版本。也就是本設備能適用于那種協議,目前USB主要有兩個版本,一個是1.10,一個是2.10版本。在本設備里,采用了1.10的協議版本。由于這個字段是采用BCD編碼,所以1.10的表示為0x0110的格式,按小端格式輸出來,就變成10 01的顯示了。
        bDeviceClass是設備分類。當它的值是0時,表示所有接口在配置描述符里,并且所有接口是獨立的。當它的值是1到FEH時,表示不同的接口關聯的。當它的值是FFH時,它是廠商自己定義的。在這個設備里,是定義為0。
        bDeviceSubClass是設備子分類碼。當前面的bDeviceClass值是0時,這里一定要設置為0。其它就跟據USB-IF組織定義的編碼。
        bDeviceProtocol是設備使用的協議。如果使用USB-IF組織定義的協議,就需要設置這里的值。如果不使用,就直接設置為0。如果廠商自己定義的可以設置為FFH。
        以上三個值,在本設備里全部設置為0。
        bMaxPacketSize0是端點0收發最大的包大小。僅允許設置8,16,32,64中的任何一個大小。在本設備里是設置為64個字節大小。所以看到這個字段是40 的大小。
        12 01 10 01 00 00 0040 00 80 00 80 00 01 04 2C 4A 01
        idVendor是廠商標識。由USB-IF分配的編碼。在這里使用0x8000。
        idProduct是廠商定義的產品標識。由廠家和產品標識,就可以讓操作系統加載不同的驅動程序。如下:
        12 01 10 01 00 00 00 4000 80 00 80 00 01 04 2C 4A 01
        bcdDevice是用BCD表示的設備發布的版本號。這里是1.00。
        12 01 10 01 00 00 00 4000 80 00 8000 0104 2C 4A 01
        iManufacturer是廠商字符串的偏移值。這值主要說明了它在字符串描述符里的偏移位置。如果它設置為0,表示沒有廠商字符串。在這里是0x04,就是從字符串描述符開始位置算起第4個字節位置讀取字符串。
        iProduct是產品字符串的偏移值。這值主要說明了它在字符串描述符里的偏移位置。如果它設置為0,表示沒有產品字符串。在這里是0x2C,就是從字符串描述符開始位置算起第2C個字節位置讀取字符串。
        iSerialNumber是序列號字符串的偏移值。這值主要說明了它在字符串描述符里的偏移位置。如果它設置為0,表示沒有序列號字符串。在這里是0x4A,就是從字符串描述符開始位置算起第4A個字節位置讀取字符串。
        所有字符串,都是采有UNICODE編碼。
        bNumConfigurations是配置描述符的個數。在這里只使用了一個配置,所以設置為1



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 凌云县| 胶南市| 盱眙县| 安龙县| 武定县| 奉化市| 长白| 瑞金市| 新竹市| 明水县| 望都县| 托克逊县| 淳化县| 临漳县| 扎鲁特旗| 灵宝市| 芦溪县| 汉源县| 浦县| 弋阳县| 比如县| 灵宝市| 汝城县| 西平县| 同江市| 富川| 富顺县| 三明市| 崇文区| 周宁县| 蚌埠市| 文水县| 澄迈县| 包头市| 东安县| 陇南市| 昌平区| 黄浦区| 西青区| 大港区| 辽宁省|