一文搞懂 RK3588 PCIe:从硬件资源到拆分配置 + 避坑指南(含脑图)

电子说

1.4w人已加入

描述

 

 

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

RK3588

 

 

 

一、RK3588 PCIe 核心硬件资源

 

RK3588

1.1 控制器与 PHY 对应关系

 

RK3588 的控制器与 PHY 绑定存在固定规则,拆分配置前需明确对应关系:

 

 

pcie3x44Lane:仅能配合 pcie30phy 的 Port04L/2L/1L 模式);

 

 

pcie3x22Lane:仅能配合 pcie30phy 的 Port12L/1L 模式);

 

 

pcie2x1l0/pcie2x1l1:可绑定 pcie30phy(拆分后 1Lane)或 comboPHY

 

 

pcie2x1l2:仅绑定 comboPHY(如 combphy0_ps),与 SATA 复用。

 

 

二、大核心拆分方案

 

RK3588

2.1 方案 14Lane RC + 2 个 PCIe 2.0(基础高速方案)

 

① pcie30phy 与高速控制器配置

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// 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 配置

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// 启用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: 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>;};

2.2 方案 22Lane+2Lane RC + 3 个 PCIe 2.0(平衡方案)

 

① 核心拆分配置(pcie30phy + 双 2Lane 控制器)

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// 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 个 PCIe 2.0 控制器配置

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// 启用全部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 */ };

2.3 方案 3个 1Lane RC + 1 个 PCIe 2.0(多设备方案)

 

① 4 个 1Lane 控制器配置

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// pcie30phy:4×1拆分模式&pcie30phy {  rockchip,pcie30-phymode = ;  status = "okay";};// pcie3x4:降为1Lane RC&pcie3x4 {  num-lanes = <1>; // 强制1Lane  reset-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 个 PCIe 2.0 控制器配置

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// 启用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";};

三、关键配置与内核选项

RK3588

 

 

3.1 DTS 参数详解表

 

参数名称

 

 

配置位置

 

 

取值示例

 

 

核心作用

 

 

避坑要点

 

 

rockchip,pcie30-phymode

 

 

pcie30phy 节点

 

 

PHY_MODE_PCIE_AGGREGATION0x4

 

 

定义 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

 

 

3.2 内核 menuconfig 必选选项

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 基础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

四、避坑指南与问题排查

 

RK3588

4.1 硬件避坑 大要点

 

1.信号完整性PCIe 3.0 差分信号走线需控制阻抗(100Ω±10%),长度差≤5mm,避免过孔跨层和过长 stub≤3mm);

 

 

2.供电要求pcie30phy 的 AVDD_0V90.83V~0.99V)、AVDD_1V81.62V~1.98V)电压需稳定,纹波≤50mV,避免与其他大电流外设共用电源;

 

 

3.复用冲突comboPHY(如 combphy0_ps)支持 PCIe/SATA 复用,启用 PCIe 时必须禁用 SATA&sata0 { status = "disabled"; }),反之亦然。

 

 

4.2 软件避坑 大场景

 

场景

 

 

常见错误

 

 

正确做法

 

 

多控制器供电

 

 

单独给某个控制器配置 vpcie3v3-supply

 

 

共享供电设为 regulator-always-on,示例:regulator-always-on;

 

 

拆分后地址重叠

 

 

未调整 bus-range 导致地址冲突

 

 

每个控制器分配独立总线地址,同步修改 msi-mapbus-range = <0x30 0x60>; msi-map = <0x3000 &its 0x3000 0x3000>;

 

 

外设复位不充分

 

 

复位时间不足导致枚举失败

 

 

增加 rockchip,perst-inactive-msrockchip,perst-inactive-ms = <500>;

 

 

cache 一致性问题

 

 

使用 memcpy 访问 BAR 空间导致异常

 

 

改用 IO 专用 APImemset_iomemcpy_toio,用户态用循环赋值

 

 

4.3 常见问题排查速查表

 

问题现象

 

 

可能原因

 

 

解决方案

 

 

链路 upLTSSM=0x30011)但枚举不到设备

 

 

1. 外设 vendor ID 为 0xffffffff/0x02. 复位时间不足

 

 

1. 在 drivers/pci/probe.c 添加 vendor ID 打印;2. 设 rockchip,perst-inactive-ms=500

 

 

拆分后部分控制器无响应

 

 

1. 控制器与 PHY 绑定错误;2. 未给 pcie30phy 未用 Port 供电

 

 

1. 确认 pcie3x4 绑定 Port0pcie3x2 绑定 Port12. 即使仅用 个 Port,另一个 Port 仍需供电

 

 

休眠唤醒后设备离线

 

 

1. 3.3V 供电休眠时关闭;2. 未配置 CLKREQ# 信号

 

 

1. 供电设为 regulator-always-on2. 控制器节点加 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 的适配与调试。若需进一步简化配置,可基于本文整理的 拆分方案 参数表” 制作项目模板,提高开发效率。

 

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

全部0条评论

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

×
20
完善资料,
赚取积分