下面是关于 PD 快充 – FUSB302 驱动调试笔记 的详细整理,适用于你在 Linux 或嵌入式系统(如 RK、Allwinner、Amlogic、NXP 平台)中调试 USB Type-C 端口的 FUSB302 芯片用于 PD(Power Delivery)快充识别和协商。


⚡ PD 快充 – FUSB302 驱动调试笔记


📌 一、FUSB302 简介

  • 芯片名称:FUSB302(由 ON Semiconductor 提供)
  • 功能
    • USB Type-C 控制器(CC 线检测、连接方向识别)
    • 支持 USB PD 2.0 协议(部分版本可扩展至 PD 3.0)
  • 通信方式:I2C
  • 典型用途:平板、手机、充电宝、嵌入式主板等支持 Type-C 端口的设备

🧩 二、硬件接线说明

FUSB302 引脚功能说明接法
SDA / SCLI2C 通信线接主控 I2C 控制器(需上拉)
INT_N中断信号输出接主控 GPIO(下降沿触发)
VBUS电源电压检测输入连接 Type-C VBUS 路径
CC1 / CC2Type-C 通信线与 Type-C 公头连接
GND / VDD电源供电一般为 3.3V

🧰 三、内核驱动支持状态(Linux)

Linux 主线内核已支持 fusb302 驱动,路径如下:

drivers/usb/typec/fusb302/

该驱动通常依赖以下子系统:

  • I2C 驱动支持
  • Type-C 子系统(USB role switch / PD controller)
  • Device Tree 配置支持

📄 四、设备树配置参考(DTS)

&i2c1 {
    fusb302@22 {
        compatible = "fcs,fusb302";
        reg = <0x22>;  // FUSB302 I2C 地址
        interrupt-parent = <&gpio1>;
        interrupts = <12 IRQ_TYPE_LEVEL_LOW>;
        vbus-supply = <&vbus_reg>;
        status = "okay";
    };
}

🧪 五、调试步骤与关键日志解析

1. 检查 I2C 通信是否正常

i2cdetect -y 1

你应该能看到 0x22 地址处有响应。

2. 查看驱动是否加载成功

dmesg | grep fusb

成功示例日志:

fusb302 1-0022: Probing FUSB302 chip revision 302B
typec_port_register: registered new port fusb302

3. 检查 /sys/class/typec 目录

ls /sys/class/typec

应出现类似:

port0/
port0-partner/

可以进一步读取文件状态:

cat /sys/class/typec/port0/power_role
cat /sys/class/typec/port0/data_role

4. 检查 PD 协议协商情况(部分平台需要 tcpci 协议栈)

可开启调试 log:

echo 8 > /proc/sys/kernel/printk

并观察 Type-C 插入后的 log:

TCPM: CC pull is Rp
TCPM: Partner wants power sink
TCPM: Negotiated PDO: 9V 2A

🛠 六、常见问题排查

问题可能原因解决办法
无法识别设备插入INT_N 未正确连接 / 中断配置错误检查 GPIO 中断、电平触发方式
I2C 读不到芯片地址SDA/SCL 未连接或地址设置错误使用 i2cdetect 检查线路是否通
无法协商 PD 电压对端设备不支持 / FUSB302 初始化失败检查 log,确认对端是否支持 PD 协议
port0 没有出现驱动未加载或设备树缺失确认 DTS 正确,驱动被编译进内核

🧠 七、使用建议

  • 使用 逻辑分析仪 或 Type-C 协议分析仪(如 Ellisys、LeCroy)观察 CC 协议细节。
  • 可自定义电源规则(PDO)以适配各种电压策略。
  • 若需 PD Sink 功能(受电设备),确保主控正确请求电源配置。

📦 八、FUSB302 工具与调试代码(用户态测试)

可通过 I2C 访问寄存器测试:

int reg_val;
ioctl(i2c_fd, I2C_SLAVE, 0x22);    // 设置地址
write(i2c_fd, &reg_addr, 1);       // 设置要读的寄存器
read(i2c_fd, &reg_val, 1);         // 读出寄存器的值

也可以使用 open-source 工具如:

  • fusb302-debug
  • typec-tools
  • tcpm-tools

📚 九、参考资料