C6748_USB(1)-USB協議


內容參考:https://wenku.baidu.com/view/d9a5b9c06137ee06eff918b5.html                  https://blog.csdn.net/songze_lee/article/details/77658094

推薦網址:http://www.doc88.com/p-241590778604.html

1 USB接口總線

1.1 USB接口

    USB(Universal Serial Bus)全稱通用串口總線,USB為解決即插即用PnP(Plug and Play)需求而誕生,支持熱插拔。熱插拔。它能讓你在不斷電的情況下,插拔USB設備。如果要支持熱插拔,必須在VBUS、DP、DM三根線上,加上過壓、過流保護,在未上電時DP和DM要保持高阻態。另外,要利用金手指長短來控制上電順序,插入時首先讓電源線接通,讓電源穩定之后,再接通信號線,拔出時順序正好相反。這樣有效防護接口被損壞。

    USB協議版本有USB1.0、USB1.1、USB2.0、USB3.1等,USB2.0目前比較常用,以下以2.0為主介紹。由於USB是主從模式的結構(所有的通信都由主機發起,設備不能發起),故設備與設備之間、主機與主機之間不能互連,為解決這個問題,擴大USB的應用范圍,出現了USB OTG,全拼 ON The Go。USB OTG 同一個設備,在不同的場合下可行在主機和從機之間切換。USB家族成員如下圖所示:

  • USB Host,即USB主機,一般是PC機。
  • USB Device,即USB設備,有USB鍵盤、U盤等,而USB Hub集線器是一種特殊的USB設備。
  • USB OTG,OTG即On-The-Go,同時具備USB主機和USB設備的功能,數碼相機就帶有OTG的功能

    USB體系包括"主機"、"設備"、"物理連接"三個部分,其中主機是一個提供USB接口及接口管理能力的硬件、軟件的復合體,可以是PC,也可以是OTG設備。一個USB系統中僅有一個USB主機;設備包括USB功能設備和USB集線器,最多支持127個設備,這是因為協議規定了每個USB設備具有一個7bit的地址(取值范圍0~127,而地址0是保留給未初始化的設備使用的);物理連接指的是USB的傳輸線使用屏蔽的雙絞線。

    標准的USB連接器有A型、B型、Mini A/B型和Micro-A/B型,每個型號又分為插頭和插座。標准的USB2.0連接線都是四線,但MINI USB使用5條線,增加了一條ID線(主從識別)。

     

 

1.2 USB特點

    USB1.0和USB1.1支持1.5Mb/s的低速模式和12Mb/bs的全速模式。在USB2.0以上支持480Mb/s的高速模式。其中在USB的低速和全速模式下,采用的是電壓傳輸方式,高速模式采用的是電流傳輸模式。應用如下:

1.2.1  usb2.0、usb3.0、usb3.1、type-c 接口含義與區別

  • usb3.0 比2.0的傳輸速率快,充電快,能向下兼容2.0
  • usb3.1 通常是指 usb3.1 gen2,比3.0的傳輸速率更快、充電更快,同兼容
  • type-c 通常是指 usb3.1的一種接口形狀,總共三大類,c就是第三大類

usb2.0

  • 理論傳輸速率480Mbps,即60MB/s
  • 四引腳
  • 供電最高允許標准5V/0.5A
  • USB 2.0基於半雙工二線制總線,兩根線的差分信號來傳輸數據,只能提供單向數據流傳輸

usb3.0

  • 理論傳輸速率5.0Gbps
  • 采用了8/10b的編碼方式,將8位的數據編碼成10位來發送,即500MB/s
    • 關於8/10b編碼方式看這里:https://baike.baidu.com/item/8B/10B/9125856、https://zh.wikipedia.org/wiki/8b/10b
  • 9引腳,其中4個引腳的位置與usb2.0位置相同,也是其可以兼容usb2.0的原因
    • 注意,這里說的兼容只是說能物理兼容插進去,傳輸速度肯定還是2.0的效果
    • 里面的5根線路中2根用來發送數據,另2根用來接收數據,還有1根是地線。也就是說,USB 3.0可以同步全速地進行讀寫操作
  • 供電最高允許標准5V/0.9A
  • USB 3.0采用了TxRx四線制差分信號線,類似於PCIe總線,故而支持雙向並發數據流傳輸,為全雙工傳輸。

usb3.1

  usb3.1並不像2.0、3.0那樣是即使技術標准也是實際的插口,usb3.1只是一個標准,不代表實際的插口

  包括兩種技術標准:usb3.1 gen1,usb3.1 gen2

  和三種接口標准:Type-A(Standard-A)、Type-B(Micro-B)以及Type-C

先介紹兩種技術標准:

  • usb3.1 gen1:技術標准基本與usb3.0相同,沒有很大提升(可以當做就是3.0)
  • usb3.1 gen2:才是真正的usb3.1。我們通常說的usb3.1,就是指的usb3.1 gen2。下面介紹的都是gen2的技術標准:  
  • 理論傳輸速率增加到10.0Gbps
    • 使用128b/132b編碼,在132bit數據中,只需使用4bit做為檢查碼,編碼損耗相比於usb3.0的20%(2/10)下降為約3%(4/132),大約為1.21GB/s
    • 供電最高允許標准20V/5A
    • 新增USB A/V 3.1 影音傳輸規范
    • 標簽從3.0的"SuperSpeed"更新為"SuperSpeed+"

三種接口標准:

  從左到右依次是type-a、b、c

  • type-a:與普通usb接口外設形狀相
  • type-b:外部設備多采用,比如打印機,顯示器等,和一些android手機
    • type-b有兩種細分形狀:Mini USB 和 Micro USB,這兩種都有各自的 A 和 B 形狀(比較亂),主要用外設形狀解決了防誤插(與傳統的長方形不同,為近似梯形或邊緣缺角,方便識別正反)
  • type-c:"采用了 usb3.1 gen2 技術標准的 type-c 型接口",技術指標和usb3.1 gen2相同。同時還有一個優勢:不會插反!(上下兩排線,引腳設計中心對稱)

注:

    type-c實現usb3.1不是強制規范,沒有規定說用type-c口一定就是usb3.1,也沒有規定說用usb3.1一定要用type-c

1.3 USB設備供電方式

    USB設備有兩種供電方式 :

  • 自供電設備:設備從外部電源獲取工作電壓
  • 總線供電設備:設備從VBUS(5v) 取電

    對總線供電設備,區分低功耗和高功耗USB設備

  • 低功耗總線供電設備:最大功耗不超過100mA
  • 高功耗總線供電設備: 枚舉時最大功耗不超過100mA,枚舉完成配置結束后功耗不超過500mA

    設備在枚舉過程中,通過設備的配置描述符向主機報告它的供電配置(自供電/總線供電)以及它的功耗要求

 

1.4 USB總線信號

USB使用的是差分傳輸模式,兩個數據線D+和D-

差分信號1:D+ > VOH(min) (2.8V) 且D- < VOL(max)(0.3V)

差分信號0:D- > VOH and D+ < VOL

1.4.1 J態、K態、SEO態

    USB協議中是是用J、K、SEO狀態來表示總線狀態的(J狀態:(LS-低速:差分0;FS-全速:差分1) K狀態:(LS:差分1;FS:差分0),具體的狀態如下: 

(1)低速設備:

  • J態: D+ ="0",D- ="1"
  • K態: D+ ="1",D- ="0"
  • SE0態:D+ ="0",D- ="0"

從J到K或者從K到J,信號翻轉,說明發送的是信號0

從J到J或者從K到K,信號保持不變,說明發送的是信號1。這就是差分信號0/1的發送。

(2)高速設備的J和K相反:

  • 低速下: D+為"0",D-為"1"是為"J"狀態,"K"狀態相反;
  • 全速/高速下:D+為"1",D-為"0"是為"J"狀態,"K"狀態相反;

1.4.2 空閑狀態(IDLE態)

  • 低速下空閑狀態為"K"狀態;
  • 全速下空閑狀態為"J"狀態;
  • 高速下空閑狀態為"SE0"狀態;

1.4.3 reset和suspend(掛起)狀態

  • 對於全速操作,SE0表示為復位和EOP,持續時間大於2.5us表示總線復位;
  • 對於高速操作,SE0維持3ms~3.125ms,設備進入全速狀態,全速后100us~875us內采樣,如果繼續維持SE0,則設備總線復位,開始高速握手;若變為"J"狀態,則進入掛起狀態"suspend"。

1.4.4 高速握手條件

  • 設備處於掛起狀態,若出現SE0則立即開始高速握手;
  • 設備處於全速,SE0持續2.5us,則開始高速握手;
  • 設別處於高速,SE0持續3.0ms,且繼續持續,則開始高速握手。

1.4.5 信號狀態電平

  • Reset信號:主機在要和設備通信之前會發送Reset信號來把設備配置到默認的未配置狀態。即SE0狀態(D+ 和D- 都是低電平)保持10ms以上。
  • Idle狀態:J狀態數據發、送前后總線的狀態
  • Suspend狀態:3ms以上的J狀態
  • SYNC: 3個KJ狀態切換,后跟隨2位時間的K狀態(看到的波形變化是總線上發送0000 0001經過NRZI編碼后的波形)
  • Resume信號:20ms的K狀態+低速EOP

    主機在掛起設備后可通過翻轉數據線上的極性並保持20ms來喚醒設備,並以低速EOP信號結尾,帶遠程喚醒功能的設備還可自己發起該喚醒信號;前提是設備已進入idle狀態至少5ms,然后發出喚醒K信號,維持1ms到15ms並由主機在1ms內接管來繼續驅動喚醒信號

  • SOP:從IDLE狀態切換到K狀態
  • EOP:持續2位時間的SE0信號,后跟隨1位時間的J狀態

1.5 差分信號技術的特點

    傳統的傳輸方式大多采用"正信號"或者"負信號",二進制表達機制,這些信號利用單線傳輸。用不同的信號電平范圍來分別表示1或者0,他們之間有一個臨界值,如果在數據傳輸過程中受到強干擾,高低電平突破臨界值,那么會造成數據傳輸出錯。差分信號技術最大的特是:必須使用兩條線路才能表達一個比特位,用兩條線路傳輸信號的壓差作為判斷1還是0的依據。這種做法的優點是具有極強的抗干擾性。對於外界的強烈干擾,兩條線路對應的電平會出現同樣的變化,這樣保證了電壓差值時鍾相對穩定,因此數據的准確性不會因為干擾噪聲而有所降低。

1.6 USB插入檢測和速度檢測

    主機通過在設備D+或D-上的1.5K上拉電阻來檢測設備的連接和斷開事件,並由此判別低速和全速設備。當沒有USB來連接時,由於主控器的D+和D-上的下拉電阻使得這條數據線上的電壓是近地的,當連接設備時,通過檢測設備上的D+和D-的電壓,在D+/D-上出現大小為(Vcc*15/(15+1.5))直流高電平電壓,而其他線保持接地時,就可以知道全速/低速設備了。

  USB高速設備首先被識別成全速設備,然后通過集線器和設備兩者的確認,再切換到高速模式下。在高速模式下,十點六傳輸模式,這是要將D+上的上拉電阻斷開。

一個簡單的實驗:用一個10K的上拉電阻接在USB的+5V和D+(或者D-)上,Windoes也會提示發現新硬件,但無法找到驅動程序,這是因為D+或D-被拉高,集線器認為有設備插入了,它就報告給了主機;但主機獲取數據卻沒有響應,就會得到一個無法識別的USB設備,這是設備管理器顯示一個未知的USB設備,並且其VID和PID都為0(枚舉不成功)。

USB連接和斷開連接:

  • 設備連上主機時(連接)

    當主機檢測到某一個數據線電平拉高並保持了一段時間,就認為有設備連上來了

主機必需在驅動SE0狀態以復位設備之前,立刻采樣總線狀態來判斷設備的速度

  • 沒有設備連上主機時(斷開)

    D+和D-數據線上的下拉電阻起作用,使得二者都在低電平;主機端看來就是個SE0狀態;同樣地,當數據線上的SE0狀態持續一段時間了,就被主機認為是斷開狀態

1.7 數據編解碼和位填充

USB采用NRZI(非歸零編碼)對發送的數據包進行編碼

    輸入數據0, 編碼成"電平翻轉"

    輸入數據1, 編碼成"電平不變"

編碼出來的序列,高電平:J狀態;低電平:K狀態

  USB信號線中無單獨的時鍾信號線,時鍾信號是通過調制和差分數據一同被傳送出去,時鍾信號被轉換成NRZI碼。每一個數據包中附有同步信號以使的接收方可還原出時鍾信號。

  NRZI沒有自同步特性,在USB中,每個數據包的最開始處都有一個同步域(SYNC),其值為00000001,在經過NRZI編碼后,就是一串方波,接收方可能過這個同步頭來計算發送方的頻率,以便用這個頻率來繼續采樣數據信號。由於USB所采用的NRZI編碼中,每當邏輯0時就會進行電平翻轉,那么接收方可通過這個不斷翻轉的信號來調整同步的頻率,保證數據的正確傳輸。

  但這仍然存在問題,一旦電平長時間保持不變時,我們無法知道到時發送的是100個邏輯1,還是1000個邏輯1,即使傳輸的是100個邏輯1,但接收方與發送方的頻率相差了100分之1,那么也還是存在可能把數據采集成為99或者101。而USB中采用了Bit-Stuffing位填充處理,即在連續發送6個1后面會插入1個0,強制使發送信號進行翻轉,從而讓接收方調整頻率,同步接收。而接收方在接收時只要接收到連續的6個1后,直接將后面的0刪除即可恢復數據的原貌。

  經過位填充的數據,由串行接口引擎(SIE)將數據串行化和NRZI編碼后,發送到USB的差分線上,在接收端,剛好是一個相反的過程,由SIE將數據並行化(反串行化),恢復出原來的數據。通常,我們使用的現成的USB芯片,如位填充,串行化、反串行化、CRC校驗等處理過程,芯片內部的硬件已經幫我們做好,因此不必關心這些細節。

  注意USB模塊雖然需要一個單獨的48MHz的時鍾信號,但是它應該不是供USB模塊工作的時鍾,而只是提供給串行接口引擎(SIE)使用的時鍾

 

1.8 主機與設備之間的通信模型

    上圖展示了USB主機和USB設備之間的數據傳輸過程。在設備端,USB設備將非USB格式的數據進行打包處理,轉換成USB格式的數據包,然后傳遞到鏈路層,經過硬件處理、傳遞到物理層,由物理層通過PHY以數據流的形式傳輸到主機。

    

2. USB傳輸

    USB進行一次數據傳輸遵循的"協議"簡單來說就是:

(1)主機給從機發送數據:

①首先,主機發第1個packet給從機,聲明數據傳送方向,數據傳輸地址,數據傳輸類型。

②其次,主機發第2個至第n個packet載有實際數據

③最后,從機返回一個packet是一個ACK包,報告數據傳輸的結果,比如接受出錯或成功等信息,這樣主機就可以借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發。

(2)從機給主機發送數據:

①首先,從機發第1個packet給主機,聲明數據傳送方向,數據傳輸地址,數據傳輸類型。

②其次,從機收到主機送來的第一個packet后,再發第2個至第n個packet載有實際數據.

③最后,主機返回一個packet是一個ACK包,報告數據傳輸的結果,比如接受出錯或成功等信息,這樣從機就可以借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發。

    USB數據是由二進制數字串構成的,首先數字串構成域(有七種),域再構成包,包再構成事務(IN、OUT、SETUP),事務最后構成傳輸(中斷傳輸、等時傳輸、批量傳輸和控制傳輸)

    USB主機在USB設備和USB主機之間發起的傳輸過程,稱為事務。每次事務以2到3個數據包的形式進行USB總線傳輸。每個數據包包含2到3個步驟:

  • USB主機控制器向USB設備發出命令
  • USB控制器和USB設備之間傳遞讀寫請求,其方向取決於第一部分的命令是讀還是寫
  • 握手信號。

    USB主機控制器向USB設備發送事務類型請求,通過分組標識符(PID)來進行識別

    傳輸又分為四種類型:批量傳輸、等時(同步)傳輸、中斷傳輸、控制傳輸。

注意:USB傳輸數據先發數據低位再發高位數據

2.1 包

2.1.1 包的組成

    包(Packet)是USB系統信息傳輸的基本單元,所有數據都是經過打包后在總線上傳輸的。數據在 USB總線上的傳輸以包為單位,包只能在幀內傳輸。高速USB 總線的幀周期為125us,全速以及低速 USB 總線的幀周期為 1ms。

    幀的起始由一個特定的包(SOF 包)表示,幀尾為 EOFEOF不是一個包,而是一種電平狀態,EOF期間不允許有數據傳輸。

(注意:雖然高速USB總線和全速/低速USB總線的幀周期不一樣,但是SOF包中幀編號的增加速度是一樣的,因為在高速USB系統中,SOF包中幀編號實際上取得是計數器的高11位,最低三位作為微幀編號沒有使用,因此其幀編號的增加周期也為 1mS)

    USB的包(Packet)包括五個部分組成,即同步字段(SYNC)、包標識符段(PID)、數據字段、循環冗余校驗字段(SRC)和包結尾字段(EOP),包的基本格式為(注意包中的數據都是原始數據,沒有經過NRZI編碼):

包的內容:

    包是USB總線上數據傳輸的最小單位,不能被打斷或干擾,否則會引發錯誤。若干個數據包組成一次事務傳輸,一次事務傳輸也不能打斷,屬於一次事務傳輸的幾個包必須連續,不能跨幀完成。一次傳輸由一次到多次事務傳輸構成,可以跨幀完成

1)SYNC字段:同步域,由8位組成,作為每個數據包的前導,用來產生同步作用,使USB設備與總線的包傳輸率同步,對於低速和全速設備,它的數值固定為00000001.該數據通過NRZI編碼后,就是一串0101010的方波,而發送方波的頻率,就是發送數據的波特率。對於高速設備,同步域使用的是31個0,后面跟隨1個1.

