USB PD (USB Power Delivery) 是 USB开发者论坛 (USB-IF) 在2012年7月5日发布的 USB 充电标准与技术。USB PD 是指在 USB 电力传输中,一对直接连接的端口通过 CC 线作为通信通道来协商电压、电流和功率流方向。在 USB PD 出现之前,基于安全考虑,设备最高的充电功率仅为 15W。

PD 2.0 规范允许的最大电流为 5A,最高电压为20V,使设备最高的充电功率达到了 100W。普通 Type-C 线缆可以支持 3A 电流,最大充电功率 60W;但在需要 5A 电流的场合必须使用带有 E-Marker 电子标记的线缆,否则出于安全考虑电流将被限制在 3A。

PD 3.0 规范在 PD 2.0 的基础上增加了 PPS (Programmable Power Supply) 功能,其最大的特点是可编程性。PPS功能的步进调幅电压为20mV,步进调幅电流为 50mA,可以更好地控制 Vbus 电源,延长电池寿命。

PD 3.1 规范将原 PD 3.0 的内容归纳到标准功率范围 SPR (Standard Power Range),最大功率保持 100W 不变;同时增加了扩展功率范围 EPR (Extended Power Range),最高电流仍保持 5A 不变,将最高电压从 20V 提升到 48V,使得最大功率由 100W 提升到 240W。PD 3.1 支持的充电规格如下表所示:

  可用电流和电压 功率范围 备注
标准功率范围 SPR 3A:5V, 9V, 15V, 20V
5A:20V
15 – 60W
> 60 – 100W
5A 电流需要 5A 线缆
扩展功率范围 EPR 3A:5V, 9V, 15V, 20V
5A:20V
5A:28V, 36V, 48V
15 – 60W
> 60 – 100W
> 100 – 240W
需要 EPR 线缆

1. PD 通讯基本流程

PD 供电协议的基本通讯流程如图 1.1 所示。消息通常都是由 发送 和 GoodCRC 回复 组成1,发送方发送消息后,接收方收到消息且消息通过 CRC 校验后,应向发送方回复 GoodCRC 消息以表示自己正确无误地收到了消息,发送方收到 GoodCRC 消息后表示此次消息发送成功。当消息发送方在 CRCReceiveTimer (0.9 ~ 1.1ms) 过期之前未能收到 GoodCRC 消息时,将触发重试机制,重新发送原消息。重试机制最多进行 nRetryCount (2) 次重试,如果 nRetryCount (2) 重试失败,则会使用软重置机制重置链路。

图1.1

2. PD 供电协商过程

如图 2.1 所示,基于 Type-C 接口的 PD 充电的建立过程可分为以下几步:

  1. 电源适配器与耗电设备(如手机)建立连接之后,电源适配器通过 CC 线发送 Source_Capabilites 消息告诉耗电设备,电源适配器能够提供多少种电压及相应的电流;
  2. 耗电设备在得到电源适配器的供电能力之后,选择一个最适合自己的供电方式并向电源适配发送 Request 消息请求自己需要的供电;
  3. 电源适配器根据耗电设备的选择,评估自身的能力,能满足要求则发送 Accept 消息;不满足要求则发送 Reject 消息;
  4. 在 Accept 数据包发送成功之后,电源适配器进行内部电压变换以提供请求的供电,然后向耗电设备发送 PS_Rdy 消息告诉耗电设备已提供请求的供电。

图2.1

3. PD 供电角色切换

PD 的供电角色可以在运行过程中实现动态切换,即供电方可以切换为耗电方,耗电方也可以切换为供电方。

3.1 供电方变成耗电方

如图 3.1 所示,在供电过程中,如果供电方想变成耗电方,协商的流程如下:

  1. 供电方 Source 发送 RP_Swap 消息请求切换供电角色;
  2. 耗电方 Sink 收到 RP_Swap 消息之后,判断是否允许切换供电角色;
  3. 如果 Sink 允许切换,则向 Source 发送 Accept 消息,表示其可以切换;如果不允许切换,则向 Source 发送 Reject 消息,供电角色切换失败;
  4. Source 收到Accept 消息后,会关掉 VBus 上的供电,然后发送 PS_Rdy 消息通知 Sink ;
  5. Sink 收到 PS_Rdy 消息后,会向 VBus 上提供默认 5V 电压,然后发送 PS_Rdy 消息通知 Source ;
  6. Source 收到 PS_Rdy 消息后,供电角色切换完成,原 Source 变成了 Sink,原 Sink 变成了 Source 。

图3.1

3.2 耗电方变成供电方

如图 3.2 所示,在供电过程中,如果耗电方想变成供电方,协商的流程如下:

  1. 耗电方 Sink 发送 RP_Swap 消息请求切换供电角色;
  2. 供电方 Source 收到 RP_Swap 消息之后,判断是否允许切换供电角色;
  3. 如果 Source 允许切换,则向Sink 发送 Accept 消息,表示其可以切换;如果不允许切换,则向 Sink 发送 Reject 消息,供电角色切换失败;
  4. Source 发送 Accept 消息成功后,会关掉 VBus 上的供电,然后发送 PS_Rdy 消息通知 Sink ;
  5. Sink 收到 PS_Rdy 消息后,会向 VBus 上提供默认 5V 电压,然后发送 PS_Rdy 消息通知 Source ;
  6. Source 收到 PS_Rdy 消息后,供电角色切换完成,原 Source 变成了 Sink,原 Sink 变成了 Source 。

图3.2

4. PD 数据角色切换

Type-C 接口连接上时,如果接口是供电方,则数据角色默认为 DFP/HOST ;如果接口是耗电方,则数据角色默认为 UFP/Device。 PD 的数据角色可以在运行过程中实现动态切换,即主机可以切换为设备,设备也可以切换为主机。

4.1 主机切换为设备

如图 4.1 所示,如果主机想切换为设备,协商的流程如下:

  1. 主机 DFP 发送 Dr_SWap 消息请求切换数据角色;
  2. 设备 UFP 收到Dr_SWap 消息后,判断是否允许进行切换数据角色;
  3. UFP 允许切换,则向 DFP 发送 Accept 消息;如果不允许切换,则向 DFP 发送 Reject 消息;
  4. DFP 收到 Accept 消息后,当前 DFP 切换为 UFP ;
  5. UFP 发送 Accept 消息成功后, 当前 UFP 切换为 DFP ,数据角色切换完成。

图4.1

4.2 设备切换为主机

如图 4.2 所示,如果设备想切换为主机,协商的流程如下:

  1. 设备 UFP 发送 Dr_SWap 消息请求切换数据角色;
  2. 主机 DFP 收到Dr_SWap 消息后,判断是否允许进行切换数据角色;
  3. 如果 DFP 允许切换,则向 UFP 发送 Accept 消息;如果不允许切换,则向 UFP 发送 Reject 消息;
  4. UFP 收到 Accept 消息后,当前 UFP 切换为 DFP ;
  5. DFP 发送 Accept 消息成功后, 当前 DFP 切换为 UFP ,数据角色切换完成。

图4.2

5. PD 消息结构

PD 3.1 规范定义了三种消息类型,分别为控制消息 (Control Messages) 、数据消息 (Data Messages) 和扩展消息 (Extend Messages):

  • 控制消息:控制消息很短,长度为 16 位。控制消息用于管理端口与设备之间的消息流或交换,不需要额外数据的消息。
  • 数据消息:数据消息的长度为 48 位到 240 位,用于在端口与设备之间进行数据交换。 数据消息分为三种类型,如下所示。
    • 用于展示供电方电源能力的数据消息
    • 用于 BIST 的数据消息
    • 厂商自定义的数据消息
  • 扩展消息:扩展消息的最大长度为 MaxExtendedMsgLen (260) 字节,用于在端口与设备之间进行数据交换。以下是扩展消息的类型:
    • 用于电源和电池信息的扩展消息
    • 用于安全的扩展消息
    • 用于固件更新的扩展消息
    • 厂商自定义的扩展消息

所有的消息都由 Message Header 消息头和可变长度 (包含0) 的 Data 数据部分组成。图 5.1 分别展示了作为消息数据包负载的控制消息、数据消息和扩展消息。

图5.1

图 5.1 中的消息结构包括物理层和协议层部分,其中物理层部分包括:

  • Preamble 前导码:传输的开始,用于让接收器能够锁定到载波上。Preamble 是一个 64 位 的 0 和 1 交替组成的序列,以 0 开始,以 1 结束,不进行 4b5b 编码。
  • SOP* 包开始:用于描述数据包开始的 K-code 标记。 SOP* 是 SOP、SOP'和 SOP" 的统称,如图 5.2 所示,SOP* 分别对应到不同的目标设备。
    • SOP:线缆对面的设备
    • SOP’:线缆中在较靠近的 E-Marker
    • SOP”:线缆中在较远离的 E-Marker
  • CRC 校验:对消息头和消息数据的 CRC 校验。
  • EOF 结束包:5 位的 4b5b 编码。

