下面是关于 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 / SCL | I2C 通信线 | 接主控 I2C 控制器(需上拉) |
INT_N | 中断信号输出 | 接主控 GPIO(下降沿触发) |
VBUS | 电源电压检测输入 | 连接 Type-C VBUS 路径 |
CC1 / CC2 | Type-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, ®_addr, 1); // 设置要读的寄存器
read(i2c_fd, ®_val, 1); // 读出寄存器的值
也可以使用 open-source 工具如:
fusb302-debug
typec-tools
tcpm-tools
📚 九、参考资料
- FUSB302 数据手册 – ON Semiconductor 官网
- Linux Kernel 文档 – Type-C Subsystem
- Device Tree 文档 – Documentation/devicetree/bindings/usb/fusb302.txt
发表回复