2)PID字段用來表示數據封包的類型。包標識符的校驗字段是通過對類型字段的每個位反碼產生的,PID字符如下圖所示:

    這里只用(PID0~4),PID4~7是PID0~4的取反,用來校驗PID

    PID1~0:01 令牌包、11 數據包、10 握手包、00 特殊包

  其中PID傳送的前兩位(PID<0:1>指出了其屬於哪個組),這說明了PID的編碼分布

3)數據字段:用來攜帶主機和設備之間傳遞的信息,其內容和長度根據包標識符、傳輸類型的不同而各不同。在USB包中,數據字段可以包括設備地址、端點號、幀序列號以及數據等內容。在總線傳輸中總是先傳輸字節的最低位,最后傳輸字節的最高位。

  • 設備地址(ADDR)數據域:ADDR數據域由7位組成,代表了設備在主機上的地址,地址000 0000被命名為零地址,是任何一個設備第一次連接到主機時,在被主機配置、枚舉前的默認地址,可用來尋址多達127個外圍設備。
  • 端點(ENDP)數據域.:ENDP數據域由4位組成。通過4個位最多可尋址出16個端點。這個ENDP數據域僅用在IN、OUT與SETUP令牌信息包中。對於慢速設備可支持端點0以及端點1作為終端傳輸模式,而全速設備則可以擁有16個輸入端點(IN)與16個輸出端點(OUT)共32個端點。
  • 幀序列號(FRAM)域:幀號字段用於指出當前幀的幀號,它僅在每幀/小幀開始的SOF令牌包中被發送,其數據位長度為11位,每傳輸一幀,主機就將其內容加1,最大數值為0X7FF,當幀序列號達到最大數時將自動從0開始循環。
  • 數據域:長度為0到1023字節(實時傳輸),它僅存在於DATA信息包中,根據不同的傳輸類型,擁有不同的字節大小,但必須為整個字節的長度。

4)CRC字段:由不同數目的位組成。根據不同的信息包的類型,CRC數據域由不同數目的位所組成。其中重要的數據信息包采用CRC16的數據域(16個位),其余的信息包類型采用CRC5的數據域(5個位)。其中的循環冗余碼校驗CRC,是一種錯誤檢測技術。由於數據在傳輸時,有時候會發生錯誤,因此CRC可根據數據算出一個校驗值,然后依此判斷數據的正確性。CRC只校驗PID之后的數據,不包括PID本身,因為PID本身通過四個取反位校驗。

5)EOP段:即發送方在包的結尾發出包結尾信號。USB主機根據EOP判斷數據包的結束。全速/低速設備的EOP是一個大約為2個數據位寬度的單端0(SE0)信號,高速設備用故意的位填充錯誤來表示,用CRC判斷,CRC校驗正確,則為位填充錯誤EOP,否則為傳輸錯誤。

2.1.2 常用包的類型

    Packet分四大類: 令牌 (Token) 、Packet 幀首 (Start of Frame) 、Packet 數據 (Data) 、Packet 握手 (Handshake) Packet

①令牌包(Token Packet):

    在USB系統中,只有主機才能發出令牌包。令牌包定義了數據傳輸的類型,它是事務處理的第一個階段,用來啟動一次USB傳輸。令牌包中較為重要的是SRTUP、IN和OUT這三個令牌包。他們用來在根集線器和設備端點之間建立數據傳輸。

  • 輸出(OUT)令牌包:用來通知設備將要輸出一個數據包
  • 輸入(IN)令牌包:用來通知設備返回一個數據包
  • 建立(SETUP)令牌包:只用在控制傳輸中,和輸出令牌包作用一樣,也是通知設備將要輸出一個數據包,兩者區別在於:

    SETUP令牌包后只使用DATA0數據包,且只能發送到設備的控制端點,並且設備必須要接收,而OUT令牌包沒有這些限制。其格式如下:

例子:

②SOF Packet

    SOF包由Host發送給Device,在每幀(或微幀)開始時發送,以廣播的形式發送,所有USB全速設備和高速設備都可以接收到SOF包。

    1) 對於full-speed總線,每隔1.00 ms ±0.0005 ms發送一次;

    2) 對於high-speed總線,每隔125 μs ±0.0625 μs發送一次;

  SOF包以相對於每幀的開始精確計算的時間間隔發送SOF記號和伴隨的幀數,包括集線器的所有全速/高速設備都可以接收到SOF包。SOF包不會使得接收功能部件產生返回包,因此,不能保證向任何給定的設備發送SOF都能被接收到。當設備探測到SOF的PID時,會被告知發生了SOF。

例子:

0xA5:1010 0101:對應上面PID表可知是幀起始包

③Data Packet

    數據包含有4個域:SYNC、PID、DATA和CRC16。有四種類型的數據包:DATA0, DATA1, DATA2,and MDATA,且由PID來區分。DATA0和DATA1被定義為支持數據切換同步(data toggle synchronization)。在USB1.1協議中,只有兩種數據包:DATA0和DATA1,USB2.0中增加了DATA2和MDATA,主要用於高速分裂事務和高速高帶寬同步傳輸中。

    DATA數據域的位值是根據USB設備的傳輸速度及傳輸類型而定的,且須以8字節為基本單位。也就是傳輸的數據不足8字節的。或是傳輸到最后所剩余的也不足8字節的,仍需傳輸8字節的數據域。格式如下:

  主機和設備都會維護自己的一個數據包類型切換機制:當數據成功發送或者接收時,數據包類型會進行切換。當檢測到對方所使用的數據包類型不對時(未切換),USB系統會認為這發生了一個錯誤,並試圖從錯誤中恢復。數據包類型不匹配主要發生在握手包被損壞的情況,當一端已經正確接收到數據並返回確認信號時,確認信號卻在傳輸過程中被損壞。此時另一端就無法知道剛剛發送的數據是否已經成功,由於未接到返回確認信號,則只好保持自己的數據包類型不變,這時就要通過對方下一次的數據包類型判斷傳輸是否成功。如果對方下一次使用的數據包類型和自己的不一致,則可以確定自己剛剛已經成功發送(因為對方已經做了數據切換,只有正確接收才會如此);如果下一次對方發送的數據和自己一致。則說明剛剛發送的數據包沒有成功。

例子:

④Handshake Packet 

    握手信息包是最簡單的信息包類型。在這個握手信息包中僅包含一個PID數據域而已,其格式如下:

  握手包主要用來報告數據事務的狀態,還能表示數據成功接收、命令的接收或拒絕、流控制和停止條件,只有支持流控制的事務類型才能返回握手信號

  主機和設備都可以使用ACK來確認,而NAK、STALL、NYET只有設備可以返回,主機不能使用這些握手包。NYET只在USB2.0的高速設備的輸出事務中使用,表示本次數據成功接收,但沒有足夠的空間接收下一次數據,主機在下一次輸出數據時,將先使用PING令牌包試探設備是否有空間接收數據,避免不必要的帶寬浪費。

  注意,當USB主機或設備檢測到數據傳輸錯誤時(如CRC校驗錯、PID校驗錯、位填充錯誤時),將什么都不返回,這是等待接收握手信號包的一方將不會收到握手包而等待超時。

例子:

 2.1.3  數據包的處理

  數據包處理的很多過程在USB接口芯片中都已經處理好,故我們不必關心這些細節。一般的USB接口芯片會完成如CRC校驗、位填充、數據切換、握手等協議的處理。

  當USB接口芯片正確接收到數據時,如有空間保存,則將數據保存並返回ACK,同時設置一個標志表示已經正確接收到數據;如果沒有空間保存,則自動返回一個NAK。

  收到輸入請求時,如有數據需要發送,則發送數據,並等待接收ACK。只有當數據成功發送出去(即接收到應答信號ACK)之后,它才設置標志,表示數據已經成功發送;如果無數據需要發送,則地洞返回NAK。

  通常只需要根據芯片提供的一些標志,准備要發送的數據到端點,或從端點讀取接收到的數據即可。所要發送的數據是指數據包中的數據,至於同步域、包標識、地址、端點、CRC等是看不到的,在BUS Hound(USB抓包工具)中抓到的數據也是如此,僅是數據包。在USB接口芯片中,通過一些標志,我們知道哪個端點接收或成功發送了數據。

 

2.2 事務

    在USB上數據信息的一次接收或發送的處理過程稱為事務處理(Transation)。事務通常由三個包組成:令牌包、數據包和握手包。

  • 令牌包用來啟動一個事務,總由主機發送;
  • 數據包傳送數據,可以由主機到設備或從設備到主機,方向由令牌包來指定。
  • 握手包的發送着通常時數據的接收者,當數據正確接收時,發送握手信號,設備也可發送NAK握手包表示數據未准備好。

    Transaction可以分成三類 :

  • Setup transaction:主機用來向設備發送控制命令
  • Data IN transaction:主機用來從設備讀取數據
  • Data OUT transaction:主機用來向設備發送數據

    在OUT和SETUP事務處理中,緊接在SETUP和OUT包后的是DATA包,DATA0和DATA1包是接替地發送的,在DATA包后面,設備將回應一個握手信號,(如果設備可以接受數據,就回應ACK包;如果設備忙,則回應NAK包;如果設備出錯,則回應STALL包)。

    在IN事務中,在IN包后面是設備發送的DATA包或NAK包或STALL包,(若設備忙或者出錯,就發送NAK包或STALL包給主機;若設備數據准備好發送,則發送DATA包),DATA0和DATA1包也是交替發送的,緊接着DATA包后面的是主機發送給設備的握手包。(ACK表示主機可以接收數據,NAK包代表主機忙,STALL代表主機出錯

例子:

1)輸入(IN)事務處理:(USB主機從設備接收數據包)

①正常的輸入事務處理

②設備忙時的輸入事務處理

③設備出錯時的輸入事務處理

2)輸出(OUT)事務處理

①正常的輸出事務處理

②設備忙時的輸出事務處理

③設備出錯時的輸出事務處理

3)設置(SETUP)事務處理

①正常的設置事務處理

②設備忙時的設置事務處理

③設備出錯時的設置事務處理

 

2.3 傳輸

    USB協議定義了四種傳輸類型:控制傳輸、中斷傳輸、批量傳輸以及等時傳輸。其中,批量傳輸、等時傳輸、中斷傳輸每傳輸一次數據就是一個事務控制傳輸分為2~3個階段:建立階段、數據階段(無數據控制沒有此階段)以及狀態階段,其中建立階段和狀態階段分別是一個事務,數據階段則可能包含多個事務。根據數據階段的數據傳輸方向,控制傳輸又可分為3種類型:控制讀取(讀取USB描述符)、控制寫入(配置USB設備)以及無數據控制。

①控制傳輸(Control Transfers): 非周期性,突發。用於命令和狀態的傳輸。

②中斷傳輸(Interrupt Transfers): 周期性,低頻率,允許有限延遲的通信 如人機接口設備(HID)中的鼠標、鍵盤、軌跡球等

③批量(大容量數據)傳輸(Bulk Transfers): 非周期性,突發大容量數據的通信,數據可以占用任意帶寬,並容忍延遲 。如USB打印機、掃描儀、大容量儲存設備等

④等時(同步)傳輸(Isochronous Transfers): 周期性、持續性的傳輸,用於傳輸與時效相關的信息,並且在數據中保存時間戳的信息 ,如音頻視頻設備

    其中,批量傳輸、同步傳輸和中斷傳輸每傳輸一次數據都是一個事務,控制傳輸包括3個過程,建立過程和狀態過程分別是一個事務,數據過程則可能包含多個事務。

2.3.1 控制傳輸

    控制傳輸時USB傳輸中最重要的傳輸,包含3種傳輸類型:控制讀取、控制寫入以及無數據控制。這3種控制傳輸類型又可分為2~3個過程:(1)設置過程(2)數據過程(可選)(3)狀態過程.

  建立過程使用一個建立事務,是一個輸出數據的過程。控制傳輸和批量傳輸的輸出事務不同,首先令牌包使用SETUP令牌包,其次數據包類型,SETUP只能使用DATA0包,最后是握手包,設備只能使用ACK來應答(除非是錯了、不應答),而不能使用NAK或STALL,即設備必須要接收建立事務的數據。

(1)設置過程

    主機從USB獲得配置信息,並設置設備的配置值。

    設置階段的數據交換包含SETUP令牌封包,其后是DATA0數據包以及ACK握手包。它的作用是執行一個設置的數據交換,並定義此控制傳輸的內容(即:在Data Stage中IN或OUT的data包個數,及發送方向,在Setup Stage已經被設定)。

(2)數據傳輸過程

    該階段用來傳輸主機和設備之間的數據。其數據傳輸過程為前面提到的事務處理過程。

    而根據數據階段的數據傳輸的方向,控制傳輸又可分為3種類型:1) 控制讀取(讀取USB描述符);2) 控制寫入(配置USB設備);3) 無數據控制

  數據過程的所有數據事務必須是同一傳輸方向,一旦數據傳輸方向發生改變,就會認為是進入狀態階段。數據過程的第一個包必須是DATA1包,然后每次正確傳輸一個數據包后就在DATA0和DATA1之間替換。

 

(3)狀態過程

    狀態過程用來表示整個傳輸的過程已完全結束。(過程類似數據傳輸過程,但傳輸方向相反,且狀態過程只使用DATA1包).

    狀態傳輸的方向必須與數據傳輸方向相反,即原來是IN令牌包,則這個階段應為OUT令牌包。對於控制讀取而言,主機會發送OUT令牌包,其后為0長度的DATA1封包,此時,設備也會做出相對應的動作,送ACK、NAK或STALL握手封包。對於控制寫入傳輸,主機會送出IN令牌包,然后設備送出表示完成階段的0長度的DATA1封包,主機再做出相應的動作;送ACK、NAK或STALL封包。

以高速設備的最大數據包長度64字節為例 :

  • 要傳輸250字節,拆分成4個packet

  • 要傳輸正好256字節,通過最后一個0字節包告訴設備傳輸完成

2.3.2 中斷傳輸

    中斷傳輸方式總是相對於設備查詢的,以確定是否有數據需要傳輸,因此中斷傳輸的方向總為從USB設備到主機。中斷傳輸由IN或OUT事務組成。中斷端點在端點描述符中要報告它的查詢間隔,主機會保證在小於這個時間間隔的范圍內安排一次傳輸。這里說的中斷與硬件上的中斷不同,他不是由設備主動發起的一個中斷請求,而是由主機保證不大於某個時間間隔內安排一次傳輸。

    中斷傳輸在流程上除不支持PING 之外,其他的跟批量傳輸是一樣的。他們之間的區別也僅在於事務傳輸發生的端點不一樣、支持的最大包長度不一樣、優先級不一樣等這樣一些對用戶來說透明的東西。

    主機在排定中斷傳輸任務時,會根據對應中斷端點描述符中指定的查詢間隔發起中斷傳輸。中斷傳輸有較高的優先級,僅次於同步傳輸。

    同樣中斷傳輸也采用PID翻轉的機制來保證收發端數據同步。下圖為中斷傳輸的流程圖(DATA0或DATA1中的包含的是中斷信息,而不是中斷數據)。

