RK3588 kernel-6.1 drivers/usb/typec 代码功能与实现原理
1. 子系统在 Linux 中的定位
drivers/usb/typec 实现 USB Type‑C 连接器类(connector class) 与用户可见的设备模型,并串联:
- CC(Configuration Channel) 检测结果(接入方向、角色、供电模式)
- USB PD(Power Delivery) 能力协商(电压/电流、.swap)
- Alternate Mode(替换模式)(如 DisplayPort)与 物理开关:orientation mux / SBU mux / retimer
它不替代 drivers/usb/core 或 dwc3 的 USB 数据通路本身;而是通过 typec_port、usb_role_switch、pd、mux 等 告知或驱动 SoC 上 USB/Pinctrl/DRM 等相关组件。
内核文档:Documentation/driver-api/usb/typec.rst,ABI:Documentation/ABI/testing/sysfs-class-typec。
2. 顶层构建(Makefile)
| 对象 | 源文件 / 子目录 | 作用 |
|---|---|---|
typec |
class.o、mux.o、bus.o、pd.o、retimer.o |
连接器类、Mux/Switch、Alt Mode 总线、PD sysfs、Retimer 绑定 |
altmodes/ |
DP Alt Mode 等 | 替换模式高层驱动 |
tcpm/ |
CONFIG_TYPEC_TCPM |
Type‑C Port Manager + PD 协议状态机在软件侧的实现(适配 TCPM/I²C PHY) |
ucsi/ |
CONFIG_TYPEC_UCSI |
UACPI/UCSI:OS 通过规范接口驱动 PPM(Platform Policy Manager),常见于笔记本 ACPI |
tipd/ |
CONFIG_TYPEC_TPS6598X |
TI TPS6598x:片上 PD 固件为主,驱动暴露 typec/role |
mux/ |
各 CONFIG_TYPEC_MUX_* |
Cross-switch / PI3USB30532 / FSA4480 等 mux 芯片驱动 |
| 单片端口控制器 | anx7411、hd3ss3220、stusb160x、rt1719、wusb3801、qcom-pmic-typec 等 |
绑定 DT,调用 typec/TCPM API |
3. 核心对象模型(class.h / class.c)
struct typec_port
对应 一个物理 Type‑C 口:数据角色(DFP/UFP)、电源角色(Source/Sink)、VCONN、功率档位pwr_opmode、朝向orientation,以及cap/ops(底层端口驱动回调)。
关联typec_switch(插头翻转)、typec_mux(SBU/USB 路由)、typec_retimer(高速/redriver)。struct typec_partner
对端插头侧设备节点:是否 USB PD、Cable Identity、pd_revision、挂usb_power_delivery。struct typec_cable
线缆身份(主动/被动等)。class.c
注册/sys/class/typec/下层次结构,导出 partner、cable、端口属性(PD Identity、product type、端口类型切换 sysfs 等)。
原理:把规范里的 连接器状态 变成 统一的 Linux device/class,便于 udev、电源管理、DRM DP Alt Mode 订阅。
4. Alternate Mode 子系统(bus.c)
bus.c 提供 typec_altmode_* API:
typec_altmode_enter/exit:进入/退出某 SVID 模式。typec_altmode_notify:Alt Mode 驱动 ↔ 端口/Mux:把协商好的 引脚配置 传到typec_mux_set,并可回调notify。
原理:PD Vendor Defined Message / Structured VDM 协商出的 模式号,落到 内核 Alt Mode 驱动(如 DP),再 驱动 mux 把 SuperSpeed 线与 DP Lane 接到正确 PHY。
5. Mux / Switch / Retimer(mux.c、mux/、retimer.c)
mux.c:fwnode_typec_switch_get、fwnode_typec_mux_get,通过 设备树 graph / 属性(如orientation-switch)解析 多颗开关。mux/*.c:具体芯片 设置 SAFE/USB/USB+SBU/DP 等路由。retimer.c:USB‑C Retimer(高速链路中继)与 端口 绑定,fwnode_typec_retimer_get。
原理:Type‑C 插头正反插 与 Alt Mode 都要求 模拟开关 在电气层切换;与 PD 逻辑解耦,由 class + DT 组合装配。
6. USB PD sysfs(pd.c)
注册 usb_power_delivery class,把 PDO(Power Data Object)、RDO 等变成属性(固定供电、dual_role_power、EPR 等相关字段)。
原理:用户空间 功率面板 / 调试 可读协商结果;电源路径仍由 PMIC/charger 与 端口驱动 实际控制。
7. TCPM:tcpm/tcpm.c(CONFIG_TYPEC_TCPM)
TCPM(Type‑C Port Manager) 在 tcpm.c 中实现大规模 状态机(文件头注明 USB Power Delivery protocol stack),涵盖:
- SRC_*/SNK_*:供电端/用电端 附加、能力广播、协商、Transition
- DR_SWAP / PR_SWAP / VCONN_SWAP / FR_SWAP
- Hard/Soft Reset、Try.SRC/SNK、Accessory(音频/Debug)
底层通过 tcpc_dev(如 FUSB302、TCPci)收发 PD 消息;对上 typec_register_port、通知 partner/cable、触发 role switch。
适用:PD 状态机在操作系统运行 的方案(简单 TCPC + PHY)。
8. UCSI:ucsi/ucsi.c(CONFIG_TYPEC_UCSI)
UCSI = OS 与 嵌入式策略模块(PPM) 之间的 命令/事件 ABI(常见于 ACPI _DSM/UCMT)。
驱动:sync_write/read 执行 GET_CONNECTOR_STATUS、SET_UOR、SET_PDR 等;Connector Change 中断后经 ucsi_execute 同步 typec 世界。
适用:笔记本/平板电脑,PD 策略与 PHY 多在 EC/PMIC 固件,OS 只做高层策略与 sysfs。
9. TIPD(TPS6598x):tipd/core.c
I²C 访问 TI PD 控制器寄存器;芯片内部跑 任务式固件(APP/DISC/BIST),驱动侧:
- 读 STATUS / POWER_STATUS
- 处理 中断
- 注册
typecport、usb_role_switch、power_supply
与 TCPM 区别:许多逻辑在 芯片 FW,驱动偏 寄存器适配,不一定跑完整 tcpm.c 状态机。
10. Alt Mode 示例:altmodes/displayport.c
实现 DisplayPort Alt Mode:
- 解析 VDM:pin assignment、DFP_D/UFP_D
- 与
drm_connector/typec_displayport_data协作 - 通过
typec_altmode_notify切换 mux(USB 仅 / DP 仅 / 多功能)
11. ACPI:port-mapper.c(CONFIG_ACPI)
在 ACPI 机器上映射 物理连接器编号 ↔ Type‑C 设备,便于 没有统一 DT 的 x86 平台注册端口。
12. 实现原理总览(一张图)
1 | ┌─────────────────────────────────────────┐ |
13. RK3588 相关提示
RK3588 常见:端口控制器 + PHY + dwc3;具体启用 TCPM/TYPEC_* 哪几项取决于 板级 PD 芯片(独立 TCPC、PMIC 集成 UCSI、或仅 Sink)。需在 arch/arm64/boot/dts/rockchip/ 中核对 typec、tcpci、vbus、extcon 节点与 drivers/usb/typec 里 compatible 是否匹配。
14. 延伸阅读(本仓库)
| 文档 |
|---|
| drivers-usb目录结构与分层原理.md |
| drivers-usb-dwc3详细分析.md |
基于 rk3588/kernel-6.1/drivers/usb/typec 源码归纳。
正在加载留言…