《帶你遨游USB世界》中,我們已經(jīng)初步介紹了USB的整體架構(gòu),本文將從以下幾個(gè)方面繼續(xù)介紹USB的內(nèi)容。
- USB3.0有什么新特性?
- TYPEC介紹
- otg識(shí)別流程
一、USB3.0
USB是史上定義出的最成功的PC外圍互連技術(shù),并且已經(jīng)迅猛地被引入到CE和Mobile領(lǐng)域。僅僅在2006年,就有超過(guò)20億USB設(shè)備出產(chǎn),而現(xiàn)在已經(jīng)有超過(guò)60億的USB產(chǎn)品被安裝。
而隨著技術(shù)創(chuàng)新的不斷前進(jìn),新式設(shè)備,媒體格式,以及便宜的大容量存儲(chǔ)在不斷涌現(xiàn)。他們都要求更高的帶寬來(lái)維護(hù)用戶期望的用戶體驗(yàn)。高清攝像機(jī)將會(huì)具有上百GB的存儲(chǔ)內(nèi)容需要遷移到PC端供用戶編輯,查看以及打包存儲(chǔ)。現(xiàn)有的設(shè)備,如數(shù)碼相機(jī)繼續(xù)創(chuàng)新并增加其容量來(lái)容納更多的非壓縮圖像。從數(shù)碼相機(jī)里下載上百甚至上千個(gè)10MB或者更大的原始圖片將會(huì)是一個(gè)十分耗時(shí)的過(guò)程,除非傳輸速率得到提高。此外,用戶應(yīng)用要求在PC和這些不斷復(fù)雜化的外設(shè)之間更高的連接帶寬。USB 3.0通過(guò)增加更高的傳輸速率來(lái)匹配這些新式應(yīng)用和設(shè)備,從而解決這些需求。
目前市場(chǎng)上有大量在使用的個(gè)人電腦只支持USB 2.0。還有USB 2.0外圍設(shè)備使用數(shù)量較多。USB3.0需要保持向后兼容性。從硬件上來(lái)看,實(shí)際usb3.0和usb2.0已經(jīng)是兩種設(shè)備,在A型座的usb口上,我們能明顯看到,usb2.0仍舊使用的是GND,D+,D-,VBUS。在3.0中則使用的是一對(duì)USB3_TX差分線,USB3_RX差分線,GND,BUS。所以在物理上我們要明確,實(shí)際上USB2.0和USB3.0已經(jīng)不是一個(gè)設(shè)備。雖然USB3.0仍然延續(xù)了大部分2.0的概念。
1.Usb3.0的通訊流程
Usb3.0在框架層級(jí)是向后兼容USB 2.0的。在傳輸?shù)念愋蜕希耘f是控制傳輸,中斷傳輸,批量傳輸,同步傳輸四種。然而,USB 2.0和超高速協(xié)議還是有一些根本性的差異:
1)USB 2.0使用三部分事務(wù)交易(令牌,數(shù)據(jù)和握手),而超高速對(duì)這相同的三部分的使用是不相同的。對(duì)于輸出(OUTs),令牌被列入數(shù)據(jù)包;而對(duì)于輸入(INs),令牌則被握手所取代。
2)USB 2.0不支持突發(fā)(bursting)而超高速支持連續(xù)突發(fā)(continuous bursting)。
3)USB 2.0是一個(gè)半雙工廣播(broadcast)總線,而超高速是雙重單工(dual-simplex)單播(unicast)總線,這就允許同時(shí)進(jìn)行IN和OUT事務(wù)交易。
4)USB 2.0使用輪詢模型,而超高速使用異步通知。
5)USB 2.0沒有流(Streaming)的能力,而超高速支持對(duì)批量端點(diǎn)的流(Streaming)。
我們來(lái)看一次IN傳輸:
主機(jī)和設(shè)備應(yīng)遵守傳輸類型和端點(diǎn)特性的限制。主機(jī)通過(guò)發(fā)送一個(gè)確認(rèn)包(IN)到設(shè)備發(fā)起一次傳輸。這個(gè)確認(rèn)包包含了將包路由到預(yù)想的端點(diǎn)的尋址信息。主機(jī)告訴設(shè)備它可以發(fā)送的數(shù)據(jù)包的數(shù)量,以及預(yù)計(jì)從設(shè)備接收到的第一個(gè)數(shù)據(jù)包的序列號(hào)。作為回應(yīng),端點(diǎn)會(huì)以適當(dāng)?shù)男蛄刑?hào)發(fā)送數(shù)據(jù)包回主機(jī)。確認(rèn)包還暗含地確認(rèn),以前的數(shù)據(jù)包被成功收到。
請(qǐng)注意,即使主機(jī)需要為每個(gè)接收到的數(shù)據(jù)包發(fā)送確認(rèn)包,設(shè)備仍然可以發(fā)送被請(qǐng)求數(shù)量的數(shù)據(jù)包,而不必等待任何確認(rèn)包。
超高速輸入(IN)事務(wù)交易協(xié)議中如下圖所示。一個(gè)超高速總線上的輸入(IN)傳輸由一個(gè)或多個(gè)IN事務(wù)交易組成,并在出現(xiàn)下列任何情況之一時(shí)完成:
1)所有的傳輸數(shù)據(jù)成功被接收。
2)端點(diǎn)用比端點(diǎn)的最大數(shù)據(jù)包大小要小的數(shù)據(jù)包響應(yīng)。
3)端點(diǎn)回應(yīng)一個(gè)錯(cuò)誤。
Out 傳輸也類似:
從上面的模型我們可以看出,相比于usb2.0的輪詢式的發(fā)包,一方面usb3.0的異步發(fā)包模式明顯效率提高很多,可以不必等待設(shè)備回應(yīng),連續(xù)發(fā)包。另一方面由于usb3.0是點(diǎn)對(duì)點(diǎn)的發(fā)送數(shù)據(jù),所以處在空閑的其他usb設(shè)備可以一直保持低功耗狀態(tài),直到有數(shù)據(jù)到來(lái)。而在usb2.0的輪詢模式上,由于每一個(gè)設(shè)備都需要對(duì)總線上的地址做判斷,所以空閑設(shè)備無(wú)法進(jìn)入低功耗模式。
2.突發(fā)事務(wù)
超高速USB協(xié)議允許主機(jī)連續(xù)發(fā)送數(shù)據(jù)到設(shè)備,或者從設(shè)備連續(xù)接收數(shù)據(jù),只要設(shè)備可以接收或者發(fā)送數(shù)據(jù)。設(shè)備在無(wú)需中間確認(rèn)包(intermediate acknowledgement packet)的情況下可以發(fā)送或者接收的包的個(gè)數(shù),在該端點(diǎn)的端點(diǎn)伴侶描述符(endpoint companion descriptor)中報(bào)告。報(bào)告端點(diǎn)的maximum burst size多于一個(gè)包的端點(diǎn)被認(rèn)為是支持"突發(fā)"事務(wù)。
在進(jìn)行突發(fā)傳送時(shí),適用于下面的規(guī)則:
1)在接收一個(gè)確認(rèn)包之前,一個(gè)突發(fā)中可以發(fā)送的包個(gè)數(shù)的最大值,被限制為:端點(diǎn)的最大突發(fā)的大小【maximum burst size】(和上一個(gè)被端點(diǎn)或主機(jī)接收到的ACK TP或ERDY的NumP字段值的最小值,減去端點(diǎn)或主機(jī)在被上一個(gè)ACK TP確認(rèn)過(guò)的包之后已經(jīng)發(fā)送的包的個(gè)數(shù)。注意,每當(dāng)端點(diǎn)被初始化時(shí),主機(jī)可以重新將能夠發(fā)送/接收的最大DPs的個(gè)數(shù)初始化為端點(diǎn)最大突發(fā)的大小【maximum burst size】。
2)突發(fā)傳送中,每一個(gè)獨(dú)立的包應(yīng)該有數(shù)據(jù)包負(fù)載長(zhǎng)度為maximum packet size。只有突發(fā)的最后一個(gè)包可以小于報(bào)告的maximum packet size。如果最后一個(gè)小一些,那么對(duì)于短包的規(guī)則適用于在突發(fā)末尾的短包。
3)突發(fā)事務(wù)只要ACK TP的NumP字段沒被設(shè)為0并且每個(gè)包都有最大包大小的數(shù)據(jù)負(fù)載,就可以繼續(xù)。
3. 流傳輸
流傳輸是bulk中的一種特殊模式,當(dāng)設(shè)備的配置描述符在配置了 MaxStreams后,就代表設(shè)備可支持流傳輸。
上圖代表一個(gè)輸入批量管道,這里建立起了大量的流(Streams)。在主機(jī)內(nèi)存中與每個(gè)流(Stream)相關(guān)的是一個(gè)或者多個(gè)端點(diǎn)緩沖區(qū)(Endpoint Buffers)來(lái)接收流數(shù)據(jù)(Stream data)。在設(shè)備端,也有一個(gè)相應(yīng)的特定于命令或者功能的數(shù)據(jù),會(huì)被傳輸?shù)街鳈C(jī)。
當(dāng)設(shè)備有對(duì)特定的流可用的數(shù)據(jù)時(shí)(如圖中的G),它就用發(fā)送ERDY加上CStream ID作為標(biāo)簽,并且主機(jī)會(huì)開始發(fā)送加有CStream ID標(biāo)簽的IN ACK TP到設(shè)備。設(shè)備會(huì)通過(guò)返回與CStream ID相關(guān)的功能數(shù)據(jù),并且也是加上CStream ID為標(biāo)簽。當(dāng)主機(jī)接收到數(shù)據(jù),就用CStream ID來(lái)選擇一組端點(diǎn)緩沖區(qū)(Endpoint Buffers)用來(lái)接收數(shù)據(jù)。
當(dāng)數(shù)據(jù)被耗盡,設(shè)備終結(jié)該流。主機(jī)也被允許終結(jié)流,如果它用完了端點(diǎn)緩沖區(qū)的話。流可以被用來(lái),例如,支持大容量設(shè)備(mass storage device)所需要的亂序(out-of-order)數(shù)據(jù)傳輸。
一個(gè)標(biāo)準(zhǔn)的批量端點(diǎn)有單組端點(diǎn)緩沖區(qū)(Endpoint Buffers)與之相關(guān)聯(lián)。流擴(kuò)展了一個(gè)端點(diǎn)可以訪問(wèn)的主機(jī)緩沖區(qū)個(gè)數(shù),從1直到65533。在主機(jī)緩沖區(qū)和Stream ID之間有一個(gè)1:1的映射。
由于流是基于一個(gè)標(biāo)準(zhǔn)的批量管道運(yùn)行,一個(gè)錯(cuò)誤就會(huì)讓管道暫停(halt),停止所有的活動(dòng)。
4. 伴侶描述符
USB3.0描述符與USB2.0基本相同,最主要的區(qū)別是每個(gè)EP描述符后新增了一個(gè)伴侶描述符,用以表明上面所說(shuō)的設(shè)備的“突發(fā)事務(wù)”和“流傳輸”的能力:
5.總結(jié)
總結(jié)來(lái)說(shuō)USB3.0的最主要的新特性有這幾種:
- 總線速度提高到5Gbps(gen2中提高到10Gbps)
- 異步的傳輸模式
- 突發(fā)事務(wù),依賴于異步傳輸?shù)哪J剑瑹o(wú)需等待設(shè)備回應(yīng)
- 流傳輸,依賴于突然事務(wù)傳輸,可以多對(duì)一的大量傳輸
這幾種新特性使得USB3.0的傳輸速率遠(yuǎn)遠(yuǎn)高于USB2.0
二、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ù)吞吐量翻倍,同時(shí)也可以復(fù)用為DisplayPort接口,使得typec可以做視頻輸出
2)vconn為typec有源線纜的e-mark供電,進(jìn)一步可以識(shí)別線材的供電能力
3)cc pin為typec的核心功能,usb的主機(jī)和設(shè)備端可以通過(guò)cc pin通訊,以實(shí)現(xiàn)pd,dp以及主從模式的切換等各種功能
目前市面上有多種typec的實(shí)現(xiàn)方案,如高通是通過(guò)自帶的typec phy實(shí)現(xiàn),也有獨(dú)立的typec芯片方案,如fusb302等,但是流程基本類似。
編碼格式:
pd3.0開始使用Biphase Mark Coding (BMC)編碼格式,這種編碼的特點(diǎn)就是,每一個(gè)bit周期開始時(shí)電平會(huì)切換一次,在這個(gè)周期內(nèi)電平如果不切換則表示bit0,如果電平切換了一次,則代表bit1
1.Power Delivery
目前市場(chǎng)上pd主要分為兩種,一種是pd2.0,這種只提供幾個(gè)固定的電壓電流檔位,如常見的5V3A,9V3A,12V3A,15V3A,20V3A。另一種是pd3.0,也就是pps,這種除了提供pd2.0的幾個(gè)電壓檔位之外,還會(huì)提供一個(gè)或多個(gè)電壓電流可調(diào)的檔位,如:可調(diào)電壓范圍3V21V,可調(diào)電流0A6.3A
其流程大概如下:
以下作為一個(gè)例子:
2. DisplayPort
如前文中所述,typec擁有4對(duì)差分信號(hào),上/下行各2對(duì)。USB-IF推出了一個(gè)Alternate Mode交替模式,支持將USB Type-C線纜轉(zhuǎn)化為其他用途,而DP交替模式就是第一個(gè)應(yīng)用,它可以將其中一些或者全部差分信號(hào)通道轉(zhuǎn)化為DisplayPort信號(hào)通道,如果還有剩余的差分信號(hào),則可以繼續(xù)用于USB 3.1高速數(shù)據(jù)傳輸。
有了DP交替模式,USB Type-C的實(shí)力將會(huì)大增,因?yàn)樗屍桨咫娔X、筆記本產(chǎn)品通過(guò)一個(gè)迷你接口實(shí)現(xiàn)高速數(shù)據(jù)傳輸、視頻輸出、電力供應(yīng)等功能,帶來(lái)類似手機(jī)那樣的“單接口、多功能”的可能性,這比之前通過(guò)USB接口輸出視頻信號(hào)的方案更加強(qiáng)大。
以下作為一個(gè)例子:
三、USB3.0 OTG
在usb2.0時(shí)代,為了滿足移動(dòng)設(shè)備單usb口既可以為主也可以為從的需求,出現(xiàn)了otg功能。Usb2.0的otg是通過(guò)micro或miniusb座子上的第5個(gè)id pin上的電平來(lái)完成識(shí)別,當(dāng)id pin的電平為高,則為從機(jī),當(dāng)該電平為低時(shí),則為主機(jī)。
我們市面上買的otg線,內(nèi)部電路就是把id pin與GND線相接,以實(shí)現(xiàn)otg線插入后,手機(jī)可以作為host端
在usb3.0中,id pin的功能同樣被強(qiáng)大的typec所取代,主從的識(shí)別將通過(guò)cc來(lái)識(shí)別。同時(shí)主從雙方也可以通過(guò)cc的通訊來(lái)切換角色。
在usb2.0中,供電方與受電方和設(shè)備的主從關(guān)系是綁定的,只有host可以給devices供電。usb3.0中則完全不同,兩者完全獨(dú)立,在做host的同時(shí),依舊可以接受供電。解決了“手機(jī)沒電時(shí),就無(wú)法插usb設(shè)備”的問(wèn)題
同時(shí)在硬件上,我們需要明確usb 3.0 otg的組成部分
- usb控制器
控制器負(fù)責(zé)將處理通訊中,數(shù)據(jù)的校驗(yàn),分發(fā),異常處理等主要工作。在usb2.0中我們有諸如“ehci,uhci,ohci,dwc2”等多個(gè)不同的控制器ip。其中ehci是同時(shí)兼容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í)際的物理信號(hào)。將串行的usb數(shù)據(jù)轉(zhuǎn)換成控制器所需要的數(shù)據(jù)格式。同時(shí),我們usb信號(hào)質(zhì)量也與phy有關(guān),在一定程度上phy可以改善usb眼圖,但主要還是靠usb走線
- typec phy
與usb phy功能類似,只不過(guò)處理的是cc pin上的信號(hào)。cc信號(hào)也可以用獨(dú)立的芯片,如fusb302等芯片來(lái)處理。
1.EXTCON
External Connectors是usb用于狀態(tài)通知的驅(qū)動(dòng),當(dāng)phy收到中斷,處理完usb狀態(tài)后,通過(guò)extcon驅(qū)動(dòng),廣播到已監(jiān)聽該extcon的所有驅(qū)動(dòng)
使用devm_extcon_register_notifier來(lái)注冊(cè)監(jiān)聽usb狀態(tài)變化
使用devm_extcon_dev_register來(lái)注冊(cè)管理usb的狀態(tài)變化
以下host的識(shí)別作為一個(gè)例子:
2.USB3.0 HOST
Usb3.0相比于usb2.0,在usb core層,驅(qū)動(dòng)并沒有太大變化,仍舊與原來(lái)的流程相同,usb代碼的核心數(shù)據(jù)結(jié)構(gòu)仍然是URB,URB的使用方法也與原來(lái)相同:
區(qū)別在于usb hcd之后的代碼,xhci中,核心的數(shù)據(jù)結(jié)構(gòu)為TRB,每一筆數(shù)據(jù)以一個(gè)trb來(lái)做交換,在xhci.c中xhci_urb_enqueue進(jìn)一步判斷數(shù)據(jù)類型,并對(duì)stream id以及burst做判斷,并提交到控制器中
3. USB3.0 OTG
(1) ConfigFS
在《帶你遨游USB世界》中,我們介紹了Android.c的gadget配置方式,在早期時(shí),linux的gadget驅(qū)動(dòng)都是固定功能,即開機(jī)后usb功能就已固定,無(wú)法改變。而這樣的功能,明顯無(wú)法滿足移動(dòng)設(shè)備對(duì)于otg功能的需求,因此android推出了android.c和composite.c的復(fù)合功能的gadget驅(qū)動(dòng)。
在此之后,android.c的方式沿用了很久,直到linux更新了新的gadget驅(qū)動(dòng)----configfs子系統(tǒng),滿足了移動(dòng)端的所有需求。相比于android.c,configfs更加靈活,因此替代了android.c。
在新的linux代碼中,configfs基本替代了android.c,因此我們對(duì)configfs做一定的介紹
啟動(dòng)流程:
啟動(dòng)后,上層UsbDeviceManager.JAVA通過(guò)setprop sys.usb.config的屬性來(lái)控制gadget功能,例如:
這其中每個(gè)綁定的功能都應(yīng)gadget中的一個(gè)驅(qū)動(dòng),如mtp對(duì)應(yīng)drivers/usb/gadget/function/f_mtp.c
(2) OTG枚舉流程
流程圖如下
Configfs子系統(tǒng)與控制器之間的數(shù)據(jù)交換是通過(guò)struct usb_request *request結(jié)構(gòu)體,一次完整的流程如下:






