USB‑C PD 充电系统完整解析(SC8886 + FUSB302)

# 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 的选择规则:

  1. 优先选择 最高电压(前提是电流满足要求)
  2. 如果不满足,选择次高电压
  3. 最后退回 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 行为

相关推荐
Cx330❀2 小时前
Linux ELF格式与可执行程序加载全解析:从磁盘文件到运行进程
linux·运维·服务器·人工智能·科技
Simplicity_2 小时前
centos docker 部署
linux·docker·centos
Luke Ewin2 小时前
FunASR实时语音识别Websocket接口在Linux服务器中部署教程
linux·服务器·语音识别·funasr·实时语音转写·录音转写
ljh5746491192 小时前
chown 命令的解释和常用用法和高级用法
linux·服务器·数据库
天赐学c语言2 小时前
Linux - windows作为client访问linux服务端
linux·网络·c++
卤炖阑尾炎2 小时前
Linux 系统安全及应用实战:从账号防护到端口扫描全解析
linux·运维·系统安全
kishu_iOS&AI2 小时前
Linux的基本命令
linux·运维·服务器
小尔¥2 小时前
Linux系统安全
linux·运维·系统安全
我爱学习好爱好爱2 小时前
Elasticsearch 7.17.10 双节点集群部署(二):安装 elasticsearch-head 插件实现可视化
大数据·linux·elasticsearch