0x00 USB PD協(xié)議背景知識
USB PD(Power Deliver)協(xié)議是USB IF協(xié)會制定的USB充電標準與技術(shù),是目前主流的快充協(xié)議之一,其最大供電能力可達100W,被應用在各種設備的電源上。USB PD協(xié)議利用USB Type-C接口的CC(Configuration channel)引腳作為數(shù)據(jù)傳輸通道來協(xié)商充電的電壓、電流和功率傳輸方向,在介紹USB PD協(xié)議的具體內(nèi)容之前,先簡單介紹一下其依賴的USB Type-C接口。
如上圖所示,Type-C接口可以完全替代Type-A、Type-B、Micro AB等各種USB接口,實現(xiàn)數(shù)據(jù)傳輸、電力傳輸。USB PD協(xié)議就是基于Type-C接口的強大功能實現(xiàn)的。Type-C接口的引腳示意圖如下所示,VBUS為總線電源,D+、D-為USB2.0的差分信號線,TX+、TX-、RX+、RX-為SuperSpeed差分信號,SBU(Sideband Use)為旁路使用,CC為配置通道。Type-C接口最大功率傳輸可達100W(20V/5A),最大數(shù)據(jù)傳輸速率為10Gbps。可以看到,在公頭上只有一個CC引腳,母頭上的CC引腳是對稱的,所以也可以利用CC引腳判斷正反插。
USB PD協(xié)議的工作原理是利用Type-C接口的CC線作為數(shù)據(jù)線來協(xié)商電壓、電流以及供電方向,整個通信過程需要按照特定的數(shù)據(jù)包格式,并且存在相互認證的過程。下面先介紹一些USB PD中常見的名詞,這些名詞在后面也會用到。
- Source:通常指電源提供端,如電源適配器。
- Sink:通常指電源消耗端,如手機、平板。
- E-Marker(electronic marker):電子標記,一般存在于Type-c to Type-c的線纜中。
- CC(Configuration Channel) :配置通道,用于識別、控制等。
- BMC(Biphase Mark Coding):雙相位標識編碼,通過CC通信。
- DFP(Downstream Facing Port):下行端口,即為HOST或者HU B下行端口。
- UFP(Upstream Facing Port):上行端口,即為Device或者HUB的上行端口。
- DRD (Dual-Role Data):能作為DFP/UFP。
- DRP (Dual-Role Power):能做為Sink/Sour ce。
- SOP(Start of Packet Sequences):所有的PD傳輸流程,都是以SOP開始,SOP*代表SOP,SOP’,SOP''。
- EOP (End of Packet):數(shù)據(jù)包結(jié)束標志。
0x01 USB PD協(xié)議的數(shù)據(jù)格式
USB PD協(xié)議通過特定格式的數(shù)據(jù)包進行通信,數(shù)據(jù)包的格式如下所示。
一個完整的USB PD數(shù)據(jù)包由前導碼(Preamble),使用場景碼(SOP*),功能碼(MessageHeader),數(shù)據(jù)碼(Byte0-n)、校驗碼(CRC)以及結(jié)束碼(EOP)組成,如果數(shù)據(jù)部分為空,說明數(shù)據(jù)包僅作為控制指令使用,稱為控制消息。有數(shù)據(jù)內(nèi)容的稱為數(shù)據(jù)消息,通常數(shù)據(jù)消息里包含了要變化的電壓值和電流值等信息。整個USB PD數(shù)據(jù)包中,除了前導碼不需要進行4b5b編碼外,數(shù)據(jù)包的其他部分均需要進行4b5b編碼,指定數(shù)據(jù)經(jīng)過4b5b編碼后,數(shù)據(jù)包中所有數(shù)據(jù)都需要使用BMC編碼之后才能通過CC發(fā)送。4b5b編碼和BMC編碼會在下一章節(jié)詳細介紹。
前導碼(Preamble)
前導碼(Preamble)是為了鎖定接收端,預示發(fā)送端將要有數(shù)據(jù)到達,前導碼由64位交替的‘0’和‘1’組成,以'0'開始,以'1'結(jié)束。
使用場景碼(SOP*)
所有的USB PD傳輸流程,都是以SOP開始,SOP代表SOP,SOP',SOP''。不同的使用場景會用到不同SOP,每一個SOP也由不同的特殊編碼組成。如SOP是由3個Sync-1和1個Sync-2組成,對應的5b編碼可以在4b5b編碼表中查到。
數(shù)據(jù)包使用SOP作為開頭,說明該數(shù)據(jù)包是在Source與Sink之間進行的。
SOP'由2個Sync-1和2個Sync-3組成,其順序如下圖。
SOP''也是由2個Sync-1和2個Sync-3組成,但是其順序與SOP'不同。
數(shù)據(jù)包使用SOP'或SOP'',則說明是Source與E-Marker之間的通信過程,不同的是,SOP'體現(xiàn)的是Source與線材近端E-Marker的通信,SOP''體現(xiàn)的是Source與線材遠端E-Marker的通信。
功能碼(Message Header)
功能碼長度16-bits,通常包含數(shù)據(jù)包類型、端口角色(UFP/DFP)、PD協(xié)議版本等信息,功能碼的組成如下圖所示。
從列表中可以看出,不同的功能碼需要特定的SOP*,這個在之前也有提到,下面介紹一些常用的功能碼。
Extended
Extended是用來表示該數(shù)據(jù)包是否包含外部指令的功能碼,該位置1,表示數(shù)據(jù)包中存在外部指令,反之則沒有。如果數(shù)據(jù)包中包含外部指令,指令內(nèi)容會跟在功能碼后面進行傳輸。USB PD協(xié)議的外部指令使用的比較少,在這里就不做詳細的介紹了。
Number of Data Objects
當Extended置0時,Number of Data Objects才可以使用,該功能碼有3-bits,用來表示功能碼后跟的數(shù)據(jù)的位數(shù),如果Number of Data Objects置0,則表示功能碼后沒有數(shù)據(jù),該數(shù)據(jù)包為控制消息。如果該功能碼置1,則表示該數(shù)據(jù)包為數(shù)據(jù)消息。
Port Power Role & Port Data Role
這兩個功能碼都是表示端口的電源角色(Source/Sink)和數(shù)據(jù)角色(DFP/UFP),該位置1時表示Source/DFP,該位置0表示Sink/UFP。
Message Type
Message Type有5-bits,是功能碼中比較重要的位,需要和Number of Data Objects 結(jié)合使用,前面提到Number of Data Objects決定了數(shù)據(jù)包的消息類型,Message Type 則表示具體的指令類型。當Number of Data Objects置0, Message Type則可以表示以下控制指令。例如當接收器成功接收數(shù)據(jù)包并CRC校驗正確后,會向發(fā)送端發(fā)送帶有GoodCRC和Message ID的數(shù)據(jù)包,來表示通信成功。
當Number of Data Objects置1時,Data Message Types可表示以下指令,例如Source會在通信過程中向Sink發(fā)送Source_Capabilitties來表示供電能力,Sink可以從供電能力列表中進行選擇并通過Request指令發(fā)送給Source端。
數(shù)據(jù)碼(Byte0-n)
數(shù)據(jù)碼只有在數(shù)據(jù)包類型為數(shù)據(jù)消息時才會使用,具體的數(shù)據(jù)內(nèi)容需要根據(jù)指令的內(nèi)容改變,例如在使用Source_Capabiliities消息指令時,數(shù)據(jù)碼就會存放Source的供電能力。數(shù)據(jù)碼同樣需要使用4b5b進行編碼。
校驗碼(CRC)
功能碼和數(shù)據(jù)碼都需要由32bits的CRC校驗進行保護,校驗碼的生成機制比較繁瑣,一般都會使用查表的方式實現(xiàn),在這里也不做詳細的介紹了,感興趣的小伙伴可以參考USB IF協(xié)會的官方文檔。
結(jié)束碼(EOP)
結(jié)束碼表示整個數(shù)據(jù)包的結(jié)束,在4b5b編碼表中可以找到對應的5b編碼,為01101。
0x02 USB PD協(xié)議的編碼方式
4B5B編碼
在USB PD協(xié)議的數(shù)據(jù)包中,除了前導碼(Preamble)之外,其他部分均需要使用4b5b編碼,官方的說法是為了降低接收端設計的復雜度,提高接收端設計的自由度。4b5b編碼的原理是建立一個4b5b編碼表,將4-bits的數(shù)據(jù)與5-bits的數(shù)據(jù)進行對應,發(fā)送端根據(jù)編碼表對4-bits數(shù)據(jù)進行編碼,接收端根據(jù)編碼表對5-bits數(shù)據(jù)進行解碼,編碼表的具體內(nèi)容如下圖所示。
從圖中可以看出,除了基本的hex數(shù)據(jù)外,還定義了一些特定的編碼,如Sync-1、RST-1等,這些特定的編碼會組成SOP*,在介紹USB PD協(xié)議數(shù)據(jù)格式時也有提到。另外,編碼表中還預留了多個未定義的5b編碼,可以作為的擴展指令使用。
BMC編碼
USB PD協(xié)議的數(shù)據(jù)包中,所有的數(shù)據(jù)都需要使用BMC進行編碼,BMC編碼屬于物理層的操作,經(jīng)過編碼之后的數(shù)據(jù)通過CC線進行傳送。
上圖為BMC編碼的示例,BMC編碼規(guī)則是曼切斯特編碼的一個版本,按照脈寬來設定的0和1,從示例中可以看到,在一個周期里有高低電平變化為1,否則為0。
USB PD協(xié)議編解碼流程
以上詳細介紹了USB PD協(xié)議數(shù)據(jù)包的格式和各個部分的功能,那么對于一個完整的數(shù)據(jù)包,發(fā)送端發(fā)送的流程是什么,接收端接收到數(shù)據(jù)之后會進行哪些處理呢。
上圖為一個完整的數(shù)據(jù)包發(fā)送和接收的流程圖,可以看到,在發(fā)送數(shù)據(jù)時,需要將經(jīng)過CRC校驗后的數(shù)據(jù)使用4b5b編碼,再使用BMC編碼才可以通過CC發(fā)送。在接收數(shù)據(jù)時,首先進行BMC解碼,然后需要確定SOP的位置,因為SOP后的數(shù)據(jù)才是真正的有用的數(shù)據(jù),再進行5b4b的解碼,校驗CRC。
介紹完理論,來看一下在實際的數(shù)據(jù)包。下面是使用邏輯分析儀抓取的USB PD協(xié)議通信數(shù)據(jù)包,使用上面介紹到的內(nèi)容對這個數(shù)據(jù)包進行解析。
首先,BMC解碼,根據(jù)BMC編碼規(guī)則,識別出'0'和'1',已經(jīng)標注在圖中。SOP識別,標注出的前20 bits為00011 00011 00011 10001,我們可以將這些數(shù)據(jù)理解為4組經(jīng)過4b5b編碼的數(shù)據(jù),由于在傳輸數(shù)據(jù)時采用大端模式,所以需要將數(shù)據(jù)的高低位交換,轉(zhuǎn)換之后為11000(Sync-1) 11000(Sync-1) 11000(Sync-1) 10001(Sync-2),也就是SOP(Sync-1、Sync-1、Sync-1、Sync-2)。同樣的,SOP后的數(shù)據(jù)也需要先高低位交換,識別結(jié)果為Source_Capabilities,說明該消息是用來表明Source的供電能力的,那么數(shù)據(jù)包中也會包含數(shù)據(jù)碼,分析的方法跟前面也是一樣的。
在日常的工作中,其實并不需要手工去分析大量的USB PD的消息類型,目前大部分邏輯分析儀都可以對USB PD協(xié)議進行解析,另外也可以借助CY4500 EZ-PD?協(xié)議分析儀對USB PD通信邏輯進行分析,只有部分邏輯分析儀無法識別的內(nèi)容,才需要我們根據(jù)協(xié)議內(nèi)容去進行分析,這些內(nèi)容大部分是USB PD芯片廠商定義的調(diào)試消息類型。
以上詳細介紹了單個USB PD數(shù)據(jù)包的構(gòu)成,以及如何去識別數(shù)據(jù)包的內(nèi)容,DFP和UFP通過數(shù)據(jù)包進行通信,就是USB PD協(xié)議認證協(xié)商的過程。
0x03 USB PD協(xié)議認證協(xié)商
我們知道,不同的設備需要不同的充電電壓、電流,手機需要9V/2A,平板需要15V/2A,電腦需要20V/3.25A,那么電源是如何實現(xiàn)根據(jù)設備需求提供定制化輸出的呢?
支持USB PD協(xié)議的設備,在與電源連接時,會進行認證和協(xié)商,協(xié)商內(nèi)容包括電源可提供的充電能力,設備支持的充電功率等。
上圖為USB PD認證協(xié)商的流程圖。首先DFP向UFP發(fā)送Source Capabilities 來表明其供電能力,UFP接收到該數(shù)據(jù)包校驗無誤后會向DFP發(fā)送GoodCRC,表明接收成功,隨后UFP會從DFP的Capabilities中選擇合適功率并使用Request消息發(fā)送給DFP,同樣DFP也會對數(shù)據(jù)包校驗并返回GoodCRC。DFP在收到UFP的Request之后,會判斷能否滿足該Request,如果可以則發(fā)送Accept,同時DFP會調(diào)整內(nèi)部電源,準備向UFP供電,準備完成之后會向UFP發(fā)送PS_Ready消息并將電壓、電流轉(zhuǎn)換成UFP請求的值,待UFP回復GoodCRC,整個協(xié)商過程完成,電源與設備建立起快充關(guān)系。
上圖是使用CY4500 EZ-PD?協(xié)議分析儀對協(xié)商過程進行監(jiān)控得到的數(shù)據(jù),從數(shù)據(jù)中可以看出,在DFP發(fā)送PS_Ready消息之前,VBUS的電壓為5V,電流幾乎為0,在DFP發(fā)送PS_Ready消息的同時,VBUS電壓升為20V,開始對設備進行快充。
0x04 USB PD協(xié)議安全性分析
前面詳細介紹了USB PD協(xié)議的數(shù)據(jù)格式、協(xié)商認證過程,了解了其工作原理,USB PD協(xié)議的具體實現(xiàn)需要使用USB PD芯片,USB PD協(xié)議本身也是公開的,數(shù)據(jù)包中包含CRC校驗,并使用4b5b編碼和BMC編碼,可以說協(xié)議在設計的時候就把安全考慮進去,但是各個廠商的USB PD協(xié)議芯片的安全性可以說是參差不齊了。USB PD協(xié)議芯片一般包括物理層、協(xié)議層和策略層,物理層包括一些通用寄存器和PD專用寄存器,還有BMC編解碼的功能等,協(xié)議層就會包含SOP*的識別、協(xié)議的實現(xiàn)等內(nèi)容,策略層則包括一些上層策略。所以需要對芯片進行編程,配置策略,實現(xiàn)協(xié)議,當然就會存在固件。由于USB PD協(xié)議僅使用CC線進行通信,所以芯片廠商也會通過CC線對USB PD芯片進行固件燒錄,在燒錄方式上目前存在三種形態(tài)。
第一種是原廠單次燒錄(OTP),這種芯片只在出貨之前被燒錄一次,不會被再次修改,也就是說不存在燒錄惡意固件的問題。同時也因為只支持一次性燒錄,所以這種協(xié)議芯片往往只會兼容標準的、成熟的快充協(xié)議,后續(xù)如果出現(xiàn)其他快充協(xié)議,協(xié)議芯片很難兼容。
第二種是開放式的多次燒錄(eFlash/MTP),這種協(xié)議芯片配置靈活,可以利用開發(fā)工具修改固件,完成對新快充協(xié)議的兼容以及修復后續(xù)出現(xiàn)的BUG,出貨量較大。不過這種芯片對應的開發(fā)工具可以比較容易買到,存在較大安全風險。
第三種是加密式的多次燒錄(eFlash/MTP),芯片配置同樣非常靈活,不過只有掌握了密鑰才能獲得固件更新的權(quán)限,而密鑰一般都有充電器廠商保管。在技術(shù)層面,這樣既保證充電器對BUG的修復能力,又能保護充電器不會被惡意更改程序,是USB PD快充充電器的最佳選擇,但是如果廠商將密鑰存儲在燒錄軟件本地或者燒錄設備中,也有可能存在密鑰泄露的情況。
所以,USB PD協(xié)議的安全性主要取決于芯片廠商的取舍,以上三種形態(tài)都在一定程度上犧牲了產(chǎn)品的功能性或者安全性,至于如何去平衡功能性和安全性,這是開發(fā)人員和安全研究人員一直需要思考和面對的問題,我們要知道, 沒有絕對的安全 。
-
USB接口
+關(guān)注
關(guān)注
9文章
699瀏覽量
55574 -
電源適配器
+關(guān)注
關(guān)注
14文章
656瀏覽量
43072 -
CRC效驗
+關(guān)注
關(guān)注
0文章
30瀏覽量
1093 -
DFP
+關(guān)注
關(guān)注
0文章
26瀏覽量
3847
發(fā)布評論請先 登錄
相關(guān)推薦
評論