日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

USB入門(mén)系列之六 —— USB設(shè)備的枚舉過(guò)程

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

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

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è)備描述符請(qǐng)求////////////////////// 
  14.0  CTL    80 06 00 01  00 00 40 00                            GET DESCRIPTOR          12.1.0        239us 
/////////////第一次返回設(shè)備描述符//////////////////////////
/////////////由于該端點(diǎn)緩沖只有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è)備描述符請(qǐng)求////////////////////////////// 
  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é)的配置描述符/////////////////////////////
////////////可以看到配置描述符集合長(zhǎng)度為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é)的配置描述符集合,包括配置描述符,接口描述符,端點(diǎn)描述符等/////////
  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
////////獲取字符串描述符的語(yǔ)言ID///////////////           
  17.0  CTL    80 06 00 03  00 00 02 00                            GET DESCRIPTOR          25.1.0         29us
///////設(shè)備返回語(yǔ)言ID,第一字節(jié)表示語(yǔ)言ID的長(zhǎng)度///////////////
  17.0  DI     04 03                                               ..                      25.2.0         45ms 
////////根據(jù)長(zhǎng)度獲取4字節(jié)的字符串描述符的語(yǔ)言ID///////////////
  17.0  CTL    80 06 00 03  00 00 04 00                            GET DESCRIPTOR          26.1.0         17ms
////////設(shè)備返回完整的語(yǔ)言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é)為該字符串描述符的長(zhǎng)度//////////
  17.0  DI     12 03                                               ..                      27.2.0         46ms 
/////////根據(jù)長(zhǎng)度獲取索引為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大容量存儲(chǔ)設(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鍵盤(pán)時(shí),通過(guò)串口發(fā)回的調(diào)試信息,從這也可以看到枚舉的過(guò)程。

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多