0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实战复盘:RK3588 SPI+PCIe3x4方案启动修复,从节点配置到驱动适配全解析

jf_44130326 来源:Linux1024 作者:Linux1024 2026-01-08 10:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

一、问题背景:PCIe3x4接口成启动瓶颈

wKgZPGlfFX6AC5eWAAXG15miHhM769.png

RK3588支持多组PCIe接口(如pcie3x2pcie3x4),不同接口的lane数、复位引脚、供电要求差异极大。我们的项目需求是:

存储介质:SPI闪存(存储uboot);

扩展接口:PCIe3x4(需工作在2 lane模式,存储kernelrootfs)。

但实际调试时,系统启动直接卡死,串口日志报两类关键错误:

1.PCIe相关:rk-pcie fe150000.pcie: fail to init phy, err -110PHY初始化失败)、PCIe Link Fail, LTSSM is 0x0(链路未建立);

2.系统挂载:Waiting for root device PARTUUID=614e0000-0000...(根分区UUID不匹配)。

对比eMMC方案,问题根源清晰:PCIe3x4节点配置未识别硬件,且存储的根分区配置未同步

二、排查与修复:三步搞定PCIe3x4+SPI启动

1.第一步:修正PCIe3x4节点配置——硬件参数必须对齐

RK3588PCIe接口需通过设备树(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启动超时:

// 原代码:判断条件过严,超时定义不通用-#defineRK3588_SRAM_INIT_DONE(reg)((reg & 0xff) == 0x49)-#defineRK3588_SRAM_INIT_TIMEOUT20000// 修改后:宽松且准确的判断,通用超时宏+#defineRK3588_SRAM_INIT_DONE(reg)((reg & 0xf) == 0xf)+#defineRK_PCIE_SRAM_INIT_TIMEOUT20000// 新增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的根分区UUIDeMMC完全不同,需从编译日志获取真实UUID,并同步到两处配置:

wKgZPGlfFX6AHEB8AAAhHHujxiQ943.png

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

wKgZPGlfFX6AQME5AAAnCJpew2Y116.png

生成根文件系统(rootfs)时,编译日志会明确输出UUID

FilesystemUUID: c2ebb35f-b6ea-47ac-94e7-eeb1c99df3cb // 这是ssd根分区的真实UUID

2)同步修改parameter.txtbootargs

修改device/rockchip/.chips/rk3588/parameter.txt:更新rootfsUUID

-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的根分区配置,并添加ssdUUID

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:growSPI的扩展分区,主要用于测试,按需添加。

三、最终验证: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=2reset-gpios=gpio1 RK_PB2status="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:rootfspcie根分区UUID(来自编译日志)

系统启动参数

kernel-6.1/arch/arm64/boot/dts/rockchip/rk3588-linux.dtsi

