RK平台 3588 存储启动与高速接口
- 期货快讯
- 2026-11-07
- 1641
内核:Linux 5.10(Android 12) | 模块:eMMC/SD、PCIe/SATA、USB3/Type-C
本文整理 RK3588 平台在存储介质、启动链路和高速接口方向上的典型调试问题,覆盖 eMMC 与 SD 卡识别、PCIe 与 SATA 硬盘枚举、SPI 与固件启动、双存储升级、固件签名校验、DDR 训练配套以及 USB3 与 Type-C 通道,并给出对应的设备树配置、驱动落点和排查方法。
一、背景
RK3588 的板载大容量存储走 eMMC 方案,控制器是 DWC MSHC,驱动为 sdhci-of-dwcmshc,支持 HS400 与增强选通。可移动存储由独立的 SDMMC 控制器承担,支持高速与 SDR104。高速扩展方面,芯片提供两组 PCIe 3.0 控制器(一组 x4、一组 x2)、一组独立的 SATA 3.0 控制器,以及两路 USB3.0 控制器配合 USBDP PHY 实现正反插与 DP 备用模式。需要说明的是,RK3588 内核 5.10 的设备树中没有 UFS 控制器节点,该平台的量产存储形态是 eMMC 与板载 SSD 组合,本文所有存储问题都在 eMMC、SD 与块设备框架内讨论。
启动链路从 DDR 训练开始,经过 BL31、U-Boot、内核到 Android 用户空间。固件侧的安全启动能力会对 loader、uboot、boot 镜像做签名校验,并可选地校验或加密 system 分区。存储与高速接口的问题往往跨越硬件设计、设备树配置、驱动时序和固件配套四个层面,需要结合串口打印逐层定位。
二、问题现象
实际项目中反馈较多的现象包括:个别批次或个别品牌的 eMMC 卡在 HS400 模式下初始化失败或读写异常,降速后恢复正常;SD 卡偶发识别不到或运行中掉卡;PCIe SSD 枚举失败,或者特定品牌 SSD 在同一块板上稳定不识别;板上没有插 SSD 时开机卡住,插上才能继续启动;SPI 加 SSD 的启动方案看不到 SPL 阶段打印,或者系统起来后根分区挂载失败;SATA 硬盘识别不到;SPI 与 SSD 双存储的整机升级失败;签名固件烧录后设备不启动,串口也没有校验失败的提示;更换 DDR 型号或调整频率后不开机;USB3.0 设备插入只枚举出 2.0,Type-C 正反插表现不一致,转 DP 无输出或花屏。
三、原因分析
存储识别问题集中在控制器时序与卡片兼容性上。eMMC 的 HS400 依赖 1.8V 信令、200MHz 时钟和增强选通,任何一项不满足都会退回低速模式或初始化失败;SD 卡的识别还叠加检测脚消抖与总线信号质量。PCIe 方向的问题集中在上电时序:参考时钟稳定、PHY 校准、复位释放和 PERST 时序环环相扣,SSD 在位检测如果参与了电源或时钟控制,还会反过来影响整机启动。
PCIe 设备从上电到 NVMe 控制器创建要经过 PHY 初始化、复位释放、链路训练和配置空间扫描几个阶段,任何一环超时都会表现为空设备或枚举失败。
固件方向的问题集中在签名与校验链。签名工具的调用目录、密钥哈希的烧写方式、安全分区的划分以及 system 分区的校验模式都会影响启动结果,其中公钥哈希写入属于一次性操作,写错之后 loader 只会静默拒绝启动。
Type-C 方向的问题来自连接检测与角色协商。CC 引脚决定插入方向和初始角色,随后的状态机在设备模式、主机模式和电源角色之间切换,USB3 与 DP 备用模式共用 USBDP PHY 通道,任何一侧配置错误都会导致枚举失败或显示异常。
四、处理方法
eMMC HS400 识别与兼容
eMMC 节点定义在 rk3588s.dtsi,兼容字符串为 rockchip,rk3588-dwcmshc,主机驱动位于 drivers/mmc/host/sdhci-of-dwcmshc.c,内部通过 DWCMSHC_CTRL_HS400 与 dwcmshc_hs400_enhanced_strobe 控制高速模式。评估板默认打开 HS400 与增强选通。
/* arch/arm64/boot/dts/rockchip/rk3588s.dtsi */
sdhci: mmc@fe2e0000 {
compatible = "rockchip,rk3588-dwcmshc", "rockchip,dwcmshc-sdhci";
max-frequency = <200000000>;
};
/* arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi */
&sdhci {
bus-width = <8>;
non-removable;
max-frequency = <200000000>;
mmc-hs400-1_8v;
mmc-hs400-enhanced-strobe;
status = "okay";
};
个别卡片在 HS400 下初始化失败时,先用 cat /sys/kernel/debug/mmc0/ios 确认实际协商到的时序模式,再把 mmc-hs400-1_8v 与 mmc-hs400-enhanced-strobe 临时去掉退回 HS200 验证。批量兼容性问题优先调整 max-frequency 与增强选通开关,信号质量问题则要回到走线与电源完整性。
SD 卡识别与 UHS 时序
SDMMC 控制器同样挂在 dwcmshc 驱动下,评估板配置为高速加 SDR104。SD 卡识别不到先看检测脚,掉卡再看信号完整性与供电。
/* arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi */
&sdmmc {
max-frequency = <150000000>;
cap-sd-highspeed;
sd-uhs-sdr104;
status = "okay";
};
排查时结合 dmesg 中的 mmc 控制器日志判断是检测问题还是传输超时,必要时关闭 UHS 模式对比。检测脚的消抖时间过短会在插拔瞬间产生误触发,表现为卡反复上下线。
PCIe SSD 枚举失败与无卡挂死
PCIe3 控制器节点在 rk3588.dtsi,驱动为 drivers/pci/controller/dwc/pcie-dw-rockchip.c,PHY 走 naneng combphy 与 snps pcie3 两套驱动。板级配置的关键是复位脚、供电和参考时钟。
/* arch/arm64/boot/dts/rockchip/rk3588.dtsi */
pcie3x4: pcie@fe150000 {
compatible = "rockchip,rk3588-pcie", "snps,dw-pcie";
max-link-speed = <3>;
num-lanes = <4>;
phys = <&pcie30phy>;
};
/* 板级 dts 需按原理图补齐 */
&pcie3x4 {
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vpcie3v3_ssd>;
status = "okay";
};
无卡挂死的典型原因是复位脚或 SSD 供电被配置成依赖卡在位,PHY 电源和参考时钟不应随卡片插拔被关断,整机启动也不能阻塞在枚举上。自动挂载脚本需要先判断设备存在再挂载。SSD 上电到 PERST 释放的间隔过短会导致链路训练失败,复位时序要在板级 dts 或硬件上保证足够的稳定时间。特定品牌不识别时先排除串口干扰一类的硬件因素,再看 PHY 校准,phy-rockchip-snps-pcie3 的校准补丁对部分 SSD 有效。
lspci -vv
dmesg | grep -i -e pcie -e nvme
NVMe 作为系统盘做长时间读写压力测试时,偶发 I/O 超时可以从控制器的 admin 与 IO 超时参数入手放宽阈值,同时确认供电余量与散热条件。
SPI 与 PCIe SSD 启动方案
SPI NOR 启动方案里控制器节点是 fspi 而不是 spi,节点名写错会直接导致镜像烧写和启动脚本都找不到设备。串口完全看不到 SPL 阶段和 DDR 训练打印,说明启动流程根本没有进入 SPL,应优先检查镜像导出地址与烧写工具的起始偏移,导出时从 0x00000000 开始取整段。
# 分区表写入 UUID,fstab 用 uuid= 挂载,避免设备名漂移
UUID=1234abcd-5678-ef00-90ab-cdef01234567 / ext4 defaults 0 1
# 内核命令行同样指向 PARTUUID
root=PARTUUID=1234abcd-5678-ef00-90ab-cdef01234567 rootwait
根分区挂载失败的常见原因是按固定设备名挂载。SPI 加 SSD 方案在部分内核版本上会遇到 PHY 校准时序问题,同样落在 phy-rockchip-snps-pcie3 的校准逻辑上。双 SSD 方案里 nvme 控制器名会随枚举顺序互换,需要在 udev 规则中按持久属性固定内部存储名,或者统一改用分区表 UUID 挂载。SPI 与 PCIe 的分区表合并是双存储场景下绕开分区冲突的常用做法。
SATA 硬盘识别
SATA 控制器是独立的 SATA 3.0 接口,驱动走 drivers/ata/ahci_platform.c,物理层复用 combphy1,工作模式必须配成 PHY_TYPE_SATA。
/* arch/arm64/boot/dts/rockchip/rk3588.dtsi */
sata1: sata@fe220000 {
compatible = "rockchip,rk-ahci", "snps,dwc-ahci";
phys = <&combphy1_ps PHY_TYPE_SATA>;
};
SATA 与 PCIe 控制器相互独立,不存在 PCIe2.0 并 lane 一类的组合配置,带宽调整只能在各自协议内进行。识别不到盘时先确认 combphy1 没有被其他外设占用,再用 lsblk 与 dmesg 核对 ahci 枚举结果。
双存储 OTA 升级
SPI 与 SSD 双存储的整机升级在原生方案中没有完整支持,升级引擎面向单一存储设备设计,遇到 mtd 与块设备混合的分区布局时会写错目标。可行的处理方向是给升级引擎打双存储补丁,区分 mtd 写入与块设备写入路径,或者把两张分区表合并成一套统一布局,让升级流程只面向一种写入接口。涉及加密分区时还要同步更新加密密钥的分发方式。
固件签名与安全启动
签名流程要在 U-Boot 目录下执行整编命令才会完整跑通,包括 loader、uboot、boot 的签名与密钥哈希烧写。在根目录执行同样的参数会因为交叉工具链配置、编译后处理钩子的权限问题以及安全系统路径缺失而失败。密钥哈希写入是一次性操作,写入后 loader 会拿镜像里的公钥做哈希对比,不匹配时静默拒绝启动,串口没有任何报错。
cd u-boot
./make.sh rk3588 --spl-new --boot_img boot.img --burn-key-hash
# system 分区加密密钥生成
openssl rand -out system_enc_key 32
非 eMMC 启动介质的方案还要保证参数文件里有 security 分区,否则签名后的镜像无处安放。SDK 的默认签名流程只覆盖 buildroot 根文件系统,debian 等第三方系统需要单独处理 system 分区的校验与加密。安全等级由三组配置共同决定:基础校验、完整性校验和分区加密,分别对应启动链校验、system 校验扩展和密钥加密,可以按产品需求逐级打开。
DDR 训练与固件配套
DDR 训练固件与 BL31 必须成对升级,两者版本不匹配是换 DDR 型号或调整频率后不开机的首要原因。串口从上电开始就看不到 SPL 和 DDR 训练打印时,问题基本停留在训练阶段,可以打开 DDR 固件的训练打印开关,或者用配套工具导出二维眼图余量,直接看到训练边界。用户空间的 dmc 调频表里 available_frequencies 反映的是内核允许的频率点,和 DDR 固件实际训练出的频率不是一回事,超出标称值的频率点不要直接写入 OPP 表。
cat /sys/class/devfreq/dmc/available_frequencies
USB3 与 Type-C 通道
USB3.0 控制器节点在 rk3588s.dtsi,兼容字符串为 rockchip,rk3588-dw3 并配 snps,dwc3,PHY 同时引用 U2 与 USBDP 两路,驱动入口在 drivers/usb/dwc3/dwc3-rockchip-inno.c,PHY 驱动为 drivers/phy/rockchip/phy-rockchip-usbdp.c。Type-C 的连接检测芯片挂在 I2C 上,常见型号的驱动在 drivers/usb/typec/tcpm/ 目录下。
/* arch/arm64/boot/dts/rockchip/rk3588s.dtsi */
usbdrd_dwc3_0: usb@fc000000 {
compatible = "snps,dwc3";
phys = <&u2phy0_otg>, <&usbdp_phy0_u3>;
};
/* arch/arm64/boot/dts/rockchip/rk3588-evb4-lp4.dtsi */
usbc0: fusb302@22 {
compatible = "fcs,fusb302";
reg = <0x22>;
interrupts =
;
vbus-supply = <&vbus5v0_typec>;
};
USB3 设备插入只枚举出 2.0,通常是 USBDP PHY 的通道没有建立起来,串口可以观察 combophy 初始化或 CDR 锁定超时一类的报错,对应 drivers/phy/rockchip/phy-rockchip-usbdp.c 的初始化与锁定流程。双 Type-C 方案要求 USB3.0 差分对正反插都要连通,硬件上依赖差分通道切换器件,两侧缺焊都会导致只有一个方向出 USB3。转 DP 无输出要区分热插拔检测与强制输出两种策略,同时确认显示节点指向的是 dp0 而不是 eDP。吞吐低于 PC 参考值时优先对比线缆、供电与并发负载,再看 PHY 参数。
五、适用范围与升级建议
本文内容适用于 RK3588 搭配内核 5.10(Android 12)的存储、启动与高速接口调试,涉及 eMMC、SD 卡、PCIe SSD、SATA、SPI 启动、固件签名、DDR 训练以及 USB3 与 Type-C。RK3588 的板载存储形态是 eMMC,不存在 UFS 控制器,遇到 UFS 相关需求需要参考后续平台的方案。升级 SDK 时把 DDR 训练固件与 BL31 作为一组同步更新,签名参数与分区布局随版本核对一遍,PCIe 与 USBDP 相关的 PHY 修复补丁保持跟版合入,设备树中的板级配置按实际原理图重新确认后再量产。










