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