USB技術淺析

《帶你遨遊USB世界》中,咱們已經初步介紹了USB的總體架構,本文將從如下幾個方面繼續介紹USB的內容。java

  • USB3.0有什麼新特性?linux

  • TYPEC介紹android

  • otg識別流程數據結構

1、USB3.0

USB是史上定義出的最成功的PC外圍互連技術,而且已經迅猛地被引入到CE和Mobile領域。僅僅在2006年,就有超過20億USB設備出產,而如今已經有超過60億的USB產品被安裝。架構

而隨着技術創新的不斷前進,新式設備,媒體格式,以及便宜的大容量存儲在不斷涌現。他們都要求更高的帶寬來維護用戶指望的用戶體驗。高清攝像機將會具備上百GB的存儲內容須要遷移到PC端供用戶編輯,查看以及打包存儲。現有的設備,如數碼相機繼續創新並增長其容量來容納更多的非壓縮圖像。從數碼相機裏下載上百甚至上千個10MB或者更大的原始圖片將會是一個十分耗時的過程,除非傳輸速率獲得提升。此外,用戶應用要求在PC和這些不斷複雜化的外設之間更高的鏈接帶寬。USB 3.0經過增長更高的傳輸速率來匹配這些新式應用和設備,從而解決這些需求。框架

目前市場上有大量在使用的我的電腦只支持USB 2.0。還有USB 2.0外圍設備使用數量較多。USB3.0須要保持向後兼容性。從硬件上來看,實際usb3.0和usb2.0已是兩種設備,在A型座的usb口上,咱們能明顯看到,usb2.0仍舊使用的是GND,D+,D-,VBUS。在3.0中則使用的是一對USB3_TX差分線,USB3_RX差分線,GND,BUS。因此在物理上咱們要明確,實際上USB2.0和USB3.0已經不是一個設備。雖然USB3.0仍然延續了大部分2.0的概念。異步

1.Usb3.0的通信流程

Usb3.0在框架層級是向後兼容USB 2.0的。在傳輸的類型上,仍舊是控制傳輸,中斷傳輸,批量傳輸,同步傳輸四種。然而,USB 2.0和超高速協議仍是有一些根本性的差別:大數據

1)USB 2.0使用三部分事務交易(令牌,數據和握手),而超高速對這相同的三部分的使用是不相同的。對於輸出(OUTs),令牌被列入數據包;而對於輸入(INs),令牌則被握手所取代。編碼

2)USB 2.0不支持突發(bursting)而超高速支持連續突發(continuous bursting)。視頻

3)USB 2.0是一個半雙工廣播(broadcast)總線,而超高速是雙重單工(dual-simplex)單播(unicast)總線,這就容許同時進行IN和OUT事務交易。

4)USB 2.0使用輪詢模型,而超高速使用異步通知。

5)USB 2.0沒有流(Streaming)的能力,而超高速支持對批量端點的流(Streaming)。

咱們來看一次IN傳輸:

主機和設備應遵照傳輸類型和端點特性的限制。主機經過發送一個確認包(IN)到設備發起一次傳輸。這個確認包包含了將包路由到預想的端點的尋址信息。主機告訴設備它能夠發送的數據包的數量,以及預計從設備接收到的第一個數據包的序列號。做爲迴應,端點會以適當的序列號發送數據包回主機。確認包還暗含地確認,之前的數據包被成功收到。

請注意,即便主機須要爲每一個接收到的數據包發送確認包,設備仍然能夠發送被請求數量的數據包,而沒必要等待任何確認包。

超高速輸入(IN)事務交易協議中以下圖所示。一個超高速總線上的輸入(IN)傳輸由一個或多個IN事務交易組成,並在出現下列任何狀況之一時完成:

1)全部的傳輸數據成功被接收。

2)端點用比端點的最大數據包大小要小的數據包響應。

3)端點回應一個錯誤。

image

Out 傳輸也相似:

image

從上面的模型咱們能夠看出,相比於usb2.0的輪詢式的發包,一方面usb3.0的異步發包模式明顯效率提升不少,能夠沒必要等待設備迴應,連續發包。另外一方面因爲usb3.0是點對點的發送數據,因此處在空閒的其餘usb設備能夠一直保持低功耗狀態,直到有數據到來。而在usb2.0的輪詢模式上,因爲每個設備都須要對總線上的地址作判斷,因此空閒設備沒法進入低功耗模式。

2.突發事務

超高速USB協議容許主機連續發送數據到設備,或者從設備連續接收數據,只要設備能夠接收或者發送數據。設備在無需中間確認包(intermediate acknowledgement packet)的狀況下能夠發送或者接收的包的個數,在該端點的端點伴侶描述符(endpoint companion descriptor)中報告。報告端點的maximum burst size多於一個包的端點被認爲是支持"突發"事務。

在進行突發傳送時,適用於下面的規則:

1)在接收一個確認包以前,一個突發中能夠發送的包個數的最大值,被限制爲:端點的最大突發的大小【maximum burst size】(和上一個被端點或主機接收到的ACK TP或ERDY的NumP字段值的最小值,減去端點或主機在被上一個ACK TP確認過的包以後已經發送的包的個數。注意,每當端點被初始化時,主機能夠從新將可以發送/接收的最大DPs的個數初始化爲端點最大突發的大小【maximum burst size】。

2)突發傳送中,每個獨立的包應該有數據包負載長度爲maximum packet size。只有突發的最後一個包能夠小於報告的maximum packet size。若是最後一個小一些,那麼對於短包的規則適用於在突發末尾的短包。

3)突發事務只要ACK TP的NumP字段沒被設爲0而且每一個包都有最大包大小的數據負載,就能夠繼續。

3. 流傳輸

流傳輸是bulk中的一種特殊模式,當設備的配置描述符在配置了 MaxStreams後,就表明設備可支持流傳輸。

image

上圖表明一個輸入批量管道,這裏創建起了大量的流(Streams)。在主機內存中與每一個流(Stream)相關的是一個或者多個端點緩衝區(Endpoint Buffers)來接收流數據(Stream data)。在設備端,也有一個相應的特定於命令或者功能的數據,會被傳輸到主機。

當設備有對特定的流可用的數據時(如圖中的G),它就用發送ERDY加上CStream ID做爲標籤,而且主機會開始發送加有CStream ID標籤的IN ACK TP到設備。設備會經過返回與CStream ID相關的功能數據,而且也是加上CStream ID爲標籤。當主機接收到數據,就用CStream ID來選擇一組端點緩衝區(Endpoint Buffers)用來接收數據。

當數據被耗盡,設備終結該流。主機也被容許終結流,若是它用完了端點緩衝區的話。流能夠被用來,例如,支持大容量設備(mass storage device)所須要的亂序(out-of-order)數據傳輸。

一個標準的批量端點有單組端點緩衝區(Endpoint Buffers)與之相關聯。流擴展了一個端點能夠訪問的主機緩衝區個數,從1直到65533。在主機緩衝區和Stream ID之間有一個1:1的映射。

因爲流是基於一個標準的批量管道運行,一個錯誤就會讓管道暫停(halt),中止全部的活動。

4. 伴侶描述符

USB3.0描述符與USB2.0基本相同,最主要的區別是每一個EP描述符後新增了一個伴侶描述符,用以代表上面所說的設備的「突發事務」和「流傳輸」的能力:

image

5.總結

總結來講USB3.0的最主要的新特性有這幾種:

  • 總線速度提升到5Gbps(gen2中提升到10Gbps)

  • 異步的傳輸模式

  • 突發事務,依賴於異步傳輸的模式,無需等待設備迴應

  • 流傳輸,依賴於忽然事務傳輸,能夠多對一的大量傳輸

這幾種新特性使得USB3.0的傳輸速率遠遠高於USB2.0

2、TYPEC

Typec是在usb3.0推出後,爲了兼容正反插,高功率充電,以及更強的兼容性而推出的新的硬件接口,最主要的特性爲

  • USB Power Delivery技術,最高可支持到20V5A的充電

  • 可集成DisplayPort,可外接屏幕與喇叭(例如能夠接入hdmi設備)

  • 抗干擾性,可靠性更強

母頭以下圖所示:

image

公頭以下圖所示:

image

能夠看到相比於普通的usb3.0 A座,typec多出了一組tx,rx,以及vconn和cc。其中具體使用狀況:

1)多出的tx,rx能夠在gen1或gen2中作usb多路輸出,可實現數據吞吐量翻倍,同時也能夠複用爲DisplayPort接口,使得typec能夠作視頻輸出

2)vconn爲typec有源線纜的e-mark供電,進一步能夠識別線材的供電能力

3)cc pin爲typec的核心功能,usb的主機和設備端能夠經過cc pin通信,以實現pd,dp以及主從模式的切換等各類功能

目前市面上有多種typec的實現方案,如高通是經過自帶的typec phy實現,也有獨立的typec芯片方案,如fusb302等,可是流程基本相似。

編碼格式:

pd3.0開始使用Biphase Mark Coding (BMC)編碼格式,這種編碼的特色就是,每個bit週期開始時電平會切換一次,在這個週期內電平若是不切換則表示bit0,若是電平切換了一次,則表明bit1

image

1.Power Delivery

目前市場上pd主要分爲兩種,一種是pd2.0,這種只提供幾個固定的電壓電流檔位,如常見的5V3A,9V3A,12V3A,15V3A,20V3A。另外一種是pd3.0,也就是pps,這種除了提供pd2.0的幾個電壓檔位以外,還會提供一個或多個電壓電流可調的檔位,如:可調電壓範圍3V~21V,可調電流0A~6.3A