2.3.3 批量傳輸

  • 用來傳輸大量數據,要求傳輸不能出錯,適用於打印機、存儲設備等。
  • 批量傳輸是可靠的傳輸,需要握手包來表明傳輸的結果。若數據量比較大,將采用多次批量事務傳輸來完成全部數據的傳輸,傳輸過程中數據包的PID 按照 DATA0-DATA1-DATA0-…的方式翻轉,以保證發送端和接收端的同步。
  • USB 允許連續 3次以下的傳輸錯誤,會重試該傳輸,若成功則將錯誤次數計數器清零,否則累加該計數器。超過三次后,HOST 認為該端點功能錯誤(STALL),放棄該端點的傳輸任務
  • 一次批量傳輸(Transfer)由 1 次到多次批量事務傳輸(Transaction)組成。
  • 翻轉同步:發送端按照 DATA0-DATA1-DATA0-…的順序發送數據包,只有成功的事務傳輸才會導致 PID 翻轉,也就是說發送端只有在接收到 ACK 后才會翻轉 PID,發送下一個數據包,否則會重試本次事務傳輸。同樣,若在接收端發現接收到到的數據包不是按照此順序翻轉的,比如連續收到兩個 DATA0,那么接收端認為第二個 DATA0 是前一個 DATA0 的重傳。

    它通過在硬件級執行"錯誤檢測"和"重傳"來確保host與device之間"准確無誤"地傳輸數據,即可靠傳輸。它由三種包組成(即IN事務或OUT事務):1) token; 2) data; 3) handshake

    其傳輸過程如下:

①批量輸出事務:(1)主機先發出一個OUT令牌包(包含設備地址,端點號),(2)然后再發送一個DATA包,這時地址和端點匹配的設備就會收下這個數據包,主機切換到接收模式,等待設備返回握手包,(3)設備解碼令牌包,數據包都准確無誤,並且有足夠的緩沖區來保存數據后就會使用ACK/NYET握手包來應答主機(只有高速模式才有NYET握手包,他表示本次數據成功接收,但是沒有能力接收下一次傳輸),如果沒有足夠的緩沖區來保存數據,就返回NAC,告訴主機目前沒有緩沖區可用,主機會在稍后時間重新該批量傳輸事務。如果設備檢查到數據正確,但端點處於掛起狀態,返回STALL。如果檢測到有錯誤(如校驗錯誤,位填充錯誤),則不做任何響應,讓主機等待超時。

②批量輸入事務:(1)主機首先發送一個IN令牌包(包含設備地址,端點號),(2)主機切換到接收數據狀態等待設備返回數據。如果設備檢測到錯誤,不做任何響應,主機等待超時。如果此時有地址和端點匹配的設備,並且沒有檢測到錯誤,則該設備作出反應:設備有數據需要返回,就將一個數據包放在總線上;如果沒有數據需要返回,設備返回NAK響應主機;如果該端點處於掛起狀態,設備返回STALL。如果主機收到設備發送的數據包並解碼正確后,使用ACK握手包應答設備。如果主機檢測到錯誤,則不做任何響應,設備會檢測到超時。注意:USB協議規定,不允許主機使用NAK來拒絕接收數據包。主機收到NAK,知道設備暫時沒有數據返回,主機會在稍后時間重新該批量輸入事務。

    在USB2.0高速設備中增加了一個PING令牌包,它不發送數據,直接等待設備的握手包,因此PING事務只有令牌包和握手包。

2.3.4 等時傳輸

    等時(同步)傳輸適用在數據量大、對實時性要求高的場合,如音頻設備,視頻設備等,這些設備對數據的延遲很敏感。對於音頻或視頻設備數據的100%正確性要求不高,少量的數據錯誤是可以容忍的,主要是保證數據不能停頓,所以等時傳輸是不保證數據100%正確的。

    實時傳輸只需要令牌和數據兩個信息包,沒有握手應答包,故當數據錯誤時,不再重傳操作。數據是否正確,由數據的CRC校驗來確認。同步傳輸也不支持PID翻轉。主機在排定事務傳輸時,同步傳輸有最高的優先級。

各種傳輸特性比較:

2.5 設備列舉

2.5.1 描述符

    USB描述符類似USB外圍設備的"身份證"一樣,詳細地記錄着外圍設備相關的一切信息(設備類型、廠商的ID和產品的ID、端點情況、本版本號等)。為了描述不同的數據,需要以不同的數據類型的USB描述符加以描述,共有11種類型,每種描述符的第一個字節描述該描述符包含的字節數目,第二個字節描述該描述符的類型。

  USB1.1協議定義的標准描述符是:設備描述符,配置描述符、接口描述符、端點描述符和字符串描述符,USB2.0中又新增了Device Qualifier Descriptor 和 Other Speed Configuration Descriptor。除此之外,還有其他描述符如:組描述符、報告描述符、類特殊描述符等。

  一個USB設備只有一個設備描述符,設備描述符里決定了該設備有多少種配置,每種配置都有一個配置描述符;而在每個配置描述符中又定義了該配置有多少個接口,每個接口都有一個接口描述符;在接口描述符中又定義了該接口有多少個端點,每個端點都有一個端點描述符;端點描述符定義了端點的大小、類型等。

  由此可以看出,USB描述符之間的關系是一層一層的,在主機獲得描述符時,首先獲取設備描述符,其次是配置描述符,再接下來是接口描述符,最后是端口描述符。

  這些描述符參數字段都有一個小寫字母表示的前綴,它們所表示的意思如下:
 b 表一個字節,=8bits;
 w 表一個字,=16bits;
 bm 表按位尋址;
 bcd 用BCD碼表示;
 i 表索引值
 id 表標識碼

(1)設備描述符

    設備描述符具有18字節的長度,並且是主機向設備請求的第一個描述符。包含的信息有:設備所使用的USB協議版本號,設備類型、端點0的最大包大小、廠商ID(VID)和產品ID(PID)、設備版本號、廠商字符索引、產品字符索引、設備序列號索引、可能的配置數等。以下列出設備描述符的范圍、數值以及各個字段的意義:

 bLength: 表示描述符的長度,對於設備描述符來說,其值為18,即0x12。
 bDescriptorType: 描述符類型,對應表1中的值,設備描述符為0x01。
 bcdUSB:該設備遵循的USB版本號,以BCD碼表示,USB1.1為0x0101,USB2.0為0x0200。
 bDeviceClass:該設備所屬的標准設備類,USB協議中對常見的設備進行了分類。該字段值為0x01~0xFE時,表示是USB協議中已定義的設備類,常用的HID設備類編號為0x03,其它設備類編號參:http://www.usb.org/developers/defined_class
 bDeviceProtocol:用於表示USB設備類所采用的設備類協議,其值和bDeviceClass和bDeviceSubClass有關。當此 字段為0時,表示不使用任何設備類協議。如果該USB設備屬於某個設備類和設備子類,則應該繼續指明所采用的設備類協議。當該字段為0xFF時,表明設備 類協議由供應商自定義。
 bMaxPacketSize0:用於表示在USB設備中,端點0所支持最大數據包的長度,它以字節為單位。對於低速USB設 備,bMaxPacketSize0為8;對於全速USB設備,bMaxPacketSize0為8、16、32、64;對於高速USB設 備,bMaxPacketSize0為64。
 IdVendor:用於表示USB設備供應商的ID。USB組織中規定每種產品都必須包含一個供應商ID,這樣可以使主機加載合適的驅動程序。
 idProduct:用於表示USB產品的ID,由設備供應商提供。idProduct用於表示特定的USB設備,在USB設備上電的時候可以幫助USB主機選擇合適的驅動程序。
 bcdDevice:用於表示USB設備的版本號,它以BCD碼的形式表示。一般來說bcdDevcie由設備供應商指定,在USB設備上電的時候可以幫助USB主機選擇合適的驅動程序。
 iManufacturer:用於表示供應商字符串描述符的索引值。具體字符串的內容在后面字符串描述符中定義。如果沒有供應商字符串,可以置0。
 iSerialNumber:用於表示設備序列號字符串描述符的索引值,如果沒有,可以置為0。
 bNumConfigurations:用於表示該USB設備所支持的配置數。

