RK3576 USB PHY 驱动开发:三类 IP、三套 DTS、三种排查路径

电子说

1.4w人已加入

描述

适用场景:系统启动了,USB 口插 U 盘没反应、插电脑不识别、充电检测不出、或者 USB3 只能跑 USB2。你确定硬件没问题,但 PHY 驱动就是不干活。

一、RK3576 三类 USB PHY 到底是怎么回事

很多人第一次接触 RK3576,以为 USB PHY 就是一个模块——完全错了。RK3576 内部有三类完全不同的 PHY,来自三家不同的 IP 供应商,驱动代码散落在内核的不同文件里,DTS 节点更是分了好几层。搞混了排查方向,对着 USBDP PHY 找 Combphy 的寄存器,纯属浪费时间。

rk3576

三张表背下来,能省一半排查时间:

对比项 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 有五组复位信号,驱动初始化时需要按顺序释放:

rk3576

驱动通过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 三选一模式

rk3576

官方原话

"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 初始化完整流程

rk3576

关键阶段与 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。

八、排查决策树

rk3576

九、调试命令速查表

目标 命令 正常输出示例
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 生效状态

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分