其流程大概以下:

image

如下做爲一個例子:

image

2. DisplayPort

如前文中所述,typec擁有4對差分信號,上/下行各2對。USB-IF推出了一個Alternate Mode交替模式,支持將USB Type-C線纜轉化爲其餘用途,而DP交替模式就是第一個應用,它能夠將其中一些或者所有差分信號通道轉化爲DisplayPort信號通道,若是還有剩餘的差分信號,則能夠繼續用於USB 3.1高速數據傳輸。

有了DP交替模式,USB Type-C的實力將會大增,由於它讓平板電腦、筆記本產品經過一個迷你接口實現高速數據傳輸、視頻輸出、電力供應等功能,帶來相似手機那樣的「單接口、多功能」的可能性,這比以前經過USB接口輸出視頻信號的方案更增強大。

如下做爲一個例子:

image

3、USB3.0 OTG

在usb2.0時代,爲了知足移動設備單usb口既能夠爲主也能夠爲從的需求,出現了otg功能。Usb2.0的otg是經過micro或miniusb座子上的第5個id pin上的電平來完成識別,當id pin的電平爲高,則爲從機,當該電平爲低時,則爲主機。

咱們市面上買的otg線,內部電路就是把id pin與GND線相接,以實現otg線插入後,手機能夠做爲host端

在usb3.0中,id pin的功能一樣被強大的typec所取代,主從的識別將經過cc來識別。同時主從雙方也能夠經過cc的通信來切換角色。

在usb2.0中,供電方與受電方和設備的主從關係是綁定的,只有host能夠給devices供電。usb3.0中則徹底不一樣,二者徹底獨立,在作host的同時,依舊能夠接受供電。解決了「手機沒電時,就沒法插usb設備」的問題

同時在硬件上,咱們須要明確usb 3.0 otg的組成部分

  • usb控制器

控制器負責將處理通信中,數據的校驗,分發,異常處理等主要工做。在usb2.0中咱們有諸如「ehci,uhci,ohci,dwc2」等多個不一樣的控制器ip。其中ehci是同時兼容usb1.0,usb1.1,usb2.0等功能,而uhci,ohci則只能支持到1.1 。dwc2則是擁有otg功能的控制器

在usb3.0中,控制器則只剩了xhci,與dwc3,一樣的dwc3也是擁有otg功能。

  • usb phy

Usb phy主要負責實際的物理信號。將串行的usb數據轉換成控制器所須要的數據格式。同時,咱們usb信號質量也與phy有關,在必定程度上phy能夠改善usb眼圖,但主要仍是靠usb走線

  • typec phy

與usb phy功能相似,只不過處理的是cc pin上的信號。cc信號也能夠用獨立的芯片,如fusb302等芯片來處理。

1.EXTCON

External Connectors是usb用於狀態通知的驅動,當phy收到中斷,處理完usb狀態後,經過extcon驅動,廣播到已監聽該extcon的全部驅動

使用devm_extcon_register_notifier來註冊監聽usb狀態變化

使用devm_extcon_dev_register來註冊管理usb的狀態變化

如下host的識別做爲一個例子:

image

2.USB3.0 HOST

Usb3.0相比於usb2.0,在usb core層,驅動並無太大變化,仍舊與原來的流程相同,usb代碼的核心數據結構仍然是URB,URB的使用方法也與原來相同:

image

區別在於usb hcd以後的代碼,xhci中,核心的數據結構爲TRB,每一筆數據以一個trb來作交換,在xhci.c中xhci_urb_enqueue進一步判斷數據類型,並對stream id以及burst作判斷,並提交到控制器中

3. USB3.0 OTG

(1) ConfigFS

在《帶你遨遊USB世界》中,咱們介紹了android.c的gadget配置方式,在早期時,linux的gadget驅動都是固定功能,即開機後usb功能就已固定,沒法改變。而這樣的功能,明顯沒法知足移動設備對於otg功能的需求,所以android推出了android.c和composite.c的複合功能的gadget驅動。

再此以後,android.c的方式沿用了好久,直到linux更新了新的gadget驅動----configfs子系統,知足了移動端的全部需求。相比於android.c,configfs更加靈活,所以替代了android.c。

在新的linux代碼中,configfs基本替代了android.c,所以咱們對configfs作必定的介紹

啓動流程:

image

啓動後,上層UsbDeviceManager.java經過setprop sys.usb.config的屬性來控制gadget功能,例如:

image

這其中每一個綁定的功能都應gadget中的一個驅動,如mtp對應drivers/usb/gadget/function/f_mtp.c

(2) OTG枚舉流程

流程圖以下

image

Configfs子系統與控制器之間的數據交換是經過struct usb_request *request結構體,一次完整的流程以下:

image

相關文章
相關標籤/搜索