(2)配置描述符

    配置描述符具有9字節長度,針對設備給予配置的信息,包括配置所包含的接口數、配置的編號、供電方式、是否支持遠程喚醒、電流需求量等。以下列出配置描述符的范例、數值以及各個字段的意義。

 bLength:用於表示配置描述符的長度,固定為9個字節,即0x09。
 bDescriptorType:用於表示配置描述符的類型值,固定為0x02。
 wTotalLength:用於表示配置信息的總長度,包括配置描述符、接口描述符、端點描述符長度的總和。
 bNumInterfaces:用於表示配置所支持的接口數。一般來說,USB設備的接口至少有一個,因此其最小值為1。
 bConfigurationValue:用於表示USB設備的配置值。
 iConfiguration:用於指出配置字符串描述符的索引值。具體字符串的內容在后面字符串描述符中定義。如果沒有配置字符串,可以置為0。
 bmAttributes:用於表示USB設備特性。bmAttributes是接位尋址的,第6位置1表示使用總線電源;第5位置1表示支持遠程喚醒功能;該字段其他位均保留,一般來說,第0~4位置0即可,第7位置1即可。
 bMaxPower:用於表示USB設備運行時所需要消耗的總線電流,單位以2mA為基准。USB設備可以從USB總線上獲得最大的電流為500mA,因此bMaxPower字段的最大值可以設置為250。

(3)接口描述符

    接口描述符具有9字節的長度,用來描述每個設備的接口特性,包括接口的編號、接口的端點數、接口所使用的類、子類、協議等。以下列出配置描述符的范例、數值以及各個字段的意義。

(4)端點描述符

    端點描述符具有7字節的長度,用來描述端點的屬性以及各個端點的位置,有端點號及方向、端點的傳輸類型、最大包長度、查詢時間間隔等。該實例中有兩個端點,首先介紹端點1的描述符:

    接下來介紹端點2的描述符:

 bLength:用於表示端點描述符的長度,固定為7字節,即0x07。
 bDescriptorType:用於表示接口描述符的類型值,固定為0x05。
 bEndpointAddress:用於表示端點的端點號以及端點的數據傳輸方向。第七位表示端點的數據傳輸方向,0表示OUT數據傳輸,1表示IN數據傳輸;第0~位表示端點號,例如001B表示端點1、010B表示端點2;其余位均保留,必須置0。
 bmAttributes:用於表示端點的特性。其中第0位和第1位表示端點的數據傳輸類型,00B表示控制傳輸、01B表示同步傳輸、10B表示塊傳 輸、11B表示中斷傳輸;如果是同步傳輸,第2位和第3位表示同步類型,00B表示非同步、01B表示異步、10B表示自適應、11B表示同步;第4、5 位表示端點的用法類型,00B表示數據端點、01B表示顯示反饋端點、10B表示隱匿反饋端點、11B保留。其余位保留。
 wMaxPacketSize:用於表示端點所支持最大數據包的長度。其中第0~10位表示數據包的長度,第11位和12位指出每小幀最多傳輸的事務數,其余位均保留,必須置0。
 bInterval:用於指定端點數據傳輸的訪問間隔。低速中斷端點,取值范圍為10~255,對應的訪問間隔為10~255ms;對於全速中斷端點,取值范圍為1~255,對應的訪問間隔為1~255ms;對於其他端點,可以參閱USB相關協議。

 2.6  端點類型和傳輸類型的關系

  一個具體的端點,只能工作在一種傳輸模式下。通常,我們把工作在什么模式下的端點就叫做什么端點,如控制端點、批量端點等。

  端點0是每個USB設備都必須具備的默認控制端點,它一上電就存在並且可用。設備的各種描述符以及主機發送的一些命令,都是通過端點0傳輸的。其他端點都是可選的,需要通過具體設備來決定。非0端點只有在Set Config之后才能使用

2.7  傳輸類型和端點支持的最大包長

  每個端點描述符都規定了端點支持的最大數據包長,主機每次發送數據包,都不能超過端點的最大包長。

  • 控制傳輸的端點,低速模式最大包長固定為8字節,高速模式最大包長固定為64字節,而全速模式在8,16,32,64中選擇。
  • 等時傳輸的端點,全速模式最大包長的上限為1023字節,高速模式最大包長上限是1024字節,低速模式不支持等時傳輸。
  • 中斷傳輸的端點,低速模式最大包長的上限為8字節,全速模式最大包長上限是64字節,高速模式最大包長上限是1024字節。
  • 批量傳輸的端點,高速模式固定為512字節,全速模式最大包長可在8、16、32、64字節中選擇,低速模式不支持批量傳輸。

3 USB標准請求

3.1 USB標准請求的數據結構

  USB設備請求命令 :bmRequestType + bRequest + wValue + wIndex + wLength

  USB協議定義了一個8字節的標准設備請求,主要用在設備的枚舉過程中。這8個字節的數據使用在控制傳輸的過程中通過默認的控制端點0發出的。在這8字節的數據中,包含了數據過程所需要的傳輸數據的方向、長度以及數據類型等信息。正式由於8字節的標准請求的原因,USB協議規定,端點0的最大包長度至少為8字節,就是說,任何一個USB設備都能夠(而且必須)接收8字節的標准請求。

  注意:wValue、wIndex、wLength這三個域都是兩字節的。在USB協議中用的是小端結構,即低字節在先,高字節在后

  這里只介紹了USB協議定義的標准請求,即bmRequestType的D6~5位位00的標准請求。

3.2 USB設備請求

  • 0 GET_STATUS:用來返回特定接收者的狀態
  • 1 CLEAR_FEATURE:用來清除或禁止接收者的某些特性
  • 3 SET_FEATURE:用來啟用或激活命令接收者的某些特性
  • 5 SET_ADDRESS:用來給設備分配地址
  • 6 GET_DEscriptOR:用於主機獲取設備的特定描述符
  • 7 SET_DEscriptOR:修改設備中有關的描述符,或者增加新的描述符
  • 8 GET_CONFIGURATION:用於主機獲取設備當前設備的配置值(注同上面的不同)
  • 9 SET_CONFIGURATION:用於主機指示設備采用的要求的配置
  • 10 GET_INTERFACE:用於獲取當前某個接口描述符編號
  • 11 SET_INTERFACE:用於主機要求設備用某個描述符來描述接口
  • 12 SYNCH_FRAME:用於設備設置和報告一個端點的同步幀

    這里主要介紹幾種常用的設備請求:

 

(1)取得描述符(Get Descriptor)

 

    該請求是在枚舉過程中使用最多的一個請求,主機通過發送獲得描述符請求讀取設備的各種描述符,從而獲得設備類型,端點情況等眾多重要信息。獲得描述符的接收者只能是設備,從bmRequestType的第7位可以看出,它是請求數據輸入的。

  該請求可以取得USB設備中存在的特定的描述符,其格式如下:

 

 

    該請求的wValue的高字節表示要取的描述字符類型,低字節表示描述符的索引值,描述的類型有:1=設備描述符;2=配置描述符;3=字符串描述符;4=接口描述符;5=端點描述符。wIndex的值為0或語言ID,當要取得的描述符是字符描述符時,該域的值為語言ID;當為其他的描述符時,該域為0。 wLength表示要返回的數據長度,如果SETUP階段的地址使用的是預設地址0(ENDP字段0),這時的wLength值會大於實際描述的值(這是因為用戶以預設地址0來取得設備描述符時,不管多少字節,用戶最多只能取得前8字節,即在控制傳輸過程中只有一次數據階段)。對於全速模式和低速模式,獲取描述符的標准請求只有三種:獲取設備描述符、獲取配置描述符、獲取字符串描述符。另外的接口描述符和端點描述符是跟配置描述符一並返回的,不能單獨請求返回(如果單獨返回,主機無法確認他們屬於哪個配置)。

