RK3588S平板双存储启动实战:SPI NOR与PCIE NVMe的Android 12配置全解析
当一块搭载RK3588S芯片的平板开发板放在你面前,如何让它同时驾驭32MB的SPI NOR闪存和256GB的PCIE NVMe固态硬盘?这不仅是存储介质的组合艺术,更是一场从硬件引脚到uboot配置的深度探险。本文将带你走进真实的开发场景,用工程师的视角拆解双存储启动的每个技术环节。
1. 硬件准备与原理图解析
拿到开发板的第一件事不是急着上电,而是翻开原理图确认关键信号路径。在RK3588S平台上,SPI NOR通常连接在SPI0总线,而PCIE SSD则可能占用PCIE2x1L1通道。需要特别关注几个硬件细节:
- 电源使能引脚:PCIE设备往往需要3.3V电源控制,例如原理图中GPIO4_B1可能被设计为电源使能脚
- 复位信号:PCIE设备的复位可能由GPIO4_A2控制
- SPI片选:NOR Flash的片选信号(CS)通常连接SPI0_CS0
硬件确认清单:
| 信号类型 | 引脚位置 | 原理图标注 | 电压要求 |
|---|---|---|---|
| PCIE电源使能 | GPIO4_B1 | VCC3V3_PCIE20_EN | 3.3V |
| PCIE复位 | GPIO4_A2 | PCIE_RST_L | 1.8V |
| SPI CLK | GPIO1_B3 | SPI0_CLK | 3.3V |
提示:使用万用表测量关键引脚电压是避免硬件损坏的好习惯,特别是PCIE电源轨在上电前应确保为0V
2. Uboot深度定制:双存储引导的核心改造
RK3588S的启动流程中,uboot扮演着交通警察的角色。我们需要让它学会同时管理NOR和PCIE两种存储设备。
2.1 修改spl引导顺序
首先调整uboot的spl-boot-order,确保优先从SPI NOR启动:
// arch/arm/dts/rk3588-u-boot.dtsi chosen { stdout-path = &uart2; u-boot,spl-boot-order = &spi_nor, &sdhci; // 移除了不必要的存储设备 };2.2 添加PCIE电源域配置
接着为PCIE设备添加电源管理节点:
vcc3v3_pcie20: vcc3v3-pcie20 { u-boot,dm-pre-reloc; compatible = "regulator-fixed"; regulator-name = "vcc3v3_pcie20"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; enable-active-high; gpio = <&gpio4 RK_PB1 GPIO_ACTIVE_HIGH>; startup-delay-us = <5000>; vin-supply = <&vcc12v_dcin>; };2.3 内核DTB嵌入技巧
由于PCIE初始化需要内核设备树信息,必须将kernel的dtb编译进uboot:
# 从kernel目录复制预编译的dtb cp ../kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s-tablet-ssd.dtb u-boot/dts/kern.dtb然后在config中启用关键选项:
# configs/rk3588_defconfig CONFIG_PCIE_DW_ROCKCHIP=y CONFIG_EMBED_KERNEL_DTB_ALWAYS=y CONFIG_ROCKCHIP_BOOTDEV="nvme 0"3. 分区表双胞胎:parameter.txt的变体艺术
双存储方案需要两套独立的分区表,就像给两个仓库准备不同的货物清单。
3.1 SPI NOR专用分区表
创建parameter_nor.txt文件,重点配置uboot分区:
FIRMWARE_VER: 1.0 MACHINE_MODEL: RK3588 MACHINE_ID: 007 CMDLINE: mtdparts=rk29xxnand:0x00002800@0x00004000(uboot)3.2 PCIE SSD精简分区表
修改Android编译系统中的分区定义:
# device/rockchip/common/RebuildParameter.mk partition_list := security:4M,misc:4M # 移除了uboot分区4. 固件打包的魔术:mkupdate.sh改造术
最后的打包环节需要像厨师分装菜品一样处理两种固件。修改mkupdate.sh脚本实现智能打包:
# 生成PCIE版本固件 ./rkImageMaker ${vendor_id_map[$PLATFORM]} $IMAGE_PATH/MiniLoaderAll.bin \ $IMAGE_PATH/update.img pcie_update.img -os_type:androidos -storage:pcie # 生成SPI NOR版本固件 cp $IMAGE_PATH/parameter_nor.txt $IMAGE_PATH/parameter.txt ./rkImageMaker ${vendor_id_map[$PLATFORM]} $IMAGE_PATH/MiniLoaderAll.bin \ $IMAGE_PATH/update.img spinor_update.img -os_type:androidos -storage:spinor # 合并双固件 ./rkImageMaker -merge ./final_update.img ./spinor_update.img ./pcie_update.img5. 烧写实战:Maskrom模式下的双管齐下
烧写阶段要注意存储介质的选择策略:
Maskrom模式烧写SPI NOR:
- 选择存储类型为"SPI NOR"
- 必须烧写:MiniLoaderAll.bin、uboot.img、parameter_nor.txt
Loader模式烧写PCIE SSD:
- 切换存储类型为"PCIE"
- 烧写boot.img、vendor_boot.img、super.img等系统镜像
注意:使用瑞芯微开发工具V2.93+时,按住音量减键上电可强制进入Maskrom模式
当看到串口终端先后打印出SPI NOR初始化成功和NVMe设备识别日志时,这场存储协奏曲才算完美开幕。这种方案不仅解决了小容量NOR存储引导程序的困境,更为系统提供了高速大容量存储空间,是嵌入式设备存储架构的优雅实践。