USB技術(shù)淺析
一、USB3.0
USB是史上定義出的最成功的PC外圍互連技術(shù),并且已經(jīng)迅猛地被引入到CE和Mobile領(lǐng)域。僅僅在2006年,就有超過20億USB設(shè)備出產(chǎn),而現(xiàn)在已經(jīng)有超過60億的USB產(chǎn)品被安裝。
而隨著技術(shù)創(chuàng)新的不斷前進(jìn),新式設(shè)備,媒體格式,以及便宜的大容量存儲在不斷涌現(xiàn)。他們都要求更高的帶寬來維護(hù)用戶期望的用戶體驗(yàn)。高清攝像機(jī)將會具有上百GB的存儲內(nèi)容需要遷移到PC端供用戶編輯,查看以及打包存儲?,F(xiàn)有的設(shè)備,如數(shù)碼相機(jī)繼續(xù)創(chuàng)新并增加其容量來容納更多的非壓縮圖像。從數(shù)碼相機(jī)里下載上百甚至上千個10MB或者更大的原始圖片將會是一個十分耗時的過程,除非傳輸速率得到提高。此外,用戶應(yīng)用要求在PC和這些不斷復(fù)雜化的外設(shè)之間更高的連接帶寬。USB 3.0通過增加更高的傳輸速率來匹配這些新式應(yīng)用和設(shè)備,從而解決這些需求。
目前市場上有大量在使用的個人電腦只支持USB 2.0。還有USB 2.0外圍設(shè)備使用數(shù)量較多。USB3.0需要保持向后兼容性。從硬件上來看,實(shí)際usb3.0和usb2.0已經(jīng)是兩種設(shè)備,在A型座的usb口上,我們能明顯看到,usb2.0仍舊使用的是GND,D+,D-,VBUS。在3.0中則使用的是一對USB3_TX差分線,USB3_RX差分線,GND,BUS。所以在物理上我們要明確,實(shí)際上USB2.0和USB3.0已經(jīng)不是一個設(shè)備。雖然USB3.0仍然延續(xù)了大部分2.0的概念。

1.Usb3.0的通訊流程
Usb3.0在框架層級是向后兼容USB 2.0的。在傳輸?shù)念愋蜕?,仍舊是控制傳輸,中斷傳輸,批量傳輸,同步傳輸四種。然而,USB 2.0和超高速協(xié)議還是有一些根本性的差異:
1)USB 2.0使用三部分事務(wù)交易(令牌,數(shù)據(jù)和握手),而超高速對這相同的三部分的使用是不相同的。對于輸出(OUTs),令牌被列入數(shù)據(jù)包;而對于輸入(INs),令牌則被握手所取代。
2)USB 2.0不支持突發(fā)(bursting)而超高速支持連續(xù)突發(fā)(continuous bursting)。
3)USB 2.0是一個半雙工廣播(broadcast)總線,而超高速是雙重單工(dual-simplex)單播(unicast)總線,這就允許同時進(jìn)行IN和OUT事務(wù)交易。
4)USB 2.0使用輪詢模型,而超高速使用異步通知。
5)USB 2.0沒有流(Streaming)的能力,而超高速支持對批量端點(diǎn)的流(Streaming)。
我們來看一次IN傳輸:
主機(jī)和設(shè)備應(yīng)遵守傳輸類型和端點(diǎn)特性的限制。主機(jī)通過發(fā)送一個確認(rèn)包(IN)到設(shè)備發(fā)起一次傳輸。這個確認(rèn)包包含了將包路由到預(yù)想的端點(diǎn)的尋址信息。主機(jī)告訴設(shè)備它可以發(fā)送的數(shù)據(jù)包的數(shù)量,以及預(yù)計從設(shè)備接收到的第一個數(shù)據(jù)包的序列號。作為回應(yīng),端點(diǎn)會以適當(dāng)?shù)男蛄刑柊l(fā)送數(shù)據(jù)包回主機(jī)。確認(rèn)包還暗含地確認(rèn),以前的數(shù)據(jù)包被成功收到。
請注意,即使主機(jī)需要為每個接收到的數(shù)據(jù)包發(fā)送確認(rèn)包,設(shè)備仍然可以發(fā)送被請求數(shù)量的數(shù)據(jù)包,而不必等待任何確認(rèn)包。
超高速輸入(IN)事務(wù)交易協(xié)議中如下圖所示。一個超高速總線上的輸入(IN)傳輸由一個或多個IN事務(wù)交易組成,并在出現(xiàn)下列任何情況之一時完成:
1)所有的傳輸數(shù)據(jù)成功被接收。
2)端點(diǎn)用比端點(diǎn)的最大數(shù)據(jù)包大小要小的數(shù)據(jù)包響應(yīng)。
3)端點(diǎn)回應(yīng)一個錯誤。

