USB入門系列之五 ---- USB設備的枚舉過程

USB入門系列之五 ---- USB設備的枚舉過程

2009-10-28 18:32

USB主機在檢測到USB設備插入後,就要對設備進行枚舉了。爲何要枚舉呢?枚舉就是從設備讀取一些信息,知道設備是什麼樣的設備,如何進行通訊,這樣主機就能夠根據這些信息來加載合適的驅動程序。調試USB設備,很重要的一點就是USB的枚舉過程,只要枚舉成功了,那麼就已經成功大半了。
    在說枚舉以前,先大概說說USB的一種傳輸模式——控制傳輸。這種傳輸在USB中是很是重要的,它要保證數據的正確性,在設備的枚舉過程當中都是使用控制傳輸的。控制傳輸分爲三個階段:①創建階段。②數據階段。③確認階段。創建(setup)階段都是由USB主機發起,它是一個setup數據包,裏面包含一些數據請求的命令以及一些數據。若是創建階段是輸入請求,那麼數據階段就要輸入數據;若是創建階段是輸出請求,那麼數據階段就要輸出數據。若是在數據階段,即使不須要傳送數據,也要發一個0長度的數據包。數據階段事後就是確認階段。確認階段恰好跟數據階段相反,若是是輸入請求,則它是一個輸出數據包;若是是輸出請求,則它是一個輸入數據包。確認階段用來確認數據的正確傳輸。
    好了,下面咱們來看看枚舉的詳細過程。
    首先,USB主機檢測到USB設備插入後,就會先對設備復位。設備復位後,USB主機就會對地址爲0的設備發送獲取設備描述符的標準請求。全部的USB設備在總線復位後其地址都爲0,這樣主機就能夠跟那些剛剛插入的設備經過地址0通訊。主機在創建階段發出獲取設備描述符的輸入請求,設備收到該請求後,在數據階段將設備描述符返回給主機。主機在成功獲取到一個數據包的設備描述符後而且確認沒有什麼錯誤後(注意:有些USB設備的端點0大小不足18字節(但至少具備8字節),而標準的設備描述有18字節,在這種狀況下,USB設備只能暫時按最大包將部分設備描述符返回,而主機在成功獲取到前面一部分描述符後,就不會再請求剩下的設備描述符部分,而是進入設置地址階段),就會返回一個0長度的確認數據包給設備。
    而後主機再對設備復位一下,接下來就會進入到設置地址階段。這時USB主機發出一個設置地址的請求,並在後面跟着一個0長度的數據輸出包。地址包含在創建包中,具體的地址USB主機會負責管理,它會分配一個惟一的地址給新的設備。USB設備在收到地址後,返回0長度的應答包,設備在收到這個0長度應答包的ACK以後,就能夠起用新的地址了。這樣設備就分配到了一個惟一的設備地址,之後主機就經過它來進行訪問該設備。
    而後主機再次獲取設備描述符,此次跟第一次可能有點不同,此次須要獲取徹底部的18個字節的設備描述符。固然,若是你的端點0緩衝大於18字節的話,那就跟第一次的情形同樣了。
    接下來,主機就會獲取配置描述符。配置描述符總共爲9字節。主機在獲取到配置描述符後,根據裏面的配置集合總長度,再獲取配置集合。配置集合包括配置描述符,接口描述符,端點描符等等。
    若是有字符串描述符的話,還要獲取字符串描述符。另外HID設備還有HID描述符等。使用BUS HOUND以及經過串口返回信息,很容易看到具體的過程。總之是主機請求什麼,你的程序就響應什麼。spa

下面這些數據是使用BUS HOUND抓的,這個是在WIN2000下抓到的,若是在WINXP下,就看不到設置地址以前的數據。
寫了註釋下面的部分就是主機和設備之間的數據通訊,而其它的則是主機跟根集線器之間的通訊數據。調試

Device  Phase  Data                                                Des cription       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
/////////////第一次獲取設備描述符請求////////////////////// 
  14.0  CTL    80 06 00 01  00 00 40 00                            GET DEs criptOR          12.1.0        239us 
/////////////第一次返回設備描述符//////////////////////////
/////////////因爲該端點緩衝只有16字節,所以只讀到16字節///////////
  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
////////////////設置地址,地址爲2/////////////////////////////////
  14.0  CTL    00 05 02 00  00 00 00 00                            SET ADDRESS             18.1.0         19ms
///////////第二次獲取設備描述符請求////////////////////////////// 
  14.0  CTL    80 06 00 01  00 00 12 00                            GET DEs criptOR          19.1.0         40ms
////////////第二次返回了所有的18字節設備描述符//////////////////
  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字節的配置描述符/////////////////////////////            
  14.0  CTL    80 06 00 02  00 00 09 00                            GET DEs criptOR          20.1.0         44us 
////////////返回9字節的配置描述符/////////////////////////////
////////////能夠看到配置描述符集合長度爲0x20(即32)字節//////
  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
//////////再一次獲取設備描述符//////////////////////////////
  17.0  CTL    80 06 00 01  00 00 12 00                            GET DEs criptOR          22.1.0        3.8ms 
/////////返回設備描述符////////////////////////////////
  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 DEs criptOR          23.1.0         28us 
///////////返回配置描述符///////////////////////
  17.0  DI     09 02 20 00  01 01 00 80  dd                        .. ......               23.2.0         50ms 
/////////獲取0x20字節的配置描述符集合,包括配置描述符,接口描述符,端點描述符等/////////
  17.0  CTL    80 06 00 02  00 00 20 00                            GET DEs criptOR          24.1.0         30us
/////////返回了0x20字節的配置描述符集合///////////// 
  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 DEs criptOR          25.1.0         29us
///////設備返回語言ID,第一字節表示語言ID的長度///////////////
  17.0  DI     04 03                                               ..                      25.2.0         45ms 
////////根據長度獲取4字節的字符串描述符的語言ID///////////////
  17.0  CTL    80 06 00 03  00 00 04 00                            GET DEs criptOR          26.1.0         17ms
////////設備返回完整的語言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 DEs criptOR          27.1.0         27us 
//////////設備返回字符串描述符,第一字節爲該字符串描述符的長度//////////
  17.0  DI     12 03                                               ..                      27.2.0         46ms 
/////////根據長度獲取索引爲2的字符串描述符///////////
  17.0  CTL    80 06 02 03  09 04 12 00                            GET DEs criptOR          28.1.0         23us 
/////////設備返回完整的0x12字節字符串描述符/////////
  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
////////////////設置配置///////////////////////////////            
  17.0  CTL    00 09 01 00  00 00 00 00                            SET CONFIG              29.1.0         28us
////////////////設置接口//////////////////////////////// 
  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大容量存儲設備的命令塊封包(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             blog


如下是我在作USB鍵盤時,經過串口發回的調試信息,從這也能夠看到枚舉的過程。索引

系統啓動................................
斷開USB鏈接........................
USBD12芯片初始化
   設置地址.....................
       地址爲:  0
鏈接USB...............
USB總線復位................................
USB總線掛起................................
USB總線復位................................
USB總線掛起................................
USB總線復位................................
USB標準請求................................
    獲取描述符................................
        獲取設備描述符................................
USB總線復位................................
USB標準請求................................
   設置地址.....................
       地址爲:  2
USB標準請求................................
    獲取描述符................................
        獲取設備描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
        獲取配置描述符................................
USB標準請求................................
    獲取描述符................................
        獲取字符串描述符................................
            獲取語言ID................................
USB標準請求................................
    獲取描述符................................
        獲取字符串描述符................................
            獲取設備序列號................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
        獲取配置描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
        獲取字符串描述符................................
            獲取語言ID................................
USB標準請求................................
    獲取描述符................................
        獲取字符串描述符................................
            獲取產品字符串................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
        獲取字符串描述符................................
            獲取語言ID................................
USB標準請求................................
    獲取描述符................................
        獲取字符串描述符................................
            獲取產品字符串................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
        獲取設備描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
        獲取配置描述符................................
USB標準請求................................
    獲取描述符................................
        獲取配置描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    獲取描述符................................
USB標準請求................................
    設置配置................................
USB類請求................................
    設置空閒................................
USB標準請求................................
    獲取描述符(從接口)..............................
        獲取報告描述符................................
USB標準請求................................
    獲取描述符(從接口)..............................
USB標準請求................................
    獲取描述符(從接口)..............................
USB標準請求................................
    獲取描述符(從接口)..............................
USB標準請求................................
    獲取描述符(從接口)..............................
USB標準請求................................
    獲取描述符(從接口)..............................
USB標準請求................................
    獲取描述符(從接口)..............................
USB標準請求................................
    獲取描述符(從接口)..............................接口

相關文章
相關標籤/搜索