同步bootargsroot=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
    SPI
    +关注

    关注

    17

    文章

    1898

    浏览量

    102083
  • PCIe
    +关注

    关注

    16

    文章

    1474

    浏览量

    88895
  • RK3588
    +关注

    关注

    8

    文章

    585

    浏览量

    7540
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    麒麟适配 | 眺望电子上线 “RK3588+麒麟” 全功能主板

    引言:在国产化加速的工业新时代,需要从核心芯片操作系统实现栈自主可控。眺望电子发布上线RK3588麒麟全功能主板,集高性能、国产化、工业级于一体,以安全可靠的国产算力底座,赋能边缘计算与万物互联
    的头像 发表于 04-17 17:03 2217次阅读
    麒麟<b class='flag-5'>适配</b> | 眺望电子上线 “<b class='flag-5'>RK3588</b>+麒麟” 全功能主板

    RK3588操控终端

    RK3588操控终端全国产化无人装备手持操控终端,搭载工业级瑞芯微RK3588J芯片,适配麒麟等自主操作系统,硬件核心到软件应用实现 100% 国产化,彻底摆脱外部技术依赖。设备标配
    发表于 02-28 09:42

    你的专属“数字员工”已到岗!迅为RK3588系列适配OpenClaw

    你的专属“数字员工”已到岗!迅为RK3588系列适配OpenClaw
    的头像 发表于 02-27 15:33 776次阅读
    你的专属“数字员工”已到岗!迅为<b class='flag-5'>RK3588</b>系列<b class='flag-5'>适配</b>OpenClaw

    RK3588 CPU 隔离:AB/非 AB 系统双方案适配实战

    方案 ,两套方案代码均完整可直接套用,核心差异仅在于 代码集成路径与函数调用时机 ,且均支持通过vendor_storage动态配置隔离核心,无需反复编译固件,重启即可生效。下文将从隔离原理、适用场景、双
    的头像 发表于 02-09 07:12 524次阅读
    <b class='flag-5'>RK3588</b> CPU 隔离:AB/非 AB 系统双<b class='flag-5'>方案</b><b class='flag-5'>适配</b><b class='flag-5'>实战</b>

    RK3588 PCIe 压测:崩溃排障的流程解析

                在 RK3588 平台上进行 PCIe 设备(如 NVMe SSD )压测时,不少开发者遇到过这样的 “ 噩梦 ” :高负载下系统突然失去响应,日志里满是异常信息,甚至直接
    的头像 发表于 02-06 07:11 549次阅读
    <b class='flag-5'>RK3588</b> <b class='flag-5'>PCIe</b> 压测:<b class='flag-5'>从</b>崩溃<b class='flag-5'>到</b>排障的<b class='flag-5'>全</b>流程<b class='flag-5'>解析</b>

    一文打通Rockchip DP调试:原理到实战,覆盖RK3399/RK3576/RK3588平台

    嵌入式开发中,DisplayPort(DP)接口的调试常让工程师头疼 —— 不同芯片特性差异大、Type-C 与标准口配置不同、高分辨率输出异常、MST 多屏适配难… 尤其是 Rockchip RK3399、
    的头像 发表于 02-04 16:14 906次阅读
    一文打通Rockchip DP调试:<b class='flag-5'>从</b>原理到<b class='flag-5'>实战</b>,覆盖<b class='flag-5'>RK</b>3399/<b class='flag-5'>RK</b>3576/<b class='flag-5'>RK3588</b><b class='flag-5'>全</b>平台

    调试RK3588必看!这个临时设备树文件,藏着你要的所有配置答案

    ”——rk3588-evb7-v11-linux.dtb.dts.tmp。不少人以为它是编译过程的“临时垃圾”,看完这篇你就知道:它其实是解决硬件适配、内核启动问题的“调试钥匙”。
    的头像 发表于 02-03 15:55 1415次阅读
    调试<b class='flag-5'>RK3588</b>必看!这个临时设备树文件,藏着你要的所有<b class='flag-5'>配置</b>答案

    RK3588平台双存储(SPI+PCIE)OTA升级方案教学文档

    在嵌入式设备中,单一存储介质可能存在容量限制或可靠性风险。RK3588 平台的双存储 OTA 升级方案支持SPI(如 SPI NAND/NOR)与
    的头像 发表于 02-01 16:46 1767次阅读
    <b class='flag-5'>RK3588</b>平台双存储(<b class='flag-5'>SPI+PCIE</b>)OTA升级<b class='flag-5'>方案</b>教学文档

    保姆级教程!RK3588 Linux6.1 固件签名完整实现方案(不含rootfs)

    内核)上实操固件签名时,踩了不少官方文档的坑,经过反复调试终于打通流程。今天就把这份实战经验整理成保姆级教程,配置问题排查,一步步带
    的头像 发表于 01-14 17:21 2247次阅读
    保姆级教程!<b class='flag-5'>RK3588</b> Linux6.1 固件签名完整实现<b class='flag-5'>方案</b>(不含rootfs)

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

    资源解析3  大拆分方案实战、关键配置步骤及避坑要点,附带可视化脑图,助力开发者快速落地  PCIe
    的头像 发表于 11-20 18:18 4681次阅读
    一文搞懂 <b class='flag-5'>RK3588</b> <b class='flag-5'>PCIe</b>:<b class='flag-5'>从</b>硬件资源<b class='flag-5'>到</b>拆分<b class='flag-5'>配置</b> + 避坑指南(含脑图)

    开发者必备,10 分钟搞定 RK3588 PCIE 拆分!

    RK3588PCIE拆分的核心逻辑、配置步骤与实战技巧,轻松上手!一、RK3588PCIE拆分映射关系图PCIE的拆分机制的核心主要在于对于
    的头像 发表于 11-13 08:31 1930次阅读
    开发者必备,10 分钟搞定 <b class='flag-5'>RK3588</b> <b class='flag-5'>PCIE</b> 拆分!

    RK3588数据手册

    RK3588的资料
    发表于 08-01 16:08 54次下载

    RK这2款旗舰芯片RK3588 PK RK3576,谁是最优选

    架构来看,RK3588 的 Cortex - A75 和 Cortex - A55 核心在缓存配置上更为先进,尤其是 L3 缓存的共享机制可能使其在多核心协作和数据读取方面具有优势。RK
    发表于 07-10 18:24

    RK3576 vs RK3588:为何越来越多的开发者转向RK3576?

    、商显设备)。 RK3588 的 8K@60fps 更适合超高清视频处理(如高端电视盒子、AI 视觉设备)。 RK3576 存储选择更灵活,可搭配低成本方案(如 SPI NAND),而
    发表于 05-30 08:46

    RK3588参数与主要特性 RK3588数据手册解读

    RK3588参数与主要特性 RK3588数据手册解读
    的头像 发表于 05-19 18:34 1.5w次阅读
    <b class='flag-5'>RK3588</b>参数与主要特性  <b class='flag-5'>RK3588</b>数据手册解读