在RK3588嵌入式项目中,“接口配置不匹配”是高频踩坑点——近期基于linux6.1内核调试SPI闪存+PCIe3x4外设方案时,就遇到了“eMMC方案正常,切换后系统卡死”的问题。核心症结不仅是驱动适配,更在于PCIe3x4节点的硬件参数未对齐。本文将聚焦pcie3x4接口的关键配置,结合驱动优化与系统挂载同步,完整拆解解决方案,帮你避开同类陷阱。
一、问题背景:PCIe3x4接口成“启动瓶颈”

RK3588支持多组PCIe接口(如pcie3x2、pcie3x4),不同接口的lane数、复位引脚、供电要求差异极大。我们的项目需求是:
•存储介质:SPI闪存(存储uboot);
•扩展接口:PCIe3x4(需工作在2 lane模式,存储kernel和rootfs)。
但实际调试时,系统启动直接卡死,串口日志报两类关键错误:
1.PCIe相关:rk-pcie fe150000.pcie: fail to init phy, err -110(PHY初始化失败)、PCIe Link Fail, LTSSM is 0x0(链路未建立);
2.系统挂载:Waiting for root device PARTUUID=614e0000-0000...(根分区UUID不匹配)。
对比eMMC方案,问题根源清晰:PCIe3x4节点配置未识别硬件,且存储的根分区配置未同步。
二、排查与修复:三步搞定PCIe3x4+SPI启动
1.第一步:修正PCIe3x4节点配置——硬件参数必须“对齐”
RK3588的PCIe接口需通过设备树(DTS)指定“硬件参数”,默认配置往往与实际版型不匹配。我们最终确定的pcie3x4节点正确配置如下,每一项参数都需对应硬件设计:
&pcie3x4 {num-lanes = <2>; //关键:根据硬件设计设为2lane(非默认4lane)//reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;//适配“RK57”版型,当前不用reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;//关键:“RN01”版型的复位引脚vpcie3v3-supply = <&vcc3v3_pcie30>;//供电:PCIe3.0标准3.3V供电pinctrl-names ="default";//启用默认引脚控制status ="okay";//启用接口(默认可能为“disabled”)};
关键参数解读(避坑重点):
•num-lanes = <2>:PCIe3x4接口支持1/2/4 lane,但硬件若只布了2 lane线路,设为4 lane会导致链路协商失败;
•reset-gpios:复位引脚必须与硬件原理图一致,错配会导致PCIe设备无法复位初始化;
•vpcie3v3-supply:必须关联正确的3.3V电源域(vcc3v3_pcie30),供电缺失会直接报PHY初始化错误(err -110)。
2.第二步:优化PCIe驱动——解决PHY初始化与DMA适配
仅配置节点还不够,需修复驱动中“适配性问题”,确保pcie3x4接口稳定工作:
(1)修复PCIe PHY初始化逻辑(phy-rockchip-snps-pcie3.c)
原驱动中SRAM初始化判断与超时定义存在问题,导致PHY启动超时:
// 原代码:判断条件过严,超时定义不通用--// 修改后:宽松且准确的判断,通用超时宏++// 新增PHY校准函数(适配pcie3x4的信号校准)+staticintrockchip_p3phy_rk3588_calibrate(structrockchip_p3phy_priv *priv)+{+intret =0;+u32 reg;+// 等待PHY0初始化完成(pcie3x4核心PHY)+ret = regmap_read_poll_timeout(priv->phy_grf,+ RK3588_PCIE3PHY_GRF_PHY0_STATUS1,+ reg, RK3588_SRAM_INIT_DONE(reg),+ 100, RK_PCIE_SRAM_INIT_TIMEOUT);+// 若为聚合模式,需同时校准PHY1+if(priv->pcie30_phymode == PHY_MODE_PCIE_AGGREGATION) {+ret |= regmap_read_poll_timeout(priv->phy_grf,+RK3588_PCIE3PHY_GRF_PHY1_STATUS1,+reg, RK3588_SRAM_INIT_DONE(reg),+100, RK_PCIE_SRAM_INIT_TIMEOUT);+}+if(ret)+pr_err("pcie3x4 PHY calibrate failed, check refclk/powern");+returnret;+}// 关联校准函数到RK3588操作集staticconststructrockchip_p3phy_ops rk3588_ops = {.phy_init = rockchip_p3phy_rk3588_init,+.phy_calibrate = rockchip_p3phy_rk3588_calibrate,// 启用校准};
(2)适配PCIe DMA初始化(pcie-dw-rockchip.c)
原驱动未处理“无DMA对象”的场景,导致驱动异常退出,需补充判断:
staticintrk_pcie_init_dma_trx(structrk_pcie *rk_pcie){if(IS_ERR(rk_pcie->dma_obj)) {dev_err(rk_pcie->pci->dev,"failed to prepare dmatestn");return-EINVAL;+// 新增:无DMA对象时正常返回(避免驱动崩溃)+}elseif(!rk_pcie->dma_obj) {/* !CONFIG_ROCKCHIP_PCIE_DMA_OBJ */+return0;}// 启用客户端读写中断(保留原逻辑)...}
修改后重新编译内核,串口日志显示pcie3x4接口正常启动:
rk-pcie fe150000.pcie: PCIe Link up, LTSSM is 0x30011——链路协商成功。
3.第三步:同步pcie根分区UUID——解决“找不到根设备”
pcie的根分区UUID与eMMC完全不同,需从“编译日志”获取真实UUID,并同步到两处配置:

(1)从编译日志取UUID(关键!避免手动猜测)

生成根文件系统(rootfs)时,编译日志会明确输出UUID:
FilesystemUUID: c2ebb35f-b6ea-47ac-94e7-eeb1c99df3cb // 这是ssd根分区的真实UUID
(2)同步修改parameter.txt与bootargs
•修改device/rockchip/.chips/rk3588/parameter.txt:更新rootfs的UUID:
-uuid:rootfs=4b74bac5-ff38-46be-ae91-7452df777ae8 // 原eMMC的UUID+uuid:rootfs=c2ebb35f-b6ea-47ac-94e7-eeb1c99df3cb // ssd的UUID(来自编译日志)uuid:boot=7A3F0000-0000-446A-8000-702F00006273
•修改kernel-6.1/arch/arm64/boot/dts/rockchip/rk3588-linux.dtsi:同步bootargs的根分区配置,并添加ssd的UUID:
chosen: chosen {- bootargs ="earlycon=uart8250,mmio32,0xfeb50000 ... root=PARTUUID=614e0000-0000 ... mtdparts=sfc_nor:0x00040000@0x00180000(vnvm),0x00800000@0x00800000(uboot)";+ bootargs ="earlycon=uart8250,mmio32,0xfeb50000 ... root=PARTUUID=c2ebb35f-b6ea ... mtdparts=sfc_nor:0x00040000@0x00180000(vnvm),0x00800000@0x00800000(uboot),-@0x00A00000(test_data:grow)";};
注:root=PARTUUID只需填前16位(c2ebb35f-b6ea),系统即可识别;test_data:grow是SPI的扩展分区,主要用于测试,按需添加。
三、最终验证:PCIe3x4+SPI方案正常工作
完成上述修改后,烧录镜像测试,结果符合预期:
1.PCIe3x4外设:lspci命令能识别到PCIe设备(如NVMe硬盘),读写速度正常;
2.系统启动:无“等待根设备”报错;
3.稳定性:PCIe链路无断开,ssd存储读写无异常。
四、关键修改总结
本次修复的核心是“硬件参数对齐+配置同步”,关键修改点整理如下:
|
模块
|
修改文件路径
|
核心修改内容
|
|
PCIe3x4节点配置
|
kernel-6.1/arch/arm64/boot/dts/rockchip/xxx.dtsi(如rk3588-evb7-v11.dtsi)
|
设置num-lanes=2、reset-gpios=gpio1 RK_PB2,status="okay"
|
|
PCIe PHY驱动
|
kernel-6.1/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
|
修复SRAM初始化判断,新增rockchip_p3phy_rk3588_calibrate校准函数
|
|
PCIe DMA驱动
|
kernel-6.1/drivers/pci/controller/dwc/pcie-dw-rockchip.c
|
补充“无DMA对象”的判断逻辑,避免驱动崩溃
|
|
根分区UUID同步
|
device/rockchip/.chips/rk3588/parameter.txt
|
更新uuid:rootfs为pcie根分区UUID(来自编译日志)
|
|
系统启动参数
|
kernel-6.1/arch/arm64/boot/dts/rockchip/rk3588-linux.dtsi
|
同步bootargs的root=PARTUUID
|
|
内核配置优化
|
kernel-6.1/arch/arm64/configs/rk3588_linux.config
|
新增CONFIG_RCU_FAST_NO_HZ=y,提升系统实时性
|
五、嵌入式开发启示:细节决定适配成败
1.PCIe接口配置“硬软必须对齐”:lane数、复位引脚、供电域需1:1对应硬件原理图,尤其是不同版型的引脚差异,错配必出问题;
2.UUID从编译日志取,不猜不试:pcie/eMMC的根分区UUID不同,手动填写易出错,直接从rootfs编译日志复制最准确;
3.驱动调试“抓日志,看关键值”:PHY初始化失败(err -110)先查供电/复位,链路失败(LTSSM=0x0)先查lane数与引脚配置,日志是最佳线索。
如果你的RK3588项目也在PCIe+SPI方案上卡壳,不妨对照本文检查节点配置与UUID同步——多数时候,问题都藏在这些“细节”里。欢迎在评论区分享你的调试经验~
审核编辑 黄宇
-
SPI
+关注
关注
17文章
1898浏览量
102083 -
PCIe
+关注
关注
16文章
1474浏览量
88895 -
RK3588
+关注
关注
8文章
585浏览量
7540
发布评论请先 登录
麒麟适配 | 眺望电子上线 “RK3588+麒麟” 全功能主板
RK3588操控终端
RK3588 CPU 隔离:AB/非 AB 系统双方案适配实战
RK3588 PCIe 压测:从崩溃到排障的全流程解析
一文打通Rockchip DP调试:从原理到实战,覆盖RK3399/RK3576/RK3588全平台
调试RK3588必看!这个临时设备树文件,藏着你要的所有配置答案
RK3588平台双存储(SPI+PCIE)OTA升级方案教学文档
保姆级教程!RK3588 Linux6.1 固件签名完整实现方案(不含rootfs)
开发者必备,10 分钟搞定 RK3588 PCIE 拆分!
实战复盘:RK3588 SPI+PCIe3x4方案启动修复,从节点配置到驱动适配全解析
评论