(2)設置地址(Set Address)

    該請求給USB設備設置地址,從而可以對USB設備進行進一步的訪問。每個連接在同一主控器上的USB設備都需要有一個唯一的設備地址,這樣主機才能區分每個不同的設備。當設備復位后,都是用默認的地址0,主機從地址位0的設備獲取設備描述符,一旦收到第一次設備描述符之后,主機就會發送設置地址請求,以盡量減少設備使用公共地址0的時間。設置地址請求是沒有數據的,因此wLength的值為0,wIndex用不到,值為0。當設備收到設置地址請求后,就直接進入狀態過程,等待主機讀取0長度的狀態數據包。主機成功讀取到狀態數據包(用ACK響應設備),設備將啟用新的地址。格式如下:

    該請求與其他請求有一個重要的不同,該請求下,USB設備一直不改變它的地址,直到該請求的狀態階段被成功的完成,而其他請求的操作都是在狀態階段之前完成的。若特定的設備地址大於127,或者wIndex或我Length為非0值,那么該請求不執行。

(3)設置配置(SET_CONFIGURATION)

    該請求對設備進行設置。其格式如下:

    該請求中的wValue域的低字節表示設置的值,該值必須為0或者域配置描述符中的配置值相匹配。如果與配置描述符中的配置編號一致時,表示選中該配置。該值通常為1,因為大多數USB設備只有一種配置,配置編號為1,如果設置值等於0,表示設備在地址狀態。設備只有收到非0的配置后,才能啟動它的非0端點。如果Index或wLength為非0值,那么該請求不執行。

 

(4)清除特性(Clear Feature)

 

    該請求是用來取消一個特性,其格式如下:

 

 

    該請求的wValue表示特性選擇器,它對應的值為:0=端點,1=設備。當某個特點不允許取消,或該特性根本不存在,或者指向一個根本不存在的端點或者接口時,該請求將會導致設備請求失敗。如果端點被固件設為停止狀態,主機軟件(總線驅動程序)也可以發送一個值為0的CLEAR_FEATURE命令清除該端點的停止狀態。

 

 3.3 設備描述符的返回

  當主機由端點0向設備發送設備描述符請求時,設備將通過控制輸入端0來返回。在端點0的輸出中斷處理函數中,設備先對接收到的建立過程的數據進行判斷,如果是獲取設備設備描述符的請求時,那么將設備描述符數組內容寫入到端點0輸入緩沖區中,並使能端點發送。當下一次主機發送IN令牌后,將自動將端點0的輸入緩沖區內的數據返回給主機,首先獲取設備描述符的請求。

4 USB主機識別USB設備

    當USB設備插上主機時,主機就通過一系列的動作來對設備進行枚舉配置,即從設備讀取各種描述符信息,這樣主機就可以根據這些信息來加載合適的驅動程序從而知道設備是什么樣的設備,如何進行通信等。

枚舉:是USB體系中一個很重要的活動,由一系列標准請求組成(若設備屬於某個子類,還包含該子類定義的特殊請求)。通過枚舉HOST可以獲得設備的基本描述信息,如支持的USB版本,PID、VID、設備分類、供電方式、最大消耗電流、配置數量、各種類型端口數量以及傳輸能力(最大包長度)。HOST根據PID和VID加載設備驅動程序,並對設備進行合適的配置,只有經過枚舉的設備才能正常使用。

  根據USB協議,對於總線供電設備,在枚舉完成前最多可以從總線獲取100mA電流,在枚舉后,最多可以從總線上獲取500mA的電流。

4.1 USB設備狀態

USB設備的狀態如下:

  • 接入態(Attached):設備接入主機后,主機通過檢測信號線上的電平變化來發現設備的接入;
  • 供電態(Powered):就是給設備供電,分為設備接入時的默認供電值,配置階段后的供電值(按數據中要求的最大值,可通過編程設置)
  • 缺省態(Default):USB在被配置之前,通過缺省地址0與主機進行通信;
  • 地址態(Address):經過了配置,USB設備被復位后,就可以按主機分配給它的唯一地址來與主機通信,這種狀態就是地址態;
  • 配置態(Configured):通過各種標准的USB請求命令來獲取設備的各種信息,並對設備的某此信息進行改變或設置。
  • 掛起態(Suspended):總線供電設備在3ms內沒有總線***作,即USB總線處於空閑狀態的話,該設備就要自動進入掛起狀態,在進入掛起狀態后,總的電流功耗不超過280UA。

4.2 USB設備枚舉過程

    對應USB設備的狀態,host對USB設備會有以下活動:

    在枚舉過程中,都是使用控制傳輸

(1)復位階段

    USB主機檢測到USB設備插入后,就會對設備復位。USB設備在總線復位后其地址為0,這樣主機就可以通過地址0和那些剛剛插入的設備通信。USB主機往地址為0的設備的端點0發送獲取設備描述符的標准請求。設備會將設備描述符返回給主機,主機在成功獲取到數據包后,就會返回一個確認數據包給設備,從而進入接下來的分配地址階段。

(2)分配地址階段

    主機對設備又一次復位,就進入到分配地址階段。主機往地址為0的設備的端點0發送一個設置地址的請求,新的設備地址就包含在建立過程的數據包中。具體的地址由主機負責管理,主機會分配一個唯一的地址給剛接入的設備。設備在收到這個建立過程后,就會進入到狀態過程。設備等待主機請求狀態返回,收到狀態請求后,設備就返回0長度的狀態數據包。如果主機確認該狀態包已經正確收到,就會發送應答包ACK給設備,設備在收到這個ACK之后,就要啟用新的設備地址了。這樣設備就分配到了一個唯一的設備地址。

(3)獲取描述符階段

    獲取描述符可以形象地表述如下:

Host:你是什么設備?

Device:12 01 0100....Device Descriptor

Host:你有幾種功能?

Device:09 02 09....Configuration Descriptor

Host:每個功能有幾個接口?

Device:09 04 00....Interface Descriptor

Host:每個接口使用哪幾個端點?

Device:06 05 82....Endpoint Descriptor

Host:好了,我知道你是誰了,開始傳輸設備吧!

Device:OK,Read Go!

    具體的過程如下所示:

 

第一步:

⑴用戶將一個USB設備插入USB端口,主機為端口供電,設備此時處於上電狀態。主機檢測設備。集線器使用中斷通道將事件報告給主機。

⑵主機發送Get_Port_Status(讀端口狀態)請求,以獲取更多的設備信息。返回的消息告訴主機該設備是什么時候連接的。集線器檢測設備是低速運行還是高速運行,並將此信息送給主機,這是對Get_Port_Status請求的響應。

⑶主機發送Set_Port_Feature(寫端口狀態)請求給集線器,要求它復位端口,請求集線器來重新設置端口。集線器使設備的USB數據線處於重啟(RESET)狀態至少10ms。

⑷主機使用Chirp K信號來了解全速設備是否支持高速運行。

⑸主機發送另一個Get_Port_Status請求,確定設備是否已經從復位狀態退出。返回的數據有一位表示設備仍然處於重啟狀態。當集線器釋放了重啟狀態,設備此時處於缺省狀態,且已准備好在零端點通過缺省通道響應主機控制傳輸。缺省地址為00h,設備能從總線獲取高達100mA的電流。

⑹集線器檢測設備速度

集線器通過測定哪根信號線(D+或D-)在空閑時有更高的電壓來檢測設備是低速設備還是全速設備。全速和高速設備D+有上拉電阻,低速設備D-有上拉電阻。

⑺獲取最大數據包長度(開始第一次數據傳輸)

    主機向address 0發送Get_Device_Deor(讀設備描述符)的標准請求(這是一個控制傳輸的建立過程),以取得缺省控制管道所支持的最大數據包長度。設備在接收到該請求后,會按照主機請求的參數,在數據過程將設備描述符返回給主機。主機在成功獲取到一個數據包的設備描述符,並確認沒有錯誤后,就會返回一個0長度的確認數據包(狀態過程)給設備,從而進入接下來的設置地址階段。

  注意,第一次主機只會讀取一個數據包的設備描述符標准的設備描述符具有18個字節,有的USB設備的端點0大小不足18字節(但至少具有8字節),這種情況下USB主機也是只發送一次數據輸入請求,多余的數據將不會再次請求,即在第一次獲取設備描述符時,只需返回一次數據即可。端點0的長度包含在設備描述符的bMaxPacketSize0字段中,其地址偏移量為7,所以這時主機只需讀取該描述符的前8個字節之后,就知道端點0的最大長度了,這是因為端點0最大包長度剛好在設備描述符的第8字節處。注意,主機一次只能枚舉一個USB設備,所以同一時刻只能有一個USB設備使用缺省地址0。

