# USB‑C PD 充电系统完整解析(SC8886 + FUSB302)
USB‑C PD(Power Delivery)已经成为 RK3568 / RK3588 / RK3576 等平台的主流供电方式。
在 Rockchip 官方方案中,PD 充电系统由三大核心组成:
- FUSB302:Type‑C Port Controller(TCPC),负责 PD 协商
- SC8886:充电 + 升降压 + PowerPath 管理
- USB‑C Connector Class:Linux 系统的角色管理框架
本文将从硬件、软件、DTS、PD 协商、充电流程、OTG、调试方法等方面进行完整讲解。
# 1. 整体架构总览
USB‑C PD 电源系统由三部分组成:
| 模块 | 作用 |
|---|---|
| FUSB302(TCPC) | PD 协商、CC 侦测、角色切换 |
| SC8886(充电/升降压 IC) | 电源转换、充电、OTG、PowerPath |
| USB‑C Connector Class | 系统角色管理(Host/Device、Source/Sink) |
三者协同工作,实现完整的 USB‑C PD 功能。
# 2. SC8886:充电 + 升降压 + PowerPath 管理核心
SC8886 是一颗高度集成的电源管理 IC,功能包括:
① Buck(降压)
PD 输入 9V/12V → 降压到系统电压(5V/3.3V)
② Boost(升压)
电池 → 升压到 5V(OTG 输出)
③ Buck‑Boost(升降压)
输入电压波动时保持系统稳定供电
④ 电池充电
支持 1S/2S 锂电池
支持最大 6A 输入电流
支持最大 8.4V 充电电压(2S)
⑤ PowerPath(系统优先供电)
- 系统优先供电
- 电池作为备用
- 自动切换,无需软件干预
⑥ PD 输入电压跟随
根据 FUSB302 的 PD 协商结果自动调整输入电压/电流。
# 3. FUSB302:PD 协商控制器
FUSB302 是一个 TCPC(Type‑C Port Controller),负责:
- CC1/CC2 侦测
- PD 协议收发
- 方向检测(正反插)
- 数据角色(Host/Device)
- 电源角色(Source/Sink)
它不负责电压转换,只负责"和充电器对话"。
# 4. USB‑C Connector Class:系统角色管理
Linux 的 USB‑C Connector Class 描述 USB‑C 口的能力:
dts
usb_con: connector {
compatible = "usb-c-connector";
data-role = "dual";
power-role = "dual";
try-power-role = "sink";
它定义:
- 数据角色(Host/Device)
- 电源角色(Source/Sink)
- 支持的电压(Sink PDO)
- 支持的输出电压(Source PDO)
- DP Alt Mode
# 5. Sink PDO:决定你能接受哪些电压
Sink PDO 是 你作为 Sink(从 PD 充电器取电)时能接受的电压列表。
例如:
dts
sink-pdos =
<PDO_FIXED(5000, 3000, PDO_FIXED_USB_COMM)
PDO_FIXED(9000, 2000, PDO_FIXED_USB_COMM)
PDO_FIXED(12000, 1500, PDO_FIXED_USB_COMM)>;
表示:
- 支持 5V 3A
- 支持 9V 2A
- 支持 12V 1.5A
# 6. TCPM 如何选择电压?(关键)
FUSB302 不决定电压,真正做决策的是 Linux 的 TCPM(Type‑C Port Manager)。
TCPM 的选择规则:
- 优先选择 最高电压(前提是电流满足要求)
- 如果不满足,选择次高电压
- 最后退回 5V
例如:
5V / 9V / 12V
→ 充电器支持 12V → TCPM 自动选择 12V
如果你想优先 9V,可以把 9V 放在第一位:
9V → 12V → 5V
顺序 = 优先级。
# 7. SC8886 的 DTS 配置详解
SC8886 使用 TI BQ25703 的兼容驱动:
dts
sc8886: sc8886@6b {
compatible = "ti,bq25703";
reg = <0x6b>;
① PD 输入电压/电流限制
dts
ti,max-input-voltage = <20000000>; // 20V
ti,max-input-current = <6000000>; // 6A
② 充电电压/电流
dts
ti,charge-current = <2000000>; // 2A 充电
ti,max-charge-voltage = <8400000>; // 8.4V(2S)
③ 系统最低电压
dts
ti,minimum-sys-voltage = <6144000>;
低于此电压 → 自动从电池升压供电。
④ OTG 升压输出
dts
ti,otg-voltage = <5000000>;
otg-mode-en-gpios = <&gpio4 RK_PC0 GPIO_ACTIVE_HIGH>;
# 8. PD 协商 → 电源转换 → 系统供电(完整流程)
① 插入 PD 充电器
FUSB302 侦测 CC → 判断为 Sink。
② FUSB302 读取充电器的 Source PDO
例如:
- 5V 3A
- 9V 2A
- 12V 1.5A
③ TCPM 匹配 Sink PDO
根据 DTS:
5V / 9V / 12V
TCPM 自动选择 12V。
④ FUSB302 发送 RDO(Request Data Object)
充电器切换到 12V。
⑤ SC8886 读取 PD 协商结果
通过:
ti,usb-charger-detection = <&usbc0>;
SC8886 自动:
- 降压到系统电压(5V/3.3V)
- 给电池充电
- 管理 PowerPath
⑥ 系统正常供电
# 9. OTG(反向供电)流程
当系统需要从电池升压输出 5V:
dts
otg-mode-en-gpios = <&gpio4 RK_PC0 GPIO_ACTIVE_HIGH>;
驱动拉高 GPIO → SC8886 进入 Boost 模式 → 输出 5V 到 Type‑C。
# 10. 常见问题与调试方法
① PD 不升压
检查:
- DTS 是否写了 9V/12V Sink PDO
- FUSB302 是否正常工作
- TCPM 日志是否有 RDO 发送
- SC8886 是否收到 PD 电压变化
② 只能 5V 充电
原因:
- Sink PDO 只有 5V
- PD 充电器不支持高压
- TCPM 选择失败
③ OTG 不输出 5V
检查:
- otg-mode-en-gpios 是否拉高
- SC8886 是否进入 Boost 模式
- Type‑C 角色是否切换为 Source
# 11. 总结(最重要的 5 点)
| 关键点 | 说明 |
|---|---|
| FUSB302 不决定电压 | PD 电压由 TCPM 决定 |
| TCPM 默认选择最高电压 | 除非你调整 Sink PDO 顺序 |
| SC8886 负责电源转换 | Buck / Boost / 充电 / OTG |
| Sink PDO 决定你能接受哪些电压 | 写 5V 就永远不会升压 |
| DTS 是整个 PD 系统的核心配置 | 决定 PD 行为、充电行为、OTG 行为 |