<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          USB協(xié)議深入分析 返回設(shè)備描述符

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



          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();