例:主機向設備發送一個八字節請求:80 06 00 01 00 00 40 00,設備接收到請求后產生一個中斷,我們可以通過讀中斷寄存器知道中斷源,並且可以加讀最后狀態寄存器來確定第一個接到的包是否為一個Setup包。當控制器處理程序判斷出它是一個Get_descriptor請求時,把設備描述符的前16個字節發送到端點0緩沖區中。剩下的2個字節描述符第一次請求時不再發送。

第二步:

 

⑻主機分配一個新的地址給設備

    主機對設備又一次復位,這時就進入到了設置地址階段。主機通過向地址0發送一個Set_Address請求來分配一個唯一的地址給設備(控制傳輸的建立過程),新的設備地址包含在建立過程的數據包中。設備在受到這個建立過程之后,直接進入到狀態過程,因為這個控制傳輸沒有數據過程。設備在等待主機請求狀態返回(一個輸入令牌包),收到令牌包后,設備就返回0長度的狀態數據包。如果主機確認該狀態包已經正常收到,就會發送應答包ACK給設備,設備在收到這個ACK之后,就會啟用新的設備地址,這樣設備就被分配到一個唯一的設備地址,從此開始所有通信都使用這個新地址。

例:當主機收到正確的前16字節描述符后,會給設備分配一個地址,我的PC分配的地址為:0x03(這個要看你的機子當時的USB接口設備數目而定) Set_Address 請求所發送的數據為:00 05 03 00 00 00 00 00,其中的03就表示主機為設備分配的地址為0x03,在以后的通信里設備就只對0x03地址作出應答。當設備產生一個接收中斷后,根據所分配的地址設置設備的地址寄存器相應位。

第三步

 

主機再次獲取設備描述符,主機會向新地址重新發送Get_Device_Deor命令,此次讀取其設備描述符的全部字段,以了解該設備的總體信息,如VID,PID,這是會存在多次的請求數據輸入(即主機會發送多個IN令牌包)。

例:主機發送設備描述符標准請求Get_descriptor:80 06 00 01 00 00 12 00,此次將要求把18個字節全部發送完。所以主機要分兩次來讀取。第一次讀取16個字節,第二次讀取兩個字節,最后主機發送0表示發送完畢的應答。

第四步

主機獲取配置描述符,配置描述符總共9字節,主機在獲取配置描述符后,會根據描述符中所描述的配置集合總長度,獲得配置集合。主機會向設備循環發送Get_Device_Configuration命令,要求USB設備回答,以讀取全部配置信息。配置集合包括配置描述符、接口描述符、類特殊描述符(如果有)、端點描述符等。

 

⑾主機發送Get_Device_String命令,獲得字符集描述(unicode)(如果有),比如產商、產品描述、型號等等。此時主機將會彈出窗口,展示發現新設備的信息,產商、產品描述、型號等。

     根據Device_Deor和Device_Configuration應答,PC判斷是否能夠提供USB的Driver,一般win2k能提供幾大類的設備,如游戲操作桿、存儲、打印機、掃描儀等,操作就在后台運行。但是Win98卻不可以,所以在此時將會彈出對話框,索要USB的Driver。

⑿主機分配並加載設備驅動程序,這時就可能作應用中的數據傳輸了。

⒀主機發送Set_Configuration(x)(寫配置)命令請求為該設備選擇一個合適的配置(x代表非0的配置值)。如果配置成功,USB設備進入"配置"狀態,並可以和客戶軟件進行數據傳輸。此時,常規的USB完成了其必須進行的配置和連接工作,至此設備應當可以開始使用。不過,USB協議還提供了一些用戶可選的協議,設備如果不應答,也不會出錯,但是會影響到系統的功能。

⒁主機為復合設備接口分配驅動程序。如果集線器檢測到有過流現象,或者主機要求集線器關閉電源,則USB總線切斷設備供電電源。在這種情況下,設備與主機無法通信,但設備處於連接狀態。

4.3 USB枚舉實例

    對2440的USB HOST進行初始化完畢(主要包括對符合OHCI規范的寄存器的初始化—總線復位、中斷使能、清除中斷標志、電源管理、內存指針寄存器的初始化,各種數據結構的初始化等),等待USB設備的插入,當2440檢測到有設備插入,就要對設備進行枚舉了。起始枚舉就相當於主機和設備建立連接的過程(接頭),Host向Device詢問一些東西,Device將自身的設備類型,如何進行通信報告給Host,這樣Host就知道怎么對Device進行操作了。

    枚舉的過程實際上用到而且只用到了總線的"控制傳輸(Control Transfer)"。這種傳輸方式通常用於配置/命令/狀態等情形,其中的設置操作setup和狀態操作status過程的數據包具有USB協議定義的數據結構,因此,控制傳輸只能通過消息管道進行。

    一個完整的控制傳輸包括三個過程:

  • 建立連接。
  • 數據過程(可選) 。
  • 狀態過程。

     建立連接的過程都是由Host發起,它開始於一個Setup令牌包,后面緊跟一個DATA0包。如果是控制輸入傳輸,數據過程則為輸入數據,若是控制輸出傳輸,則數據過程是輸出數據。

    數據過程的可選型是指設置過程需要指定數據長度,如果指定為0,則沒有數據過程。狀態過程跟在數據過程之后,狀態過程恰好和數據過程的數據傳輸方向相反,因為此階段主要是用來確認之前兩階段的所有數據都已經正確傳輸了。

    好了,下面就結合我的這個實例來看看枚舉的詳細過程:

①控制2440向U盤發送第一個Setup包,內容是80 06 00 01 00 00 08 00,其中最后的00 08表示得到DEVICE_DCESCRIPTOR的前8個字節,因為這個包的主要目的是要獲得USB Device中端點0的最大包的大小(第8個字節),所以只需要8個字節就可以了。USB Device返回的設備標識符為12 01 10 01 00 00 00 40,下面我們需要把0x40記錄下來,將其放到Endpoint Descriptor數據結構的DWORD0的MPS(bit16~bit32)塊中去。

②接下來2440發送第二個Setup包,內容是00 05 01 00 00 00 00 00,這一次的作用是為USB設備分配地址。如果USB Device接收並接受了此地址設置包,會返回一個長度為0的數據包。主機接收到長度為0的狀態包之后就會返回一個ACK給Device,Device再接收到這個ACK之后,就可以啟用新地址了。這樣Device就得到了一個唯一的設備地址,作為主機通信的唯一表示。

③發送第三個Setup包,內容是80 06 00 02 00 00 09 00,這次是為了獲取配置描述符集合的大小,此位位於讀回數據的第三個字節。U盤返回的數據為09 02 20 00 01 01 00 80 32,即描述符集合總大小為0x20。

④發送第四個Setup包,內容是80 06 00 02 00 00 09 00,和上次不同的僅僅是,這次要讀回來的數據是整個配置描述符區域。U盤返回來的數據是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00。這時候我們就可以知道該設備是什么類型的設備,支持什么樣的操作了。

    上述這兩個過程也有的程序就是直接讀取0xff個字符大小,當然同樣可以達到讀回設備描述符集合的目的。至此,我們已經得到了所需要的設備信息,之后就可以對設備進行配置了。

⑤向設備發送第五個Setup包,數據為00 09 01 00 00 00 00 00,USB Device返回一個長度為0的數據包,表明數據正確接收。至此,USB枚舉過程就完成了。初始設置步驟:就是一個由SET事務構成的傳輸

    可選數據步驟:就是一個由IN或OUT事務構成的傳輸,這個步驟是可選的,要看初始設置步驟有沒有要求讀/寫數據(由SET事務的數據包階段發送的標准請求命令決定)。

    狀態信息步驟:這個步驟就是要獲取狀態信息,由IN或OUT事務構成的傳輸,但是要注意這里的IN和OUT事務和之前的INT和OUT事務有兩點不同:

    1) 傳輸方向相反,通常IN表示設備往主機送數據,OUT表示主機往設備送數據;在這里,IN表示主機往設備送數據,而OUT表示設備往主機送數據,這是為了和可選數據步驟相結合;

    2) 在這個步驟里,數據包階段的數據包都是0長度的,即SYNC+PID+CRC16。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM