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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > USB入門系列之六 —— USB設(shè)備的枚舉過程

          USB入門系列之六 —— USB設(shè)備的枚舉過程

          作者: 時間:2016-12-14 來源:網(wǎng)絡(luò) 收藏
          USB主機在檢測到USB設(shè)備插入后,就要對設(shè)備進行枚舉了。為什么要枚舉呢?枚舉就是從設(shè)備讀取一些信息,知道設(shè)備是什么樣的設(shè)備,如何進行通信,這樣主機就可以根據(jù)這些信息來加載合適的驅(qū)動程序。調(diào)試USB設(shè)備,很重要的一點就是USB的枚舉過程,只要枚舉成功了,那么就已經(jīng)成功大半了。
          在說枚舉之前,先大概說一下USB的一種傳輸模式——控制傳輸。這種傳輸在USB中是非常重要的,它要保證數(shù)據(jù)的正確性,在設(shè)備的枚舉過程中都是使用控制傳輸??刂苽鬏敺譃槿齻€過程:①建立過程。②可選的數(shù)據(jù)過程。③狀態(tài)過程。建立(Setup)過程都是由USB主機發(fā)起,它開始于一個Setup令牌包,后面緊跟一個DATA0包。如果是控制輸入傳輸,那么數(shù)據(jù)過程就是輸入數(shù)據(jù);如果是控制輸出傳輸,那么數(shù)據(jù)過程是輸出數(shù)據(jù)。如果在設(shè)置過程中,指定了數(shù)據(jù)長度為0,則沒有數(shù)據(jù)過程。數(shù)據(jù)過程之后是狀態(tài)過程。狀態(tài)過程剛好與數(shù)據(jù)過程的數(shù)據(jù)傳輸方向相反:如果是控制輸入傳輸,則狀態(tài)過程是一個輸出數(shù)據(jù)包;如果是控制輸出傳輸,則狀態(tài)過程是一個輸入數(shù)據(jù)包。狀態(tài)階段用來確認所有的數(shù)據(jù)都已經(jīng)正確傳輸。
          好了,下面我們來看看枚舉的詳細過程。
          首先,USB主機檢測到USB設(shè)備插入后,就會先對設(shè)備復(fù)位。設(shè)備復(fù)位后,USB主機就會對地址為0的設(shè)備發(fā)送獲取設(shè)備描述符的標(biāo)準(zhǔn)請求。所有的USB設(shè)備在總線復(fù)位后其地址都為0,這樣主機就可以跟那些剛剛插入的設(shè)備通過地址0通信。主機在建立階段發(fā)出獲取設(shè)備描述符的輸入請求,設(shè)備收到該請求后,在數(shù)據(jù)過程將設(shè)備描述符返回給主機。主機在成功獲取到一個數(shù)據(jù)包的設(shè)備描述符后并且確認沒有什么錯誤后(注意:有些USB設(shè)備的端點0大小不足18字節(jié)(但至少具有8字節(jié)),而標(biāo)準(zhǔn)的設(shè)備描述有18字節(jié),在這種情況下,USB設(shè)備只能暫時按最大包將部分設(shè)備描述符返回,而主機在成功獲取到前面一部分描述符后,就不會再請求剩下的設(shè)備描述符部分,而是進入設(shè)置地址階段),就會返回一個0長度的狀態(tài)數(shù)據(jù)包給設(shè)備。
          然后主機再對設(shè)備復(fù)位一下,接下來就會進入到設(shè)置地址階段。這時USB主機發(fā)出一個設(shè)置地址的請求(建立過程,設(shè)置地址無數(shù)據(jù)過程),地址包含在建立包中,具體的地址USB主機會負責(zé)管理,它會分配一個唯一的地址給新的設(shè)備。USB設(shè)備在收到地址后,返回0長度的狀態(tài)包,主機收到0長度的狀態(tài)包之后,會返回一個ACK給設(shè)備。設(shè)備在收到這個ACK之后,就可以啟用新的地址了。這樣設(shè)備就分配到了一個唯一的設(shè)備地址,以后主機就通過它來進行訪問該設(shè)備。
          然后主機再次獲取設(shè)備描述符,這次跟第一次可能有點不一樣,這次需要獲取完全部的18個字節(jié)的設(shè)備描述符。當(dāng)然,如果你的端點0緩沖大于18字節(jié)的話,那就跟第一次的情形一樣了。
          接下來,主機就會獲取配置描述符。配置描述符總共為9字節(jié)。主機在獲取到配置描述符后,根據(jù)里面的配置集合總長度,再獲取配置集合。配置集合包括配置描述符,接口描述符,端點描符等等。
          如果有字符串描述符的話,還要獲取字符串描述符。另外HID設(shè)備還有HID描述符等。使用BUS HOUND以及通過串口返回信息,很容易看到具體的過程??傊侵鳈C請求什么,你的程序就響應(yīng)什么。

          下面這些數(shù)據(jù)是使用BUS HOUND抓的,這個是在WIN2000下抓到的,如果在WINXP下,就看不到設(shè)置地址之前的數(shù)據(jù)。
          寫了注釋下面的部分就是主機和設(shè)備之間的數(shù)據(jù)通信,而其它的則是主機跟根集線器之間的通信數(shù)據(jù)。

          本文引用地址:http://www.ex-cimer.com/article/201612/329596.htm

          Device Phase Data Description Cmd.Phase.Ofs(rep) Delta
          ------ ----- -------------------------------------------------- ---------------- ------------------ -----
          14.1 DI 02 . 1.1.0 3.4sc
          14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 2.1.0(2) 17us
          14.0 DI 01 01 01 00 .... 2.2.0 27us
          14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATURE 4.1.0 110us
          14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 5.1.0(2) 56us
          14.0 DI 01 01 00 00 .... 5.2.0 14us
          14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 7.1.0 109ms
          14.1 DI 02 . 8.1.0 90ms
          14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.1.0 23us
          14.0 DI 03 01 10 00 .... 9.2.0 22us
          14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 10.1.0 8us
          14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 11.1.0 19ms
          14.0 DI 03 01 00 00 .... 11.2.0 34us
          /////////////第一次獲取設(shè)備描述符請求//////////////////////
          14.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 12.1.0 239us
          /////////////第一次返回設(shè)備描述符//////////////////////////
          /////////////由于該端點緩沖只有16字節(jié),因此只讀到16字節(jié)///////////
          14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 00 ........e.6!.... 12.2.0 67ms
          14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 13.1.0 49us
          14.0 DI 03 01 00 00 .... 13.2.0 27us
          14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 14.1.0 24us
          14.1 DI 02 . 15.1.0 112ms
          14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 16.1.0 21us
          14.0 DI 03 01 10 00 .... 16.2.0 25us
          14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 17.1.0 8us
          ////////////////設(shè)置地址,地址為2/////////////////////////////////
          14.0 CTL 00 05 02 00 00 00 00 00 SET ADDRESS 18.1.0 19ms
          ///////////第二次獲取設(shè)備描述符請求//////////////////////////////
          14.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 19.1.0 40ms
          ////////////第二次返回了全部的18字節(jié)設(shè)備描述符//////////////////
          14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 00 ........e.6!.... 19.2.0 75ms
          02 01 .. 19.2.16
          ////////////獲取9字節(jié)的配置描述符/////////////////////////////
          14.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 20.1.0 44us
          ////////////返回9字節(jié)的配置描述符/////////////////////////////
          ////////////可以看到配置描述符集合長度為0x20(即32)字節(jié)//////
          14.0 DI 09 02 20 00 01 01 00 80 dd .. ...... 20.2.0 50ms
          14.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 21.1.0 214ms
          14.0 DI 00 01 00 00 .... 21.2.0 34us
          //////////再一次獲取設(shè)備描述符//////////////////////////////
          17.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 22.1.0 3.8ms
          /////////返回設(shè)備描述符////////////////////////////////
          17.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 00 ........e.6!.... 22.2.0 67ms
          02 01 .. 22.2.16
          //////////獲取配置描述符///////////////////////
          17.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 23.1.0 28us
          ///////////返回配置描述符///////////////////////
          17.0 DI 09 02 20 00 01 01 00 80 dd .. ...... 23.2.0 50ms
          /////////獲取0x20字節(jié)的配置描述符集合,包括配置描述符,接口描述符,端點描述符等/////////
          17.0 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTOR 24.1.0 30us
          /////////返回了0x20字節(jié)的配置描述符集合/////////////
          17.0 DI 09 02 20 00 01 01 00 80 dd 09 04 00 00 02 08 06 .. ............. 24.2.0 83ms
          50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00 P.....@......@.. 24.2.16
          ////////獲取字符串描述符的語言ID///////////////
          17.0 CTL 80 06 00 03 00 00 02 00 GET DESCRIPTOR 25.1.0 29us
          ///////設(shè)備返回語言ID,第一字節(jié)表示語言ID的長度///////////////
          17.0 DI 04 03 .. 25.2.0 45ms
          ////////根據(jù)長度獲取4字節(jié)的字符串描述符的語言ID///////////////
          17.0 CTL 80 06 00 03 00 00 04 00 GET DESCRIPTOR 26.1.0 17ms
          ////////設(shè)備返回完整的語言ID////////////////
          17.0 DI 04 03 09 04 .... 26.2.0 53ms
          /////////獲取索引為2的字符串描述符///////////
          17.0 CTL 80 06 02 03 09 04 02 00 GET DESCRIPTOR 27.1.0 27us
          //////////設(shè)備返回字符串描述符,第一字節(jié)為該字符串描述符的長度//////////
          17.0 DI 12 03 .. 27.2.0 46ms
          /////////根據(jù)長度獲取索引為2的字符串描述符///////////
          17.0 CTL 80 06 02 03 09 04 12 00 GET DESCRIPTOR 28.1.0 23us
          /////////設(shè)備返回完整的0x12字節(jié)字符串描述符/////////
          17.0 DI 12 03 32 00 30 00 37 00 31 00 30 00 39 00 38 00 ..2.0.7.1.0.9.8. 28.2.0 70ms
          32 00 2. 28.2.16
          ////////////////設(shè)置配置///////////////////////////////
          17.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 29.1.0 28us
          ////////////////設(shè)置接口////////////////////////////////
          17.0 CTL 01 0b 00 00 00 00 00 00 SET INTERFACE 30.1.0 22ms
          //////////////獲取最大邏輯單元/////////////////////////
          17.0 CTL a1 fe 00 00 00 00 01 00 GET MAX LUN 31.1.0 158us
          17.0 DI 00 . 31.2.0 53ms
          ///////////////USB大容量存儲設(shè)備的命令塊封包(CBW)////////
          17.2 DO 55 53 42 43 c8 58 25 81 24 00 00 00 80 00 06 12 USBC.X%.$....... 32.1.0 3.0ms
          00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 ...$........... 32.1.16


          以下是我在做USB鍵盤時,通過串口發(fā)回的調(diào)試信息,從這也可以看到枚舉的過程。

          系統(tǒng)啟動................................
          斷開USB連接........................
          USBD12芯片初始化
          設(shè)置地址.....................
          地址為: 0
          連接USB...............
          USB總線復(fù)位................................
          USB總線掛起................................
          USB總線復(fù)位................................
          USB總線掛起................................
          USB總線復(fù)位................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取設(shè)備描述符................................
          USB總線復(fù)位................................
          USB標(biāo)準(zhǔn)請求................................
          設(shè)置地址.....................
          地址為: 2
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取設(shè)備描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取配置描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取字符串描述符................................
          獲取語言ID................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取字符串描述符................................
          獲取設(shè)備序列號................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取配置描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取字符串描述符................................
          獲取語言ID................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取字符串描述符................................
          獲取產(chǎn)品字符串................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取字符串描述符................................
          獲取語言ID................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取字符串描述符................................
          獲取產(chǎn)品字符串................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取設(shè)備描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取配置描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          獲取配置描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符................................
          USB標(biāo)準(zhǔn)請求................................
          設(shè)置配置................................
          USB類請求................................
          設(shè)置空閑................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................
          獲取報告描述符................................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................
          USB標(biāo)準(zhǔn)請求................................
          獲取描述符(從接口)..............................



          關(guān)鍵詞: USB枚舉過

          評論


          技術(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); })();