Out 傳輸也類似:

從上面的模型我們可以看出,相比于usb2.0的輪詢式的發(fā)包,一方面usb3.0的異步發(fā)包模式明顯效率提高很多,可以不必等待設(shè)備回應(yīng),連續(xù)發(fā)包。另一方面由于usb3.0是點(diǎn)對點(diǎn)的發(fā)送數(shù)據(jù),所以處在空閑的其他usb設(shè)備可以一直保持低功耗狀態(tài),直到有數(shù)據(jù)到來。而在usb2.0的輪詢模式上,由于每一個設(shè)備都需要對總線上的地址做判斷,所以空閑設(shè)備無法進(jìn)入低功耗模式。
2.突發(fā)事務(wù)
超高速USB協(xié)議允許主機(jī)連續(xù)發(fā)送數(shù)據(jù)到設(shè)備,或者從設(shè)備連續(xù)接收數(shù)據(jù),只要設(shè)備可以接收或者發(fā)送數(shù)據(jù)。設(shè)備在無需中間確認(rèn)包(intermediate acknowledgement packet)的情況下可以發(fā)送或者接收的包的個數(shù),在該端點(diǎn)的端點(diǎn)伴侶描述符(endpoint companion descriptor)中報告。報告端點(diǎn)的maximum burst size多于一個包的端點(diǎn)被認(rèn)為是支持"突發(fā)"事務(wù)。
在進(jìn)行突發(fā)傳送時,適用于下面的規(guī)則:
1)在接收一個確認(rèn)包之前,一個突發(fā)中可以發(fā)送的包個數(shù)的最大值,被限制為:端點(diǎn)的最大突發(fā)的大小【maximum burst size】(和上一個被端點(diǎn)或主機(jī)接收到的ACK TP或ERDY的NumP字段值的最小值,減去端點(diǎn)或主機(jī)在被上一個ACK TP確認(rèn)過的包之后已經(jīng)發(fā)送的包的個數(shù)。注意,每當(dāng)端點(diǎn)被初始化時,主機(jī)可以重新將能夠發(fā)送/接收的最大DPs的個數(shù)初始化為端點(diǎn)最大突發(fā)的大小【maximum burst size】。
2)突發(fā)傳送中,每一個獨(dú)立的包應(yīng)該有數(shù)據(jù)包負(fù)載長度為maximum packet size。只有突發(fā)的最后一個包可以小于報告的maximum packet size。如果最后一個小一些,那么對于短包的規(guī)則適用于在突發(fā)末尾的短包。
3)突發(fā)事務(wù)只要ACK TP的NumP字段沒被設(shè)為0并且每個包都有最大包大小的數(shù)據(jù)負(fù)載,就可以繼續(xù)。
3.流傳輸
流傳輸是bulk中的一種特殊模式,當(dāng)設(shè)備的配置描述符在配置了 MaxStreams后,就代表設(shè)備可支持流傳輸。

上圖代表一個輸入批量管道,這里建立起了大量的流(Streams)。在主機(jī)內(nèi)存中與每個流(Stream)相關(guān)的是一個或者多個端點(diǎn)緩沖區(qū)(Endpoint Buffers)來接收流數(shù)據(jù)(Stream data)。在設(shè)備端,也有一個相應(yīng)的特定于命令或者功能的數(shù)據(jù),會被傳輸?shù)街鳈C(jī)。
當(dāng)設(shè)備有對特定的流可用的數(shù)據(jù)時(如圖中的G),它就用發(fā)送ERDY加上CStream ID作為標(biāo)簽,并且主機(jī)會開始發(fā)送加有CStream ID標(biāo)簽的IN ACK TP到設(shè)備。設(shè)備會通過返回與CStream ID相關(guān)的功能數(shù)據(jù),并且也是加上CStream ID為標(biāo)簽。當(dāng)主機(jī)接收到數(shù)據(jù),就用CStream ID來選擇一組端點(diǎn)緩沖區(qū)(Endpoint Buffers)用來接收數(shù)據(jù)。
當(dāng)數(shù)據(jù)被耗盡,設(shè)備終結(jié)該流。主機(jī)也被允許終結(jié)流,如果它用完了端點(diǎn)緩沖區(qū)的話。流可以被用來,例如,支持大容量設(shè)備(mass storage device)所需要的亂序(out-of-order)數(shù)據(jù)傳輸。
一個標(biāo)準(zhǔn)的批量端點(diǎn)有單組端點(diǎn)緩沖區(qū)(Endpoint Buffers)與之相關(guān)聯(lián)。流擴(kuò)展了一個端點(diǎn)可以訪問的主機(jī)緩沖區(qū)個數(shù),從1直到65533。在主機(jī)緩沖區(qū)和Stream ID之間有一個1:1的映射。
由于流是基于一個標(biāo)準(zhǔn)的批量管道運(yùn)行,一個錯誤就會讓管道暫停(halt),停止所有的活動。
4.伴侶描述符
USB3.0描述符與USB2.0基本相同,最主要的區(qū)別是每個EP描述符后新增了一個伴侶描述符,用以表明上面所說的設(shè)備的“突發(fā)事務(wù)”和“流傳輸”的能力:

5.總結(jié)
總結(jié)來說USB3.0的最主要的新特性有這幾種:
總線速度提高到5Gbps(gen2中提高到10Gbps)
異步的傳輸模式
突發(fā)事務(wù),依賴于異步傳輸?shù)哪J?,無需等待設(shè)備回應(yīng)
流傳輸,依賴于突然事務(wù)傳輸,可以多對一的大量傳輸
這幾種新特性使得USB3.0的傳輸速率遠(yuǎn)遠(yuǎn)高于USB2.0
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ??


二、TYPEC
Typec是在usb3.0推出后,為了兼容正反插,高功率充電,以及更強(qiáng)的兼容性而推出的新的硬件接口,最主要的特性為
USB Power Delivery技術(shù),最高可支持到20V5A的充電
可集成DisplayPort,可外接屏幕與喇叭(例如可以接入hdmi設(shè)備)
抗干擾性,可靠性更強(qiáng)
母頭如下圖所示:

公頭如下圖所示:

可以看到相比于普通的usb3.0 A座,typec多出了一組tx,rx,以及vconn和cc。其中具體使用情況:
1)多出的tx,rx可以在gen1或gen2中做usb多路輸出,可實(shí)現(xiàn)數(shù)據(jù)吞吐量翻倍,同時也可以復(fù)用為DisplayPort接口,使得typec可以做視頻輸出
2)vconn為typec有源線纜的e-mark供電,進(jìn)一步可以識別線材的供電能力
3)cc pin為typec的核心功能,usb的主機(jī)和設(shè)備端可以通過cc pin通訊,以實(shí)現(xiàn)pd,dp以及主從模式的切換等各種功能
目前市面上有多種typec的實(shí)現(xiàn)方案,如高通是通過自帶的typec phy實(shí)現(xiàn),也有獨(dú)立的typec芯片方案,如fusb302等,但是流程基本類似。
編碼格式:
pd3.0開始使用Biphase Mark Coding (BMC)編碼格式,這種編碼的特點(diǎn)就是,每一個bit周期開始時電平會切換一次,在這個周期內(nèi)電平如果不切換則表示bit0,如果電平切換了一次,則代表bit1

1.Power Delivery
目前市場上pd主要分為兩種,一種是pd2.0,這種只提供幾個固定的電壓電流檔位,如常見的5V3A,9V3A,12V3A,15V3A,20V3A。另一種是pd3.0,也就是pps,這種除了提供pd2.0的幾個電壓檔位之外,還會提供一個或多個電壓電流可調(diào)的檔位,如:可調(diào)電壓范圍3V~21V,可調(diào)電流0A~6.3A
其流程大概如下:

以下作為一個例子:

2.DisplayPort
如前文中所述,typec擁有4對差分信號,上/下行各2對。USB-IF推出了一個Alternate Mode交替模式,支持將USB Type-C線纜轉(zhuǎn)化為其他用途,而DP交替模式就是第一個應(yīng)用,它可以將其中一些或者全部差分信號通道轉(zhuǎn)化為DisplayPort信號通道,如果還有剩余的差分信號,則可以繼續(xù)用于USB 3.1高速數(shù)據(jù)傳輸。
有了DP交替模式,USB Type-C的實(shí)力將會大增,因?yàn)樗屍桨咫娔X、筆記本產(chǎn)品通過一個迷你接口實(shí)現(xiàn)高速數(shù)據(jù)傳輸、視頻輸出、電力供應(yīng)等功能,帶來類似手機(jī)那樣的“單接口、多功能”的可能性,這比之前通過USB接口輸出視頻信號的方案更加強(qiáng)大。
以下作為一個例子:

三、USB3.0 OTG
在usb2.0時代,為了滿足移動設(shè)備單usb口既可以為主也可以為從的需求,出現(xiàn)了otg功能。Usb2.0的otg是通過micro或miniusb座子上的第5個id pin上的電平來完成識別,當(dāng)id pin的電平為高,則為從機(jī),當(dāng)該電平為低時,則為主機(jī)。
我們市面上買的otg線,內(nèi)部電路就是把id pin與GND線相接,以實(shí)現(xiàn)otg線插入后,手機(jī)可以作為host端
在usb3.0中,id pin的功能同樣被強(qiáng)大的typec所取代,主從的識別將通過cc來識別。同時主從雙方也可以通過cc的通訊來切換角色。
在usb2.0中,供電方與受電方和設(shè)備的主從關(guān)系是綁定的,只有host可以給devices供電。usb3.0中則完全不同,兩者完全獨(dú)立,在做host的同時,依舊可以接受供電。解決了“手機(jī)沒電時,就無法插usb設(shè)備”的問題
同時在硬件上,我們需要明確usb 3.0 otg的組成部分
usb控制器
控制器負(fù)責(zé)將處理通訊中,數(shù)據(jù)的校驗(yàn),分發(fā),異常處理等主要工作。在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主要負(fù)責(zé)實(shí)際的物理信號。將串行的usb數(shù)據(jù)轉(zhuǎn)換成控制器所需要的數(shù)據(jù)格式。同時,我們usb信號質(zhì)量也與phy有關(guān),在一定程度上phy可以改善usb眼圖,但主要還是靠usb走線
typec phy
與usb phy功能類似,只不過處理的是cc pin上的信號。cc信號也可以用獨(dú)立的芯片,如fusb302等芯片來處理。
1.EXTCON
External Connectors是usb用于狀態(tài)通知的驅(qū)動,當(dāng)phy收到中斷,處理完usb狀態(tài)后,通過extcon驅(qū)動,廣播到已監(jiān)聽該extcon的所有驅(qū)動
使用devm_extcon_register_notifier來注冊監(jiān)聽usb狀態(tài)變化
使用devm_extcon_dev_register來注冊管理usb的狀態(tài)變化
以下host的識別作為一個例子:

2.USB3.0 HOST
Usb3.0相比于usb2.0,在usb core層,驅(qū)動并沒有太大變化,仍舊與原來的流程相同,usb代碼的核心數(shù)據(jù)結(jié)構(gòu)仍然是URB,URB的使用方法也與原來相同:

區(qū)別在于usb hcd之后的代碼,xhci中,核心的數(shù)據(jù)結(jié)構(gòu)為TRB,每一筆數(shù)據(jù)以一個trb來做交換,在xhci.c中xhci_urb_enqueue進(jìn)一步判斷數(shù)據(jù)類型,并對stream id以及burst做判斷,并提交到控制器中
3. USB3.0 OTG
(1) ConfigFS
在《帶你遨游USB世界》中,我們介紹了android.c的gadget配置方式,在早期時,linux的gadget驅(qū)動都是固定功能,即開機(jī)后usb功能就已固定,無法改變。而這樣的功能,明顯無法滿足移動設(shè)備對于otg功能的需求,因此android推出了android.c和composite.c的復(fù)合功能的gadget驅(qū)動。
再此之后,android.c的方式沿用了很久,直到linux更新了新的gadget驅(qū)動----configfs子系統(tǒng),滿足了移動端的所有需求。相比于android.c,configfs更加靈活,因此替代了android.c。
在新的linux代碼中,configfs基本替代了android.c,因此我們對configfs做一定的介紹
啟動流程:

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

這其中每個綁定的功能都應(yīng)gadget中的一個驅(qū)動,如mtp對應(yīng)drivers/usb/gadget/function/f_mtp.c
(2)OTG枚舉流程
流程圖如下

Configfs子系統(tǒng)與控制器之間的數(shù)據(jù)交換是通過struct usb_request *request結(jié)構(gòu)體,一次完整的流程如下:

原文作者:內(nèi)核工匠
