在RK3588平台上扩展网络功能是许多嵌入式开发者的刚需。这颗Rockchip旗舰芯片提供了丰富的PCIe接口资源,但实际配置过程中,PHY路由关系、电源管理和DTS节点配置等环节常常成为"拦路虎"。本文将手把手带你完成从硬件原理到驱动加载的全流程实战。
RK3588的PCIe子系统设计颇具特色,理解其控制器与PHY的对应关系是成功配置的前提。这颗芯片内部集成了5个独立的PCIe控制器:
关键提示:pcie2x1l0并非默认对应combphy0_ps,这是开发者最易混淆的点之一
PHY资源方面,RK3588配备了两类物理层接口:
| PHY类型 | 通道数 | 复用情况 | 典型应用场景 |
|---|---|---|---|
| pcie30phy | 4 | 专用 | 高速NVMe SSD |
| combphy0_ps | 1 | 与SATA共享 | 低速外设 |
| combphy1_ps | 1 | 与SATA共享 | WiFi模块 |
| combphy2_psu | 1 | 与SATA/USB3共享 | 多功能接口 |
电源设计要点:
在着手DTS配置前,请对照以下清单核查硬件设计:
原理图确认:
信号完整性:
实际案例(WiFi+以太网方案):
dts复制/* 电源部分示例 */
vcc3v3_pcie30: regulator {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie30";
regulator-min-microvolt = <3300000>;
gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
};
以典型的WiFi+以太网扩展场景为例,需要配置两个单通道控制器:
dts复制&pcie2x1l0 {
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
phys = <&combphy1_ps PHY_TYPE_PCIE>;
status = "okay";
};
&pcie2x1l1 {
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
phys = <&combphy2_psu PHY_TYPE_PCIE>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
关键参数解析:
reset-gpios:对应原理图中的PERSTn信号phys:指定PHY及工作模式vpcie3v3-supply:指向3.3V电源调节器RK3588的PHY支持多种工作模式,需根据实际需求配置:
dts复制&pcie30phy {
rockchip,pcie30-phymode = <PHY_MODE_PCIE_AGGREGATION>;
status = "okay";
};
&combphy1_ps {
status = "okay";
};
常用模式对照表:
| 模式常量 | 通道分配 | 适用场景 |
|---|---|---|
| PHY_MODE_PCIE_AGGREGATION | Port0: x2, Port1: x2 | 双设备共享PHY |
| PHY_MODE_PCIE_NANBNB | Port0: x1, Port1: x1 | 独立单通道模式 |
完整的电源配置示例:
dts复制pcie30_avdd0v75: regulator {
compatible = "regulator-fixed";
regulator-name = "pcie30_avdd0v75";
regulator-min-microvolt = <750000>;
vin-supply = <&avdd_0v75_s0>;
};
特别注意:即使某些PHY未启用,其电源域也必须供电
成功加载驱动后,应看到类似日志:
code复制[ 2.304155] pcieport 0000:00:00.0: PME: Signaling with IRQ 56
[ 2.310722] pcieport 0000:01:00.0: enabling device (0000 -> 0002)
常见错误及解决方法:
PHY初始化失败:
枚举超时:
链路训练失败:
bash复制# 查看PCIe设备拓扑
lspci -tv
# 检查链路状态
lspci -vvv | grep LnkSta
# 内核调试信息
dmesg | grep -i pcie
dts复制&pcie2x1l0 {
aspm-no-l0s;
aspm-l1-substates;
};
dts复制&pcie2x1l1 {
rockchip,max-payload-size = <256>;
};
当需要连接多个设备时,可采用PHY拆分方案:
dts复制&pcie30phy {
rockchip,pcie30-phymode = <PHY_MODE_PCIE_NANBNB>;
};
&pcie3x4 {
num-lanes = <1>;
phys = <&pcie30phy>;
};
配置热插拔需要额外注意:
当使用combphy2_psu时,需注意:
dts复制/* 在USB和PCIe间切换PHY */
combphy2_psu: phy@fee20000 {
assigned-clock-parents = <&cru CLK_PCIEPHY2_REF>;
};
最近在客户项目中遇到一个典型问题:RTL8111H网卡在RK3588上频繁掉线。经过排查发现:
问题现象:
解决过程:
dts复制vcc3v3_pcie30: regulator {
regulator-ramp-delay = <10000>;
};
dts复制&pcie2x1l1 {
rockchip,phy-drv-level = <0x22>;
};