图5.2

5.1 Message Header 消息头

消息头长度为2字节,共16位。消息头各个二进制位含义如下表所示。

二进制位 SOP 名称 说明
15 SOP* Extended 此消息是否为扩展类型
14 ~ 12 SOP* Number of Data Objects 数据块个数,每个数据块是 32 位
11 ~ 9 SOP* MessageID 消息ID, 消息成功接收时递增
8 SOP Port Power Role 对于 SOP 信息,代表接口的供电角色
8 SOP’/SOP’’ Cable Plug 对于 SOP’/SOP’’ 信息,代表此消息的来源
7 ~ 6 SOP* Specification Reversion 此消息的当前版本
5 SOP only Port Data Role 对于 SOP 消息代表接口的功能角色
5 SOP’/SOP’’ Reserved 对 SOP’/SOP’’ 保留
4 ~ 0 SOP* Message Type 消息类型

其中:

  • Extended:扩展消息为 1,控制消息和数据消息为 0。
  • Number of Data Objects:当扩展字段 Extended 为 0 时,Number of Data Objects 表示消息头后面的 32位 数据块个数,此时 Number of Data Objects为 0 时表示此消息是控制消息,不为 0 时表示此消息是数据消息。
  • Port Power Role:表示端口当前的电源角色,为 0 时是 Sink 耗电设备,为 1 时是 Source 供电设备。
  • Port Data Role:表示端口当前的数据角色,为 0 时是设备 UFP ,为 1 时是主机 DFP 。
  • Cable Plug:表示消息的来源,为 0 时消息来源于 DFP/UFP ,为 1 时消息来源于 电缆插头或 VPD 。VPD (VCONN-powered USB Device) 即由 Vconn 供电的 USB 设备。
  • Message Type:消息类型详见 5.3 控制消息类型 和 5.4 数据消息类型。

5.2 Extended Message Header 扩展消息头

扩展消息的扩展消息头紧接在消息头之后,扩展消息头长度为2字节,共16位。扩展消息头的各个二进制位含义如下表所示。

二进制位 SOP 名称 说明
15 SOP* Chunked 此消息是否支持分块
14 ~ 11 SOP* Chunk Number 数据块的编号
10 SOP* Request Chunk 表示对数据块的请求还是响应
9 SOP* Reserved 保留
8 ~ 0 SOP* Data Size 消息中的数据字节总数

其中:

  • Chunked:为 1 表示消息支持分块,为 0 表示消息不支持分块。当消息头中的 Extended 和扩张消息头中的 Chunked 都为 1 时,消息头中的 Number of Data Objects 字段表示消息中应该 4字节对齐 的数据对象数。
  • Chunk Number:Chunked 字段为 0 时此字段也应为 0。该字段的使用有所不同,具体取决于消息是对数据的请求,还是返回的请求数据块:
    • 在数据请求中,Chunk Number 字段表示被请求的 Chunk 的编号,请求者应仅将此字段设置为最后一个接收到的块之后的下一个块的编号。
    • 在返回的请求数据块中,Chunk Number 字段指示返回的 Chunk 的编号,每个 Chunk 的块编号应从 0 开始,每个块应递增 1,最多为 9,总共 10 个块。
  • Request Chunk:为 1 表示对数据块的请求,为 0 表示对数据块的响应。
  • Data Size:表示消息中的数据字节总数,不得超过 MaxExtendedMsgLen (260) 字节。如果 Data Size 字段小于 MaxExtendedMsgLegacyLen (26) 字节且 Chunked 字段为 1,则数据应该用 0 填充到 4 字节对齐。

5.3 控制消息类型

当消息是控制消息时,消息头中 Message Type 字段对应的值如下表所示。

二进制值 消息类型 描述 发送方 SOP
00000 Reserved 保留 N/A N/A
00001 GoodCRC 确认之前的消息已被正确接收 Source, Sink or Cable Plug SOP*
00010 GotoMin 供电调节到最小 Source only SOP only
00011 Accept 接收对方的请求 Source, Sink or Cable Plug SOP*
00100 Reject 拒绝对方的请求 Source or Sink SOP only
00101 Ping 确认接收器是否继续存在 Source only SOP*
00110 PS_RDY 电源已达到所需的操作条件 Source or Sink SOP only
00111 Get_Source_Cap 获取对方的供电能力消息 Source or Sink SOP only
01000 Get_Sink_Cap 获取对方耗电的需求 Source or Sink SOP only
01001 DR_Swap 数据角色切换 Source or Sink SOP only
01010 PR_Swap 电源角色切换 Source or Sink SOP only
01011 VCONN_Swap 供电角色切换 Source or Sink SOP only
01100 Wait 回复对方的请求,让结方稍等再进行请求 Source or Sink SOP only
01101 Soft_Reset 软复位 Source or Sink SOP*
01110 Data_Reset 数据复位 Source or Sink SOP only
01111 Data_Reset_Complete 数据复位完成 Source or Sink SOP only
10000 Not_Supported 不支持对方发送的请求 “Source, Sink orCable Plug” SOP*
10001 Get_Source_Cap_Extended 获取对方的供电相关的扩展信息 Sink or DRP SOP only
10010 Get_Status 获取对方的状态 Source or Sink SOP*
10011 FR_Swap 快速供电角色切换 Sink1 SOP only
10100 Get_PPS_Status 获取供电源操作状态的其他信息 Sink SOP only
10101 Get_Country_Codes 获取本地化信息 Source or Sink SOP only
10110 Get_Sink_Cap_Extended 获取对方耗电需求的附加信息 Source or DRP SOP only
10111 Get_Source_Info 请求对方作为电源时的类型、最大能力和当前能力 Sink or DRP SOP Only
11000 Get_Revision 请求对方支持的供电规范版本 Source, Sink or Cable Plug SOP Only
11001 ~ 11111 Reserved 保留 N/A 保留

5.4 数据消息类型

当消息是数据消息时,消息头中 Message Type 字段对应的值如下表所示。

二进制值 消息类型 描述 发送方 SOP
00000 Reserved 保留 N/A N/A
00001 Source_Capabilities 供电方的供电能力信息 Source or DRP SOP only
00010 Request 请求供电 Sink only SOP only
00011 BIST 物理层测试 Tester, Source or Sink SOP*
00100 Sink_Capabilities 耗电方的耗电需求信息 Sink or DRP SOP only
00101 Battery_Status 电池状态 Source or Sink SOP only
00110 Alert 警告 Source or Sink SOP only
00111 Get_Country_Info 获取本地化信息 Source or Sink SOP only
01000 Enter_USB 进入指定的 USB 操作模式 DFP SOP*
01001 EPR_Request 请求 EPR 供电 Sink SOP only
01010 EPR_Mode 用于进入、确认和退出 EPR 模式 Source or Sink SOP only
01011 Source_Info 对 Get_Source_Info 消息的响应 Source SOP only
01100 Revision 对 Get_Revision 消息的响应 Source, Sink or Cable Plug SOP*
01101 ~ 01110 Reserved 保留 N/A N/A
01111 Vendor_Defined 厂商自定义信息 Source, Sink or Cable Plug SOP*
10000 ~ 11111 Reserved 保留 N/A N/A

5.5 扩展消息类型

当消息是扩展消息时,消息头中 Message Type 字段对应的值如下表所示。

二进制值 消息类型 描述 发送方 SOP
00000 Reserved 保留 N/A N/A
00001 Source_Capabilities_Extended 对 Get_Source_Cap_Extended 消息的响应 Source or DRP SOP only
00010 Status 对 Get_Status 消息的响应 Source or Sink SOP*
00011 Get_Battery_Cap 获取电池容量 Source or Sink SOP only
00100 Get_Battery_Status 获取电池状态 Source or Sink  
00101 Battery_Capabilities 对 Get_Battery_Cap 消息的响应 Source or Sink SOP only
00110 Get_Manufacturer_Info 获取制造商信息 Source or Sink SOP*
00111 Manufacturer_Info 对 Get_Manufacturer_Info 消息的响应 Source, Sink or Cable Plug SOP*
01000 Security_Request 身份验证请求 Source or Sink SOP*
01001 Security_Response 身份验证响应 Source, Sink or Cable Plug SOP*
01010 Firmware_Update_Request 固件更新请求 Source or Sink SOP*
01011 Firmware_Update_Response 固件更新响应 Source, Sink or Cable Plug SOP*
01100 PPS_Status 对 Get_PPS_Status 消息的响应 Source SOP only
01101 Country_Info 对 Get_Country_Info 消息的响应 Source or Sink SOP only
01110 Country_Codes 对 Get_Country_Codes 消息的响应 Source or Sink SOP only
0111 Sink_Capabilities_Extended 对 Get_Sink_Cap_Extended 消息的响应 Sink or DRP SOP only
10000 Extended_Control 控制消息扩展信息 Source or Sink SOP only
10001 EPR_Source_Capabilities 供电方的 ERP 供电能力信息 Source or DRP SOP only
10010 EPR_Sink_Capabilities 耗电方的 ERP 耗电能力信息 Sink or DRP SOP only
10011 ~ 11111 Reserved 保留 N/A N/A
11110 Vendor_Defined_Extended 厂商自定义扩展信息 Source, Sink or Cable Plug SOP*
11111 Reserved 保留 N/A N/A

6. PD 供电消息分析

如图 61. 所示,对 PD 通信进行抓包,以 SRC_CAP 消息2为例根据 Message Header 结构进行消息分析。

图6.1

此 SRC_CAP 消息的消息头值为 0X41A1,其组成及含义如图 6.2 所示。

图6.2

Extended 值为 0 且 Number of Data Objects 值为 4,表示此消息是有 4 个数据块的数据消息,所以带 SRC_CAP 负载的 USB PD 数据包结构如图 6.3 所示。

图6.3

SRC_CAP 消息中的数据块是功率数据对象 PDO (Power Data Object) ,PDO 的结构如下表所示 。

二进制位 名称 值 描述
31 ~ 30 PDO 类型 00b 固定电源 (Vmin = Vmax),即: 最小电压 = 最大电压
    01b 电池
    10b 可变电源(非电池)
    11b 增强功率数据对象 (APDO)
29 ~ 0 N/A N/A 电源功能详见特定的PDO 描述

随着协议的发展,PDO 类型已经超过4种, PDO 类型字段由原来的 2 位扩展到 4 位来支持四种以上的 PDO 类型,即 当 PDO 中第 31 ~ 30 位值为 11b 时,扩展第 29 ~ 28 位来描述新的 PDO 类型,此时的功率数据对象被称为增强型功率数据对象 APDO (Augmented Power Data Object),APDO 的结构如下表所示 。

二进制位 值 描述
31 ~ 30 11b APDO
B29…28 00b SPR 可编程电源
  01b EPR 可调电压电源
  10b ~ 11b 保留
27 ~ 0 N/A 电源功能详见特定的PDO 描述

在图 6.3 中, 4 个数据块中第 31 ~ 30 位都为 0,即 PDO 类型为固定电源供电,对于 固定电源供电的 PDO 结构 如下表所示。

二进制位 描述
31 ~ 30 固定电源
29 双重电源角色,在端口具有双重电源角色能力时设置,即它支持 PR_Swap 消息
28 是否支持 USB 挂起
27 不受约束的电源,在电源为外部设备充电的同时足以为系统供电,或者当设备的主要功能是为外部设备充电时置为 1
26 USB 通信能力,只能为能够通过 USB 数据线进行通信的 Source 设置
25 双重数据角色,在端口具有双重数据角色能力时设置,即它支持 DR_Swap 消息
24 是否支持未分块的扩展消息
23 是否支持 EPR 模式
22 保留,应置 0
21 ~ 20 峰值电流,在某些场景中可能希望使电源短时间过载的附加功能
19 ~ 10 以 50mV 为单位的电压
9 ~ 0 以 10mA 为单位的最大电流

根据 固定电源供电的 PDO 结构 表,我们将 PD 抓包获取到的 SRC_CAP 消息中的数据块解析为供电能力为:5V/3A、9V/3A、15V/1.8A、20V/1.35A。图 6.4 展示了以第一个数据块 0X0A01912C 为例解析供电能力的过程。

图6.4

参考资料

  1. 官方文档:Universal Serial Bus Power Delivery Specification
  2. USB中文网
  1. BIST 在连续 BIST 模式下不会发送 GoodCRC 消息,请参阅 Universal Serial Bus Power Delivery Specification 第 6.4.3 节。 ↩

  2. 更多关于 Source_Capabilities 的内容请参阅 Universal Serial Bus Power Delivery Specification 第 6.4.1 节 Capabilities Message。 ↩