RK3576 USB PHY 驱动开发:三类 IP、三套 DTS、三种排查路径 电子说
适用场景:系统启动了,USB 口插 U 盘没反应、插电脑不识别、充电检测不出、或者 USB3 只能跑 USB2。你确定硬件没问题,但 PHY 驱动就是不干活。
一、RK3576 三类 USB PHY 到底是怎么回事
很多人第一次接触 RK3576,以为 USB PHY 就是一个模块——完全错了。RK3576 内部有三类完全不同的 PHY,来自三家不同的 IP 供应商,驱动代码散落在内核的不同文件里,DTS 节点更是分了好几层。搞混了排查方向,对着 USBDP PHY 找 Combphy 的寄存器,纯属浪费时间。

三张表背下来,能省一半排查时间:
| 对比项 | USB2 PHY | USBDP Combo PHY | Naneng Combphy |
| IP 来源 | Innosilicon | Samsung | Rockchip |
| 驱动文件 | phy-rockchip-inno-usb2.c | phy-rockchip-usbdp.c | phy-rockchip-naneng-combphy.c |
| 数量 | 2 个 | 1 个 | 1 个 |
| 功能 | 纯 USB 2.0 | USB 3.1 + DP Alt Mode | USB3/PCIe/SATA 三选一 |
| compatible | rockchip,RK3576-usb2phy | rockchip,rk3576-usbdp-phy | rockchip,rk3576-naneng-combphy |
| 基地址 | 0x2602e000(syscon 下) | 0x2b010000 | 0x2b060000 |
| 供电域 | VD_USBPHY(3 路共用) | VD_USBDPPHY(Alive) | PD_BUS(Alive) |
| DTS 节点类型 | MFD 子节点 | 独立phy 节点 | 独立phy 节点 |
| 给谁用 | u2phy0→DRD0, u2phy1→DRD1 | DRD0 的 USB3 | DRD1 的 USB3 |
关键区别只有一点,但极其重要:USB2 PHY 挂在 usb2phy_grf 这个 syscon 下面,是一个 multi-function device 的子节点(simple-mfd)。而 USBDP 和 Combphy 各自是独立的 phy 节点。搞错了这一层关系,DTS 改半天都改不对。
二、USB2 PHY(Innosilicon)驱动深度解析
2.1 驱动位置与两个实例
USB2 PHY 驱动在 phy-rockchip-inno-usb2.c,compatible 是 rockchip,RK3576-usb2phy。两个实例对应同一个驱动代码,但挂在同一个 syscon 下的不同 offset:
// arch/arm64/boot/dts/rockchip/RK3576.dtsiusb2phy_grf: syscon@2602e000 { compatible = "rockchip,RK3576-usb2phy-grf", "syscon", "simple-mfd"; // USB2.0 PHY0 — 给 DRD0(Type-C 口)用 u2phy0: usb2-phy@0 { compatible = "rockchip,RK3576-usb2phy"; u2phy0_otg: otg-port { #phy-cells = <0>; status = "disabled"; }; }; // USB2.0 PHY1 — 给 DRD1(Type-A 口)用 u2phy1: usb2-phy@2000 { compatible = "rockchip,RK3576-usb2phy"; u2phy1_otg: otg-port { #phy-cells = <0>; status = "disabled"; }; };};
注意 offset:u2phy0 在 @0,u2phy1 在 @2000(偏移 0x2000 = 8192 字节)。它们共享同一个 syscon 寄存器块 usb2phy_grf。
供电特性:两个 PHY 共用三外部供电电源(USB2_OTG_DVDD_0V75、USB2_OTG_AVDD_1V8、USB2_OTG_AVDD_3V3)。这意味着你不能通过单独断电一个 PHY 来省电——它们是"一荣俱荣、一损俱损"的关系。
2.2 充电检测(BC1.2)
USB2 PHY 驱动内置了 BC1.2 充电协议支持,可以自动识别插入的充电器类型(SDP/CDP/DCP)。
驱动在 probe 阶段会读取 VBUS 状态,根据 DTS 配置决定由谁来处理 VBUS 检测。官方文档定义了两种路径:
路径一:有 Type-C CC 芯片(HUSB311/FUSB302)
&u2phy0_otg { rockchip,typec-vbus-det; // 告诉 PHY:VBUS 由外部 CC 控制器负责 status = "okay";};
rockchip,typec-vbus-det 属性的含义:支持 Type-C VBUS_DET 常拉高的硬件设计。PHY 不再自己处理 VBUS 中断,CC 芯片通过 Type-C 控制器的 CC 检测来通知 USB 连接和断开。
路径二:没有 CC 芯片
&u2phy0_otg { phy-supply = <&vcc5v0_otg>; // HOST 口:VBUS 5V 常开 // 或 vbus-supply = <&vcc5v0_otg>; // OTG 口:动态开关 VBUS status = "okay";};
官方文档明确区分:vbus-supply 用于 OTG 口,支持动态开关 VBUS;phy-supply 用于 USB HOST 口,系统上电后 VBUS 5V 常开。
2.3 中断处理:三个必须关注的 IRQ
USB2 PHY otg-port 定义了三组中断:
| 中断名 | 作用 | 没配的后果 |
| otg-bvalid | VBUS 有效检测 | 识别不到设备插入 |
| otg-id | OTG ID 电平检测 | 无法自动切换 Host/Device |
| linestate | USB 线状态变化 | 无法检测设备拔出 |
板子上的实际日志:
[ 1.956490] rockchip-usb2phy 2602e000.syscon:usb2-phy@0: refclk freq 24000000[ 1.957973] rockchip-usb2phy 2602e000.syscon:usb2-phy@2000: refclk freq 24000000
refclk freq 24000000 = 24MHz,这是 USB2 PHY 的参考时钟频率。如果这个值不对(比如读到 0 或者异常值),USB2 通信会直接失败。
如果中断没配好,你会看到:
[ 1.956385] rockchip-usb2phy 2602e000.syscon:usb2-phy@0: error -ENXIO: IRQ index 0 not found
排查:
# 检查 DTS 中 PHY 中断配置cat /sys/firmware/devicetree/base/usb2-phy@0/otg-port/interrupt-names 2>/dev/null# 正常应该有: otg-bvalid otg-id linestate
修复:
•如果板子有 Type-C CC 芯片,在 DTS 中加 rockchip,typec-vbus-det;,让 CC 芯片处理 VBUS 检测,PHY 中断就不是必须的
•如果没有 CC 芯片,检查 DTS 中 otg-port 的 interrupts 和interrupt-names 属性
2.4 关键 DTS 属性(官方文档确认)
| 属性 | 作用 | 什么时候用 |
| rockchip,typec-vbus-det | Type-C VBUS_DET 常拉高 | 有 CC 芯片时 |
| rockchip,sel-pipe-phystatus | GRF 控制 pipe phystatus,替代 USBDP PHY 控制 | USB 2.0 only 方案,USBDP PHY 未使能时必须加 |
| rockchip,dis-u2-susphy | 关闭 USB2 PHY 驱动动态进入 suspend mode | USB 2.0 only 方案,保持 PHY 输出时钟给控制器 |
| phy-supply | 控制 VBUS 输出 5V(HOST 口,常开) | 无 CC 芯片的 HOST 口 |
| vbus-supply | 控制 VBUS 输出 5V(OTG 口,动态) | 无 CC 芯片的 OTG 口 |
2.5 功耗数据(官方文档确认)
| 供电电源 | 读写数据 | 动态休眠 | PHY disabled | 二级待机 |
| USB20_DVDD_0V75 | 8.9mA | 2.8mA | 0.05mA | 0mA |
| USB20_AVDD_1V8 | 8.6mA | 3.34mA | 0.05mA | 0mA |
| USB20_AVDD_3V3 | 2.5mA | 0.14mA | 0.05mA | 0mA |
省电建议:不用的 USB2 PHY,在 DTS 里设 status = "disabled",PHY 会进入 IDDQ mode,功耗从 mA 级降到 50uA 级。
三、USBDP Combo PHY驱动深度解析
3.1 驱动位置
驱动文件phy-rockchip-usbdp.c,compatible 是 rockchip,rk3576-usbdp-phy。
这是 RK3576 最"豪华"的 PHY——三星 IP,4 lane,能同时跑 USB3 + DP。在芯片内部属于 VD_USBDPPHY(Alive)。
3.2 两个子端口
// arch/arm64/boot/dts/rockchip/RK3576.dtsiusbdp_phy: phy@2b010000 { compatible = "rockchip,rk3576-usbdp-phy"; usbdp_phy_dp: dp-port { #phy-cells = <0>; status = "disabled"; }; usbdp_phy_u3: u3-port { #phy-cells = <0>; status = "disabled"; };};
两个子端口在 DTSI 中默认都是 disabled,需要在板级 DTS 中 enable。
3.3 Lane MUX 配置
官方文档原话:"实际电路中,如果仅支持 USB3.1 但未支持 DP,也需要配置 rockchip,dp-lane-mux,否则 USBDP PHY 驱动无法自动分配 lane 给 USB3.1。"
这是整个 RK3576 USB PHY 中最容易被忽视的坑之一。
Lane 映射通过 rockchip,dp-lane-mux 属性控制:
&usbdp_phy { rockchip,dp-lane-mux = <2 3>; // DP 使用 Lane2 和 Lane3 status = "okay";};
配置规则:
| dp-lane-mux 值 | DP 用 Lane | USB3 自动用 Lane | 场景 |
| <0 1 2 3> | Lane0/1/2/3 | 无 | DP 4-lane 独占 |
| <2 3> | Lane2/3 | Lane0/1 | DP 2-lane + USB3 |
| <0 1> | Lane0/1 | Lane2/3 | DP 2-lane + USB3(交叉) |
官方文档还提到了 Swap on/off 两种配置的 Lane 对应关系:
•Swap off:Lane0/1/2/3 TxData mapping to Lane0/1/2/3_TXDP/N
•Swap on:Lane0/1/2/3 TxData mapping to Lane2/3/0/1_TXDP/N
3.4 时钟配置
USBDP PHY 需要三组时钟:
| 时钟名 | 作用 | 来源 |
| refclk | PHY 参考时钟 | 外部晶振,通常 24MHz |
| immortal | 不可关闭的保活时钟 | PMU 域 |
| pclk | PHY APB 接口时钟 | CRU 分发 |
驱动在 probe 阶段会 clk_get 获取这三个时钟,然后通过clk_prepare_enable 依次打开。如果其中任何一个时钟获取失败,PHY 初始化就挂了。
如果 immortal 时钟打不开,你会看到:
rockchip-usbdp 2b010000.phy: failed to enable immortal clkrockchip-usbdp 2b010000.phy: probe failed
3.5 复位信号
USBDP PHY 有五组复位信号,驱动初始化时需要按顺序释放:

驱动通过reset_control_get + reset_control_deassert 按序释放这些复位。如果 DTS 中某个复位信号没配,驱动会报错误并终止初始化。
3.6 Type-C 相关属性
&usbdp_phy { orientation-switch; // 支持 Type-C 正反插检测 svid = <0xff01>; // DP Alt Mode SVID sbu1-dc-gpios = <&gpio2 RK_PA6 GPIO_ACTIVE_HIGH>; // SBU1 电平上拉 sbu2-dc-gpios = <&gpio2 RK_PA7 GPIO_ACTIVE_HIGH>; // SBU2 电平上拉 status = "okay"; port { #address-cells = <1>; #size-cells = <0>; usbdp_phy_orientation_switch: endpoint@0 { reg = <0>; remote-endpoint = <&usbc0_orien_sw>; }; usbdp_phy_dp_altmode_mux: endpoint@1 { reg = <1>; remote-endpoint = <&dp_altmode_mux>; }; };};
官方文档说明:TYPEC_SBU1/TYPEC_SBU2 只用于 DP Alternate Mode 的 AUX 通信。因为 RK3576 芯片内部没有实现 SBU1/SBU2 的自动上拉,所以要求硬件外部电路增加两个 GPIO 控制。软件上需要修改 sbu1-dc-gpios 和sbu2-dc-gpios 进行适配。
3.7 功耗数据
| 供电电源 | 读写数据 | 动态休眠 | PHY disabled | 二级待机 |
| VDD_0V85/VDDA_0V85 | 101.6mA | 5mA | 2mA | 0mA |
| VDDH_1V8 | 29mA | 0mA | 0mA | 0mA |
USBDP PHY 是用电大户。不用的话,官方建议三种处理方式:
1.还要支持 USB3.1 下载固件:供电正常,DTS 里 status = "disabled"(未初始化状态,功耗 2mA)
2.不需要 USB3.1 下载 + 可外部断电:外部断电 + DTS disable(功耗 0mA)
3.不需要 USB3.1 下载 + 不能断电:DTS disable(未初始化状态功耗最低)
内核 disable USBDP PHY 的方法:
&usbdp_phy { status = "disabled";};&usbdp_phy_dp { status = "disabled";};&usbdp_phy_u3 { status = "disabled";};
四、Naneng Combphy 驱动深度解析
4.1 驱动位置
驱动文件phy-rockchip-naneng-combphy.c,compatible 是 rockchip,rk3576-naneng-combphy。
这是 Rockchip 自研 IP,特点就一个词:复用。
4.2 三选一模式

官方原话:
"USB 3.1/SATA/PCIe Combo PHY 在同一时刻,只能支持一种工作模式,也即 USB 3.1 与 SATA/PCIe 接口是互斥的。"
更狠的:
"特殊使用限制:OTG1/PCIe1/SATA1 控制器访问总线互斥,如果硬件电路设计上已使用了 PCIe1 或者 SATA1,则 OTG1 USB2 和 USB3 功能都无法使用。"
这意味着如果你的板子上用了 PCIe1(比如挂了 WiFi 模块),DRD1 整个 USB 口就废了——USB2 也不行,因为总线访问冲突。
4.3 供电与功耗
Combphy1 在芯片内部属于 PD_BUS(Alive),外部有两路供电电源(AVDD_0V85、AVDD_1V8)。
| 供电电源 | 读写数据 | 动态休眠 | PHY disabled | 二级待机 |
| AVDD_0V85 | 44.5mA | 9.6mA | 0.4mA | 0mA |
| AVDD_1V8 | 5.2mA | 0.5mA | 0.2mA | 0mA |
芯片上电时 Combphy 默认处于工作状态。软件在 U-Boot SPL 阶段,设置 PHY 处于 reset state,以保持 PHY 处于最低功耗。进入内核后,USB 控制器驱动会通过调用 rockchip_combphy_init() 函数释放 PHY 的 reset。
4.4 DTS 中不用时的正确配置
情况一:OTG1 USB3 不用,但 USB2 功能需要使用
&combphy1_psu { rockchip,dis-u3otg1-port; status = "okay";};&usb_drd1_dwc3 { dr_mode = "host"; phys = <&u2phy1_otg>, <&combphy1_psu PHY_TYPE_USB3>; /* 这里必须要引用 combphy1_psu */ phy-names = "usb2-phy", "usb3-phy"; maximum-speed = "high-speed"; snps,dis_u2_susphy_quirk; snps,usb2-lpm-disable; status = "okay";};
坑:即使 USB3 不用,phys 里必须引用 combphy1_psu。这是为了让内核知道这个 PHY 被占用了,防止其他驱动(比如 PCIe)抢走。
情况二:OTG1 USB2 和 USB3 均不使用
&combphy1_psu { status = "disabled";};&usb_drd1_dwc3 { status = "disabled";};
4.5 与 PCIe 控制器的冲突
Combphy1 同时影响 DRD1 的 USB2 访问 SoC 总线。官方文档专门说明了两种场景的 DTS 配置。如果硬件上已经使用了 PCIe1 或 SATA1,DRD1 的 USB 功能就无法使用——这是硬件限制,不是软件 bug。
五、PHY 初始化完整流程

关键阶段与 dmesg 日志对应关系:
| 阶段 | 正常日志 | 异常日志 |
| probe 开始 | platform ...phy: Fixed dependency cycle | 无 |
| USB2 PHY refclk | refclk freq 24000000 | 频率值异常 |
| USBDP PHY clamp | Failed to enable usbdpphy because clamp is set + probe of ... failed with error -95 | probe 失败 |
| DWC3 获取 PHY | dwc3 ...: device reset | failed to initialize core |
六、PHY 调试方法
6.1 时钟树检查(官方文档确认的接口)
# 查看 USB/PHY 相关时钟cat /sys/kernel/debug/clk/clk_summary | grep -E "usb|phy"
板子上的实际输出:
clk_phy_ref_src 5 7 0 24000000 0 0 50000 Y
clk_phy_ref_src 就是 PHY 参考时钟源,频率 24MHz,prepare count = 5,enable count = 7(被 7 个消费者引用)。如果这里 enable count = 0 或者频率不对,PHY 肯定初始化不了。
6.2 PHY 驱动加载确认
# 确认三类 PHY 是否加载dmesg | grep -i "usb2phy|usbdp|combphy"
正常输出应包含:
•rockchip-usb2phy 的 refclk 日志(两条,对应 u2phy0 和 u2phy1)
•rockchip-usbdp-phy 的 probe 日志
•rockchip-naneng-combphy 的 probe 日志
6.3 sysfs 验证
# 查看 USBDP PHY 状态cat /sys/firmware/devicetree/base/phy@2b010000/status# 正常: okay# 查看 USBDP PHY u3-port 状态cat /sys/firmware/devicetree/base/phy@2b010000/u3-port/status# 正常: okay# 查看 USBDP PHY dp-port 状态cat /sys/firmware/devicetree/base/phy@2b010000/dp-port/status# 正常: okay 或 disabled# 查看 Combphy1 状态cat /sys/firmware/devicetree/base/phy@2b060000/status
6.4 OTG mode 切换(官方文档确认的命令)
RK3576 Linux-6.1 内核支持两种方式切换 USB OTG 模式:
# 方式 1 [Legacy] — 依赖于 USB DTS 正确配置,只能用于非 Type-C 接口echo host > /sys/devices/platform/2602e000.syscon/2602e000.syscon:usb2-phy@0/otg_modeecho peripheral > /sys/devices/platform/2602e000.syscon/2602e000.syscon:usb2-phy@0/otg_mode# 方式 2 [New] — 推荐,无限制echo host > /sys/kernel/debug/usb/23000000.usb/modeecho device > /sys/kernel/debug/usb/23000000.usb/mode
官方提醒:方式 1 依赖于 USB DTS 的正确配置,只能用于非 Type-C 接口的硬件电路设计。方式 2 没有限制。因此在不确定软硬件是否正确适配时,推荐使用方式 2。
七、实战案例
案例一:USB2 PHY 中断找不到
现象:
[ 1.956385] rockchip-usb2phy 2602e000.syscon:usb2-phy@0: error -ENXIO: IRQ index 0 not found[ 1.957872] rockchip-usb2phy 2602e000.syscon:usb2-phy@2000: error -ENXIO: IRQ index 0 not found
排查过程:
# 1. 确认板子是否有 Type-C CC 芯片dmesg | grep -i "husb311|fusb302|tcpm"# 有输出 → 有 CC 芯片# 2. 检查 DTS 中 u2phy0_otg 是否有 rockchip,typec-vbus-detcat /sys/firmware/devicetree/base/usb2-phy@0/otg-port/rockchip,typec-vbus-det 2>/dev/null# 输出空 → 没配# 3. 确认 PHY 中断配置cat /sys/firmware/devicetree/base/usb2-phy@0/otg-port/interrupt-names 2>/dev/null# 正常应该有: otg-bvalid otg-id linestate
根因:板子上有 HUSB311 Type-C CC 芯片,VBUS 检测由 CC 芯片处理,但 DTS 中忘了给 u2phy0_otg 加 rockchip,typec-vbus-det; 属性。PHY 驱动不知道有外部 CC 芯片,试图自己处理 VBUS 中断,结果中断没配好,报 IRQ not found。
修复:在 board DTS 中加上:
&u2phy0_otg { rockchip,typec-vbus-det; status = "okay";};
案例二:USBDP PHY 模式切换失败
现象:插 U 盘到 Type-C 口,USB2 正常,USB3 不工作。dmesg 无 USBDP 相关报错,但 UDC current_speed 始终显示 HighSpeed。
排查过程:
# 1. 查 UDC 速度cat /sys/class/udc/23000000.usb/current_speed# 输出: HighSpeed ← 只有 USB 2.0# 2. 查 USBDP PHY u3-port 状态cat /sys/firmware/devicetree/base/phy@2b010000/u3-port/status# 输出: "okay" → DTS 里是 enable 的# 3. 查 Lane MUX 配置cat /sys/firmware/devicetree/base/phy@2b010000/rockchip,dp-lane-mux# 输出空 → rockchip,dp-lane-mux 没配!# 4. 查 DWC3 的 PHY 引用cat /sys/firmware/devicetree/base/usb@23000000/phy-names# 输出: "usb2-phy" "usb3-phy" → 引用了 usb3-phy
根因:usbdp_phy 节点缺少rockchip,dp-lane-mux 属性。官方文档明确指出:即使不支持 DP,也必须配置此属性,否则 USBDP PHY 驱动无法自动分配 Lane 给 USB3。驱动不知道 Lane 该怎么分,USB3 部分就不初始化。
修复:
&usbdp_phy { rockchip,dp-lane-mux = <2 3>; // DP 用 Lane2/3, USB3 自动用 Lane0/1 status = "okay";};
案例三:Combphy 被 PCIe 占用,DRD1 USB3 不工作
现象:DRD1 口(Type-A)插 U3 盘,只认到 USB2.0。lsusb 能看到设备但速度不对。
排查过程:
# 1. 查 DRD1 速度cat /sys/class/udc/23400000.usb/current_speed# 输出: HighSpeed ← 只有 USB 2.0# 2. 查 Combphy1 状态cat /sys/firmware/devicetree/base/phy@2b060000/status# 输出: "okay"# 3. 查 PCIe 控制器是否在用 Combphy1dmesg | grep -i "pcie|combphy"# 看到:# rockchip-naneng-combphy 2b060000.phy: configured for PCIe# dwc3 23400000.usb: Failed to get USB3 PHY
根因:板子上同时用了 PCIe1(挂 WiFi 模块)和 DRD1 USB 口。Combphy1 被 PCIe 驱动先 probe 并占用了,DWC3 控制器拿不到 USB3 PHY,只能 fallback 到 USB2。官方文档明确说了:"OTG1/PCIe1/SATA1 控制器访问总线互斥"——这是硬件限制,不是软件 bug。
修复方案(二选一):
方案 A(推荐):DTS 中禁掉 DRD1,只保留 PCIe WiFi:
&combphy1_psu { status = "okay";};&usb_drd1_dwc3 { status = "disabled";};
方案 B:如果板子硬件设计上 DRD1 和 PCIe1 都必须要用——无解,只能改硬件设计,把 WiFi 换到 PCIe0(不和 USB 复用 PHY 的那个)。
案例四:USBDP PHY 断电后系统启动异常
现象:为了省电,硬件设计上 USBDP PHY 的供电电源不供电。系统启动卡住,或者 USB3 OTG0 完全无响应。
排查过程:
# 1. 查 USBDP PHY 日志dmesg | grep -i usbdp# 可能有 probe 失败或总线访问挂死
根因:USBDP PHY 外部断电,但 DTS 中 status = "okay"。驱动 probe 时尝试获取 regulator 和时钟,因为硬件没供电,导致异常。
修复:
&usbdp_phy { rockchip,usbdpphy-clamp; /* 避免断电影响总线访问和 Logic 漏电 */ maximum-speed = "high-speed"; /* 限制 USB2 only,不初始化 USBDP PHY */ status = "okay";};
生效日志(这是正常现象):
rockchip-usbdp-phy 2b010000.phy: Failed to enable usbdpphy because clamp is setrockchip-usbdp-phy: probe of 2b010000.phy failed with error -95
驱动故意失败,避免访问没供电的 PHY。
案例五:Combphy1 不供电但 USB2 还要用
现象:Combphy1 不供电(为了省电),但 DRD1 的 USB2 功能还需要保留。直接 disabled Combphy1 后,USB2 也挂了。
根因:Combphy1 不供电时,如果 USB2 还要访问 SoC 总线,会因为 PHY 悬空导致 Logic 漏电和总线访问异常。
修复:
&combphy1_psu { rockchip,dis-u3otg1-port; /* 禁用 USB3 端口访问 */ status = "okay"; /* 保持 enabled,但实际不初始化 USB3 */};&usb_drd1_dwc3 { dr_mode = "host"; phys = <&u2phy1_otg>, <&combphy1_psu PHY_TYPE_USB3>; /* 必须引用 */ phy-names = "usb2-phy", "usb3-phy"; maximum-speed = "high-speed"; /* 限制到 USB2 */ snps,dis_u2_susphy_quirk; snps,usb2-lpm-disable; status = "okay";};
关键点:phys 里必须引用 combphy1_psu,这样内核知道 PHY 被占用了,不会让其他驱动抢走。同时 maximum-speed = "high-speed" 限制 DWC3 只跑 USB2。
八、排查决策树

九、调试命令速查表
| 目标 | 命令 | 正常输出示例 |
| USB2 PHY refclk | `dmesg | grep usb2phy` |
| PHY 时钟树 | `cat /sys/kernel/debug/clk/clk_summary | grep -E "usb|phy"` |
| USBDP PHY 状态 | cat /sys/firmware/devicetree/base/phy@2b010000/status | okay |
| USBDP u3-port | cat /sys/firmware/devicetree/base/phy@2b010000/u3-port/status | okay |
| USBDP dp-port | cat /sys/firmware/devicetree/base/phy@2b010000/dp-port/status | okay 或disabled |
| Combphy 模式 | `dmesg | grep combphy` |
| PHY 中断 | cat /sys/firmware/devicetree/base/usb2-phy@0/otg-port/interrupt-names | otg-bvalid otg-id linestate |
| UDC 速度 | cat /sys/class/udc/23000000.usb/current_speed | SuperSpeed / HighSpeed |
| OTG mode 切换 | echo host > /sys/kernel/debug/usb/23000000.usb/mode | 无输出 |
| Lane MUX | cat /sys/firmware/devicetree/base/phy@2b010000/rockchip,dp-lane-mux | 2 3 |
| Combphy 引用 | grep -r "combphy1_psu" arch/arm64/boot/dts/rockchip/ | 应只有一处引用 |
| regulator 状态 | `ls /sys/kernel/debug/regulator/ | grep usb` |
十、总结
RK3576 的三类 USB PHY,记住这几条能避开 80% 的坑:
1.USB2 PHY 是 syscon 下的 MFD 子节点,两个实例共用三路供电,不用的设 disabled 进 IDDQ
2.USBDP PHY 即使不跑 DP 也要配 rockchip,dp-lane-mux,否则 USB3 Lane 分配不了
3.Combphy 是 USB3/PCIe/SATA 三选一,硬件上互斥,软件上phys 必须引用占位
4.rockchip,typec-vbus-det 是解决 USB2 PHY IRQ not found 的标准方案(有 CC 芯片时)
5.USBDP PHY 不供电时,用 rockchip,usbdpphy-clamp + maximum-speed = "high-speed" 防止总线挂死——probe 失败 -95 是正常现象
6.Combphy1 不供电但 USB2 要用时,phys 里必须引用 combphy1_psu 并加 rockchip,dis-u3otg1-port
PHY 调试三件套:dmesg | grep phy 看初始化日志、clk_summary | grep phy 看时钟、/sys/firmware/devicetree/base/ 看 DTS 生效状态
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !