电子说
RK3588 作为瑞芯微旗舰级 SoC,其 PCIe 控制器凭借灵活的链路拆分能力与丰富特性,成为连接 NVMe、WiFi、AI 加速卡等外设的核心桥梁。本文融合硬件资源解析、3 大拆分方案实战、关键配置步骤及避坑要点,附带可视化脑图,助力开发者快速落地 PCIe 相关项目。


RK3588 的控制器与 PHY 绑定存在固定规则,拆分配置前需明确对应关系:
•pcie3x4(4Lane):仅能配合 pcie30phy 的 Port0(4L/2L/1L 模式);
•pcie3x2(2Lane):仅能配合 pcie30phy 的 Port1(2L/1L 模式);
•pcie2x1l0/pcie2x1l1:可绑定 pcie30phy(拆分后 1Lane)或 comboPHY;
•pcie2x1l2:仅绑定 comboPHY(如 combphy0_ps),与 SATA 复用。

// pcie30phy:4Lane聚合模式&pcie30phy {rockchip,pcie30-phymode =; status = "okay";};// pcie3x4:4Lane RC(支持NVMe等高速设备)&pcie3x4 {reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; // PERST#复位信号(必配)vpcie3v3-supply = <&vcc3v3_pcie30>; // 3.3V供电(含外置晶振)status = "okay";// 若需EP模式,替换compatible:// compatible = "rockchip,rk3588-pcie-ep", "snps,dw-pcie";};
// 启用comboPHY(禁用SATA复用)&combphy1_ps { status = "okay"; };&combphy2_psu { status = "okay"; };&sata0 { status = "disabled"; }; // 避免与comboPHY冲突// pcie2x1l0:配合combphy1_ps(PCIe模式)&pcie2x1l0 {phys = <&combphy1_ps PHY_TYPE_PCIE>; // 指定PCIe模式reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>; // 独立复位status = "okay";};// pcie2x1l1:配合combphy2_psu&pcie2x1l1 {phys = <&combphy2_psu PHY_TYPE_PCIE>;reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;status = "okay";};
vcc3v3_pcie30: vcc3v3-pcie30 {compatible = "regulator-fixed";regulator-name = "vcc3v3_pcie30";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;enable-active-high;gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>; // PWREN控制startup-delay-us = <5000>; // 晶振稳定时间(必配,避免时钟异常)vin-supply = <&vcc12v_dcin>;};
// pcie30phy:2+2拆分模式&pcie30phy {rockchip,pcie30-phymode =; status = "okay";};// pcie3x4:降为2Lane RC&pcie3x4 {num-lanes = <2>; // 强制2Lane(必配,拆分后需指定)reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;vpcie3v3-supply = <&vcc3v3_pcie30>;status = "okay";};// pcie3x2:2Lane RC&pcie3x2 {reset-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;vpcie3v3-supply = <&vcc3v3_pcie30>;status = "okay";};
// 启用全部3个comboPHY&combphy0_ps { status = "okay"; };&combphy1_ps { status = "okay"; };&combphy2_psu { status = "okay"; };// pcie2x1l0~l2分别绑定不同comboPHY&pcie2x1l0 {phys = <&combphy1_ps PHY_TYPE_PCIE>;reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;vpcie3v3-supply = <&vcc3v3_pcie30>;status = "okay";};&pcie2x1l1 { /* 同pcie2x1l0,复位GPIO改为RK_PA2 */ };&pcie2x1l2 { /* 同pcie2x1l0,phys改为&combphy0_ps,复位GPIO改为RK_PC1 */ };
// pcie30phy:4×1拆分模式&pcie30phy {rockchip,pcie30-phymode =; status = "okay";};// pcie3x4:降为1Lane RC&pcie3x4 {num-lanes = <1>; // 强制1Lanereset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;vpcie3v3-supply = <&vcc3v3_pcie30>;status = "okay";};// pcie3x2:降为1Lane RC&pcie3x2 {num-lanes = <1>;reset-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;vpcie3v3-supply = <&vcc3v3_pcie30>;status = "okay";};// pcie2x1l0/l1:绑定pcie30phy(1Lane)&pcie2x1l0 {phys = <&pcie30phy>; // 绑定pcie30phy(非comboPHY)reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;vpcie3v3-supply = <&vcc3v3_pcie30>;status = "okay";};&pcie2x1l1 { /* 同pcie2x1l0,复位GPIO改为RK_PA2 */ };
// 启用1个comboPHY(禁用SATA)&combphy0_ps { status = "okay"; };&sata0 { status = "disabled"; };&pcie2x1l2 {phys = <&combphy0_ps PHY_TYPE_PCIE>;reset-gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>;vpcie3v3-supply = <&vcc3v3_pcie30>;status = "okay";};

|
参数名称
|
配置位置
|
取值示例
|
核心作用
|
避坑要点
|
|
rockchip,pcie30-phymode
|
pcie30phy 节点
|
PHY_MODE_PCIE_AGGREGATION(0x4)
|
定义 pcie30phy 拆分模式
|
必须与控制器 lane 数量匹配,不可错配
|
|
num-lanes
|
控制器节点
|
<1>、<2>、<4>
|
指定控制器使用的 lane 数
|
拆分后需强制配置,如方案 3 中 pcie3x4 设为 <1>
|
|
reset-gpios
|
控制器节点
|
<&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>
|
外设复位信号
|
每个控制器需独立配置,避免多设备同时复位
|
|
vpcie3v3-supply
|
控制器节点
|
<&vcc3v3_pcie30>
|
控制 3.3V 供电
|
多控制器共享时,需设为 regulator-always-on
|
|
phys
|
控制器节点
|
<&combphy1_ps PHY_TYPE_PCIE>
|
绑定 PHY 与控制器
|
comboPHY 需加 PHY_TYPE_PCIE,禁用其他复用
|
|
rockchip,perst-inactive-ms
|
控制器节点
|
<500>
|
调整复位时间
|
外设复位慢时增大(如 WiFi 模块设为 500ms)
|
# 基础PCIe支持CONFIG_PCI=yCONFIG_PCI_DOMAINS=yCONFIG_PCI_MSI=y # 启用MSI中断CONFIG_PCI_MSI_IRQ_DOMAIN=y# RK PCIe驱动CONFIG_PCIE_DW=yCONFIG_PCIE_DW_HOST=yCONFIG_PCIE_DW_ROCKCHIP=y# PHY驱动CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y # pcie30phy驱动CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y # comboPHY驱动# 外设支持(按需选择)CONFIG_BLK_DEV_NVME=y # NVMe SSDCONFIG_USB_XHCI_PCI=y # PCIe转USBCONFIG_SATA_AHCI_PLATFORM=y # PCIe转SATA

1.信号完整性:PCIe 3.0 差分信号走线需控制阻抗(100Ω±10%),长度差≤5mm,避免过孔跨层和过长 stub(≤3mm);
2.供电要求:pcie30phy 的 AVDD_0V9(0.83V~0.99V)、AVDD_1V8(1.62V~1.98V)电压需稳定,纹波≤50mV,避免与其他大电流外设共用电源;
3.复用冲突:comboPHY(如 combphy0_ps)支持 PCIe/SATA 复用,启用 PCIe 时必须禁用 SATA(&sata0 { status = "disabled"; }),反之亦然。
|
场景
|
常见错误
|
正确做法
|
|
多控制器供电
|
单独给某个控制器配置 vpcie3v3-supply
|
共享供电设为 regulator-always-on,示例:regulator-always-on;
|
|
拆分后地址重叠
|
未调整 bus-range 导致地址冲突
|
每个控制器分配独立总线地址,同步修改 msi-map:bus-range = <0x30 0x60>; msi-map = <0x3000 &its 0x3000 0x3000>;
|
|
外设复位不充分
|
复位时间不足导致枚举失败
|
增加 rockchip,perst-inactive-ms:rockchip,perst-inactive-ms = <500>;
|
|
cache 一致性问题
|
使用 memcpy 访问 BAR 空间导致异常
|
改用 IO 专用 API:memset_io、memcpy_toio,用户态用循环赋值
|
|
问题现象
|
可能原因
|
解决方案
|
|
链路 up(LTSSM=0x30011)但枚举不到设备
|
1. 外设 vendor ID 为 0xffffffff/0x0;2. 复位时间不足
|
1. 在 drivers/pci/probe.c 添加 vendor ID 打印;2. 设 rockchip,perst-inactive-ms=500
|
|
拆分后部分控制器无响应
|
1. 控制器与 PHY 绑定错误;2. 未给 pcie30phy 未用 Port 供电
|
1. 确认 pcie3x4 绑定 Port0,pcie3x2 绑定 Port1;2. 即使仅用 1 个 Port,另一个 Port 仍需供电
|
|
休眠唤醒后设备离线
|
1. 3.3V 供电休眠时关闭;2. 未配置 CLKREQ# 信号
|
1. 供电设为 regulator-always-on;2. 控制器节点加 supports-clkreq 属性
|
|
BAR 空间分配失败(log 含 “no space for”)
|
1. 32bits-np 地址不足;2. switch 无效端口占用资源
|
1. 扩展地址(参考文档 7.18 节修改 ranges);2. 过滤无效端口(probe.c 加黑名单)
|
|
性能抖动(如 AI 卡帧率波动)
|
PCIe 控制器内存优先级低
|
执行命令提高优先级:io -4 0xfdf3a008 0x404(所有控制器通用)
|
通过本文的硬件资源解析、拆分方案实战、配置要点与避坑指南,开发者可快速完成 RK3588 PCIe 的适配与调试。若需进一步简化配置,可基于本文整理的 “拆分方案 + 参数表” 制作项目模板,提高开发效率。
全部0条评论
快来发表一下你的评论吧 !