RK3588 系统分区与启动流程完整分析
本文档基于对 RK3588 平台的系统分析,涵盖 BootROM、分区布局、U-Boot 编译、FIT 镜像、Miniloader、烧录机制等关键技术主题。
目录
- RK3588 BootROM (Maskrom) 机制
- 启动介质与搜索顺序
- IDB (IDBlock) 详解
- 完整启动流程
- U-Boot 编译流程
- FIT 镜像分析
- Miniloader 详解
- 分区表与存储布局
- 烧录机制与地址映射
- SPI Loader 跳转到 eMMC U-Boot
- 固件版本兼容性
- 关键命令行工具
- SPI 镜像分析案例
- 常见问题排查
- 附录
1. RK3588 BootROM (Maskrom) 机制
1.1 什么是 Maskrom
Maskrom 是固化在 RK3588 芯片内部 ROM(只读存储器)中的出厂代码,出厂后不可更改。大小约为 20-32KB。它是 RK3588 上电后执行的第一段代码。
1.2 Maskrom 的职责
- 最小化初始化:初始化芯片的基本硬件(时钟、内部 SRAM 等)
- 启动介质检测:按固定顺序扫描启动设备
- 加载 IDB (IDBlock):从启动介质读取第一级固件到内部 SRAM
- 固件验证:对 IDB 中包含的固件镜像进行校验和验证
- 跳转执行:将控制权移交到 TPL/SPL
1.3 Maskrom 模式
当 BootROM 在所有启动介质上都找不到有效固件时,芯片进入 Maskrom 模式(也称为 "rockusb" 模式)。在此模式下:
- 芯片通过 USB OTG 接口与主机通信
- 主机工具(如
rkdeveloptool、upgrade_tool)可以识别设备 - 可以下载固件(MiniLoader)到内部 SRAM,启动最小系统
- 这是"救砖"的基础——只要芯片能进 Maskrom,就能恢复
1.4 Maskrom 代码来源
Maskrom 代码由 Rockchip 在芯片流片时烧录,无法从软件层面读取或修改。它是整个可信启动链的信任根(Root of Trust)。
2. 启动介质与搜索顺序
2.1 支持的启动介质
RK3588 BootROM 支持的启动介质:
| 介质类型 | 接口 | 说明 |
|---|---|---|
| SPI NOR Flash | FSPI (Flexible SPI) | 通常 16MB,用于存放 boot 固件 |
| SPI NAND Flash | FSPI | 更大容量,较少使用 |
| eMMC | eMMC 5.1 | 最常用的主存储 |
| SD Card | SDMMC | 可插拔启动 |
2.2 启动搜索顺序
RK3588 BootROM 按以下顺序搜索可启动固件:
SPI NOR → SPI NAND → eMMC → SD Card → USB Maskrom 模式关键细节:
- 不是"并行扫描",而是串联优先级——先找到就用
- 如果 SPI Flash 烧录了有效固件,始终从 SPI 启动
- 如果 SPI Flash 是空的或校验失败,则往下尝试 eMMC
- 如果所有介质都找不到有效固件,进入 USB Maskrom 模式
2.3 SPL 的二次启动
SPL (U-Boot SPL) 启动后有自己的启动搜索顺序:
SD Card → eMMC → SPI Flash这与 BootROM 的顺序不同——SPL 优先尝试 SD Card 和 eMMC,最后才是 SPI Flash。
3. IDB (IDBlock) 详解
3.1 什么是 IDB
IDB(IDBlock,标识块/初始化数据块)是 RK3588 存储介质上存放 BootROM 可加载固件镜像的特殊区域。它包含:
- TPL (Tiny Program Loader):通常为
ddr.bin,负责 DDR 初始化 - SPL (Secondary Program Loader):
spl.bin,负责加载下一阶段(ATF/OP-TEE/U-Boot)
3.2 IDB 在存储介质上的位置
IDB 从 Sector 64(LBA 64,即 64 × 512B = 32KB 偏移)开始存放:
+------------------+ Sector 0 (LBA 0)
| GPT/MBR Header |
+------------------+ Sector 1-63
| 分区表/GPT Entries |
+------------------+ Sector 64 (LBA 64) ← IDB 开始
| IDB Block 0 | ← 主副本
+------------------+ Sector 1088
| IDB Block 1 | ← 备份 1
+------------------+ Sector 2112
| IDB Block 2 | ← 备份 2
+------------------+ Sector 3136
| IDB Block 3 | ← 备份 3
+------------------+ Sector 4160
| IDB Block 4 | ← 备份 4
+------------------+Sector 0-63(前 32KB)保留给分区表,因此 IDB 从 Sector 64 开始。
3.3 IDB 备份机制
IDB 共有 5 份相同的副本,分别位于:
| 副本编号 | 起始 Sector | 偏移地址 |
|---|---|---|
| 主副本 | 64 | 0x8000 (32KB) |
| 备份 1 | 1088 | 0x88000 (544KB) |
| 备份 2 | 2112 | 0x108000 (1056KB) |
| 备份 3 | 3136 | 0x188000 (1568KB) |
| 备份 4 | 4160 | 0x208000 (2080KB) |
每个副本间距为 1024 sectors = 512KB。
BootROM 读取 IDB 时,如果主副本校验失败,会依次尝试备份副本,直到找到有效固件。这正是"备份机制"的核心意义——即使在写入过程中断电,也有冗余副本可用。
3.4 IDB 内容组成
IDB 镜像(idbloader.img)由两部分拼合而成:
idbloader.img = ddr.bin (TPL) + spl.bin (SPL)- ddr.bin:负责初始化 DDR 内存控制器,使 DRAM 可用
- spl.bin:在 DDR 初始化完成后运行,负责找到并加载 ATF、OP-TEE 和 U-Boot proper
3.5 TPL (ddr.bin) 与 SPL 的关系
ddr.bin是 Rockchip 提供的闭源二进制,是一个完整的 TPL 替代品- 它不仅仅做 DDR 初始化,还实现了 BootROM → SPL 过渡所需的完整功能
- 编译时
ddr.bin和spl.bin(由 U-Boot SPL 源码编译而来)被合并为idbloader.img - 合并工具:
tools/mkimage(U-Boot 自带)
4. 完整启动流程
4.1 6 阶段启动流程
┌─────────────────────────────────────────────────────────┐
│ 阶段 1: BootROM (Maskrom) │
│ - 上电复位,执行固化在 ROM 中的代码 │
│ - 初始化 SRAM、时钟 │
│ - 按优先级扫描启动介质 │
│ - 从存储介质 Sector 64 加载 IDB 到内部 SRAM │
│ - 校验 IDB 中 TPL 固件的签名 │
│ - 跳转到 TPL 入口 │
├─────────────────────────────────────────────────────────┤
│ 阶段 2: TPL (ddr.bin) - 运行于内部 SRAM │
│ - 初始化 DDR PHY 和控制器 │
│ - 训练 DDR 时序 │
│ - 将 SPL 加载到 DRAM │
│ - 跳转到 SPL 入口 │
├─────────────────────────────────────────────────────────┤
│ 阶段 3: SPL (spl.bin) - 运行于 DRAM │
│ - 初始化更多外设(eMMC、SD、SPI 等) │
│ - 从存储介质加载 ATF (BL31) 到 DRAM │
│ - 加载 OP-TEE (BL32) 到 DRAM │
│ - 加载 U-Boot proper (BL33) 到 DRAM │
│ - 返回到 ATF │
├─────────────────────────────────────────────────────────┤
│ 阶段 4: ATF (BL31) - EL3 │
│ - 配置安全监控调用 (SMC) │
│ - 初始化 PSCI (CPU idle/hotplug) │
│ - 切换到 S-EL1 启动 OP-TEE │
├─────────────────────────────────────────────────────────┤
│ 阶段 5: OP-TEE (BL32) - S-EL1 │
│ - 初始化可信执行环境 (TEE) │
│ - 建立安全存储、安全时钟等 │
│ - 返回到 ATF (EL3) │
├─────────────────────────────────────────────────────────┤
│ 阶段 6: U-Boot (BL33) - EL2 │
│ - 初始化剩余外设(显示、网络、USB 等) │
│ - 加载内核 (Image/Image.gz) 和 DTB │
│ - 准备内核命令行参数 (cmdline) │
│ - 通过 booti 跳转到内核 │
└─────────────────────────────────────────────────────────┘4.2 异常级别切换流程
EL3 (ATF/BL31)
│
├─→ S-EL1 (OP-TEE/BL32)
│ └─→ 初始化完成后返回 EL3
│
└─→ EL2 (U-Boot/BL33)
└─→ 启动内核时切换到 EL2 → EL1 (Linux Kernel)4.3 各阶段存储位置
| 阶段 | 镜像 | 存储位置 | 加载到 |
|---|---|---|---|
| TPL | ddr.bin (idbloader.img) | eMMC/SPI Sector 64 | 内部 SRAM |
| SPL | spl.bin (idbloader.img) | eMMC/SPI Sector 64+ | DRAM |
| ATF | bl31.img | boot 分区 (FIT) | DRAM |
| OP-TEE | tee.bin | boot 分区 (FIT) | DRAM (安全区域) |
| U-Boot | u-boot.bin | boot 分区 (FIT) | DRAM |
| Linux | Image + DTB | boot 分区 | DRAM |
5. U-Boot 编译流程
5.1 编译脚本调用链
build.sh
└─→ make.sh
├─→ 环境配置与依赖检查
├─→ make <defconfig>
├─→ make all
│ ├─→ 编译 TPL/SPL(如果从 U-Boot 源码编译)
│ ├─→ 编译 ATF (BL31)
│ ├─→ 编译 OP-TEE (BL32)
│ └─→ 编译 U-Boot proper (BL33)
└─→ pack_images()
├─→ 生成 idbloader.img (ddr.bin + u-boot-spl.bin)
├─→ 生成 uboot.img / u-boot.itb (FIT 镜像)
└─→ 组装 trust.img (ATF + OP-TEE + U-Boot)5.2 三种打包模式
| 模式 | 输出文件 | 说明 |
|---|---|---|
| FIT | u-boot.itb | Flattened Image Tree,将所有固件打包为单个镜像 |
| DECOMP | 分散文件 | 各镜像独立存放(用于调试) |
| RKFW(默认) | update.img | Rockchip 固件包格式,包含完整分区和固件 |
5.3 关键文件对应关系
| 输出文件 | 组成 | 用途 |
|---|---|---|
idbloader.img | ddr.bin + spl.bin | 烧录到 IDB 区域 (Sector 64) |
u-boot.itb / uboot.img | bl31.elf + tee.bin + u-boot-nodtb.bin + u-boot.dtb | 放到 boot 分区 |
trust.img | bl31.elf + tee.bin | 安全固件包(部分方案使用) |
update.img | 完整固件包 | RKDevTool 一键烧录 |
5.4 FIT 镜像生成函数 fit_gen_uboot_itb()
以下是 RK3588 U-Boot make.sh 中生成 FIT 镜像的关键逻辑:
fit_gen_uboot_itb()
1. 准备 bl31.elf (ATF), tee.bin (OP-TEE), u-boot-nodtb.bin, u-boot.dtb
2. 调用 mkimage 工具创建 FIT 镜像
3. 可选:使用 RSA 密钥对其进行签名
4. 输出 u-boot.itb 或 uboot.img如果启用了 CONFIG_FIT_SIGNATURE,还会使用 RSA 密钥签名,使 U-Boot SPL 在加载时验证镜像完整性。
6. FIT 镜像分析
6.1 什么是 FIT
FIT(Flattened Image Tree)是 U-Boot 的一种固件打包格式,使用 Device Tree 语法描述镜像结构。它将多个二进制镜像组织到一个 .itb 文件中。
6.2 FIT 镜像结构
典型的 RK3588 FIT 镜像 (u-boot.itb) 内部结构:
u-boot.itb (FIT Image)
├── FIT Header
├── Image Tree (Device Tree 格式,描述镜像结构)
├── configuration-1
│ ├── fdt: u-boot.dtb
│ │ └── hash@1 (SHA256)
│ ├── firmware: u-boot-nodtb.bin (BL33)
│ │ └── hash@1 (SHA256)
│ ├── loadables: bl31.elf (ATF/BL31)
│ │ └── hash@1 (SHA256)
│ └── loadables: tee.bin (OP-TEE/BL32)
│ └── hash@1 (SHA256)
└── (可选的 RSA 签名)6.3 编译输出数据分析
以下是实际编译输出中 FIT 镜像的组成部分(来自实际日志):
| 组件 | 文件名 | 典型大小 |
|---|---|---|
| ATF (BL31) | bl31.elf | ~80KB |
| OP-TEE (BL32) | tee.bin | ~300KB |
| U-Boot | u-boot-nodtb.bin | ~1MB |
| Device Tree | u-boot.dtb | ~180KB |
| 总计 | u-boot.itb | ~1.5-2MB |
6.4 SPL 加载 FIT 的过程
- SPL 从存储介质的 boot 分区读取
u-boot.itb - SPL 解析 FIT header,找到各组件的位置
- SPL 验证每个组件的哈希值(如启用了验证)
- SPL 将 ATF (BL31) 和 OP-TEE (BL32) 加载到安全 DRAM 区域
- SPL 将 U-Boot (BL33) 加载到 DRAM
- SPL 返回到 ATF (BL31),ATF 再依次初始化 OP-TEE 和 U-Boot
7. Miniloader 详解
7.1 什么是 Miniloader
Miniloader 是一个小型引导加载程序,通常在 Maskrom 模式下通过 upgrade_tool 的 db 命令下载到芯片内部 SRAM 中运行。它是 Maskrom 模式下与主机通信、执行烧录操作的基础。
7.2 Miniloader 的作用
- 在 Maskrom 模式下初始化 DDR 和基本外设
- 使主机可以读写 eMMC/SPI Flash 等存储介质
- 是执行
ul(upload/write loader)和wl(write at LBA)命令的前提 - 相当于"烧录模式下的最小系统"
7.3 Miniloader 生成流程
Miniloader 由 boot_merger 工具生成:
RK3588MINIALL.ini (配置文件)
│
├── DDR_BIN: 指定 ddr.bin 路径
├── USBDIDR: 指定 USB 描述符相关配置
├── FLASH_CONFIG: 指定 Flash 配置
│
└─→ boot_merger 工具
└─→ 生成 MiniloaderAll.bin (Miniloader)7.4 Miniloader 与 IDB 的关系
- IDB(idbloader.img)是上电自动加载的固件
- Miniloader 是 Maskrom 模式下通过 USB 下载的固件
- 两者功能相似(都包含 DDR 初始化 + 基本驱动),但在不同阶段使用
8. 分区表与存储布局
8.1 GPT 分区表
RK3588 使用 GPT(GUID Partition Table)分区表格式。分区信息由 parameter.txt 定义:
# 示例 parameter.txt 片段
CMDLINE: mtdparts=rk29xxnand:
0x00002000@0x00002000(uboot),
0x00010000@0x00004000(boot),
0x00020000@0x00014000(rootfs),
-@0x00034000(userdata)8.2 分区偏移计算
UI 中显示的分区偏移(如 0x26000)是以 Sector (512B) 为单位:
| 分区 | 起始 Sector | 结束 Sector | 标签 | 大小 |
|---|---|---|---|---|
| uboot | 0x2000 (8192) | 0x3FFF | "uboot" | 4MB |
| boot | 0x4000 (16384) | 0x13FFF | "boot" | 32MB |
| rootfs | 0x14000 (81920) | 0x33FFF | "rootfs" | 约 64MB |
| userdata | 0x34000 (212992) | 末尾 | "userdata" | 剩余空间 |
实际偏移字节数 = Sector 号 × 512。
8.3 典型的 eMMC 完整布局
┌─────────────────┐ Sector 0 (LBA 0)
│ MBR (Protective)│
├─────────────────┤ Sector 1
│ GPT Header │
├─────────────────┤ Sector 2-63
│ GPT Entries │ (共 32KB,可容纳 128 个分区条目)
├─────────────────┤ Sector 64 (0x8000)
│ │
│ IDB (主 + 4备份) │ 5 份副本,占约 2.5MB
│ │
├─────────────────┤ Sector 0x2000 (8192)
│ uboot 分区 │ idbloader.img 的原始副本(可选)
├─────────────────┤ Sector 0x4000 (16384)
│ boot 分区 │ u-boot.itb (FIT) + Linux Kernel + DTB
├─────────────────┤ Sector 0x14000 (81920)
│ rootfs 分区 │ Ubuntu 根文件系统 (ext4)
├─────────────────┤ Sector 0x34000 (212992)
│ userdata 分区 │ 用户数据 (ext4)
└─────────────────┘8.4 PARTUUID 格式
GPT 分区表的 PARTUUID
GPT 分区使用完整的 36 字符 UUID(格式: 8-4-4-4-12):
PARTUUID=614e0000-0000-4b53-8000-1d28000054a9MBR 分区表的 PARTUUID
MBR 分区使用 SSSSSSSS-PP 格式:
PARTUUID=009009-09其中 SSSSSSSS 是 32 位 NT 磁盘签名(零填充的十六进制),PP 是分区号(零填充的十六进制,从 1 开始)。
注意事项
- GPT 分区必须使用完整 UUID,不能简写
614e0000-0000这种短格式既不是有效的 GPT UUID,也不符合 MBR 格式- 可以在系统运行后通过以下命令验证:
ls -l /dev/disk/by-partuuid/
blkid | grep PARTUUID9. 烧录机制与地址映射
9.1 upgrade_tool 关键命令
| 命令 | 全称 | 作用 | 目标地址 |
|---|---|---|---|
db | download boot | 下载 Miniloader 到芯片内部 SRAM 并执行 | SRAM(非存储介质地址) |
ul | upload loader | 将 idbloader.img 写入存储介质 IDB 区域 | 自动写入 Sector 64 |
wl | write at LBA | 将数据写入存储介质的指定 LBA 位置 | 用户指定的 LBA |
rd | read | 从存储介质读取数据 | 用户指定的 LBA |
ef | erase flash | 擦除指定存储介质 | 指定介质 |
ssd | show storage device | 列出所有存储设备及其容量 | - |
9.2 烧录地址映射表
烧录时工具内部维护的地址映射:
| 逻辑名称 | LBA 偏移 (Sector) | 字节偏移 | 内容 |
|---|---|---|---|
| gpt | 0x00 (0) | 0x000000 | GPT Partition Table |
| idblock | 0x40 (64) | 0x008000 | idbloader.img (IDB) |
| uboot | 0x2000 (8192) | 0x400000 | uboot.img (uboot 分区) |
| boot | 0x4000 (16384) | 0x800000 | boot.img (boot 分区) |
| rootfs | 0x14000 (81920) | 0x2800000 | rootfs (rootfs 分区) |
| userdata | 0x34000 (212992) | 0x6800000 | userdata (userdata 分区) |
9.3 关键地址对应关系
0x00= Sector 0,是 GPT 分区表0x40(Sector 64) = IDB 开始位置- BootROM 搜索 Sector 64(而不是 Sector 0)
wl 0x2000 uboot.img= 将 uboot.img 写入 LBA 8192(即 4MB 偏移处)ul idbloader.img= 自动写入 IDB 全部 5 份副本(Sector 64-4160)
9.4 IDB 写入行为
当执行 ul 命令写入 IDB 时:
ddr.bin+spl.bin被合并为 idblock 格式- 第一份写入 Sector 64-1087
- 重复 4 次备份:
- 备份 1: Sector 1088-2111
- 备份 2: Sector 2112-3135
- 备份 3: Sector 3136-4159
- 备份 4: Sector 4160-5183
9.5 wl 与 ul 的区别
| 命令 | 目标 | 行为 |
|---|---|---|
ul | IDB 专用 | 自动写入 Sector 64 起的所有 5 份 IDB 备份 |
wl | 通用 | 按用户指定的 LBA 写入,不自动处理备份 |
10. SPI Loader 跳转到 eMMC U-Boot
10.1 场景描述
当 SPI Flash 作为主启动介质(存放 IDB 和 U-Boot),但希望在 eMMC 上运行完整的 Linux 系统时,SPI 中的 U-Boot SPL 需要将控制权转移到 eMMC 上的 U-Boot。
10.2 实现方式
在 SPI Flash 中存放:
- IDB (ddr.bin + spl.bin) — SPL 从 SPI 加载
- U-Boot FIT (u-boot.itb) — 可以放在 SPI 或 eMMC
加载链:
SPI BootROM → SPI SPL → 从 eMMC boot 分区加载 u-boot.itb → U-Boot → Linux10.3 SPL 的设备选择
SPL 通过设备树或配置选择从哪里加载下一阶段镜像。在 U-Boot 的 SPL 配置中,可以设置 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 来指定 eMMC 上 U-Boot 的位置。
10.4 FSPI (Flexible SPI) 控制器
FSPI 控制器通过 CONFIG_SPL_SPI_FLASH_SUPPORT 和相关配置启用。SPL 使用 FSPI 驱动读取 SPI NOR Flash 内容(包括 FIT 镜像)。
11. 固件版本兼容性
11.1 DDR bin 与 BL31 的版本依赖
DDR 固件(ddr.bin)在内部 SRAM 中运行,完成后将 DRAM 控制权移交给 ATF(BL31)。两者之间存在握手协议。
关键版本标识:
| Magic 值 | 版本 | 兼容性 |
|---|---|---|
0xFead0001 | 旧版 ddr.bin | 需搭配对应旧版 BL31 |
0xFead0004 | 新版 ddr.bin | 需搭配对应新版 BL31 |
0xFead0005 | 最新版 | 需搭配对应新版 BL31 |
11.2 版本不匹配的症状
如果 ddr.bin 和 BL31 版本不兼容:
- 设备可能卡在启动阶段(DDR 初始化后立即崩溃)
- 出现 DDR 相关或 SError 异常
- 串口输出停在上电阶段不再继续
11.3 解决方案
- 始终从同一 SDK 版本中取 ddr.bin 和 BL31
- 版本信息可以从 Rockchip 芯片手册对应版本号章节确认
- 不要混用不同 SDK 版本的 ddr.bin 和 BL31
12. 关键命令行工具
12.1 upgrade_tool
Linux 下用于与 RK3588 Maskrom/Loader 模式通信的工具。
常用命令:
# 列出所有连接的 Rockchip 设备
upgrade_tool ld
# 列出存储设备
upgrade_tool ssd
# 下载 Miniloader 到 SRAM 并执行
upgrade_tool db MiniloaderAll.bin
# 写入 IDB(自动写入 5 份副本)
upgrade_tool ul idbloader.img
# 在指定 LBA 写入数据
upgrade_tool wl 0x2000 uboot.img
# 在指定 LBA 读取数据到文件
upgrade_tool rl 0x2000 0x4000 dump.bin
# 擦除 eMMC
upgrade_tool ef12.2 rkdeveloptool
开源替代工具,功能和 upgrade_tool 类似:
# 列出设备
rkdeveloptool ld
# 下载并执行固件
rkdeveloptool db MiniloaderAll.bin
# 写入 GPT 分区表
rkdeveloptool gpt parameter.txt
# 按分区名写入
rkdeveloptool wl 0x2000 uboot.img # 按 LBA 写入
rkdeveloptool wlx uboot uboot.img # 按分区名写入12.3 RKDevTool
Windows GUI 工具,支持一键烧录 update.img 或逐分区配置烧录。
13. SPI 镜像分析案例
13.1 案例概述
用户提供了一个 SPI 烧录镜像,大小约为 16MB(对应典型的 SPI NOR Flash 容量)。
13.2 镜像结构分析
使用 hexdump -C 分析的 SPI 镜像布局:
| 偏移 | 大小 | 内容 | 说明 |
|---|---|---|---|
| 0x000000 | ~512KB | IDB (5 副本) | ddr.bin + spl.bin,分布在 5 个备份位置 |
| 0x080000 | ~2MB | u-boot.itb | FIT 镜像,包含 ATF + OP-TEE + U-Boot |
| 其余 | - | 未使用/填充 | 剩余 SPI Flash 空间 |
13.3 识别 IDB 的方法
通过搜索 IDB 的 Magic 签名可以定位 IDB 副本:
hexdump -C spi_image.bin | grep "IDB\|idblock\|fead"13.4 SPI 镜像的生成方法
通常使用以下流程生成 SPI 烧录镜像:
- 创建一个与 SPI Flash 容量相同的空文件
- 将 IDB 写入 Sector 64 偏移处
- 将 u-boot.itb 写入 boot 分区位置
- 输出完整的 SPI 镜像文件(如
spi_image.img)
14. 常见问题排查
14.1 找不到 root 分区
症状: 内核启动后打印 Waiting for root file system... 然后重启
常见原因与解决:
| 原因 | 解决方法 |
|---|---|
PARTUUID 不完整 (如 root=PARTUUID=614e0000-0000) | 使用完整 UUID: root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 |
| rootfs 分区为空 | 检查 rootfs 是否已正确烧录 |
| 文件系统损坏 | 通过 Maskrom 模式重新烧录 rootfs |
| MMC 驱动未加载 | 使用设备名 /dev/mmcblk0p3 替代 PARTUUID |
14.2 设备反复重启到 Maskrom
症状: 设备上电后直接进入 Maskrom 模式
原因:
- eMMC 存储为空(全新芯片或被擦除)
- IDB 区域损坏
- SPI Flash 为空但有 SPI 芯片
解决:
- 检查
upgrade_tool ssd输出确认存储设备状态 - 用
db下载 Miniloader,然后ul写入 IDB - 如仍无法启动,使用完整的
update.img进行uf更新
14.3 DDR 初始化失败
症状: 设备在 TPL 阶段挂起,串口无输出或仅有 BootROM 输出
原因:
- DDR bin 版本与硬件不匹配
- DDR 电源问题
- BL31 版本与 ddr.bin 不兼容
解决:
- 确认使用正确的 ddr.bin(从对应 SDK 版本提取)
- 检查 DDR bin 和 BL31 的 Magic 值是否兼容
- 尝试从不同 SDK 版本获取匹配的固件
14.4 SPL 无法找到 u-boot.itb
症状: SPL 打印 "Trying to boot from MMC1" 或 "SPL: failed to boot from all boot devices"
原因:
- uboot.img 未正确烧录到 boot 分区
- boot 分区的 LBA 偏移配置错误
- FIT 镜像签名失败(如果启用了验证)
解决:
- 用
upgrade_tool wl确认 boot 分区的 LBA 地址 - 检查 boot 分区内容:
upgrade_tool rl 0x4000 0x4000 boot_dump.bin - 使用
dumpimage -l u-boot.itb检查 FIT 镜像结构是否正确
15. 附录
附录 A: 常用验证命令
# 查看分区表
sudo gdisk -l /dev/mmcblk0
# 查看 PARTUUID 符号链接
ls -l /dev/disk/by-partuuid/
ls -l /dev/disk/by-partlabel/
# 查看块设备信息
blkid
# 查看 U-Boot FIT 镜像内容
dumpimage -l u-boot.itb
# 查看 hexdump(搜索特定签名)
hexdump -C idbloader.img | head -100
# 查看 U-Boot 环境变量
fw_printenv附录 B: 关键配置文件
| 文件 | 位置 | 作用 |
|---|---|---|
parameter.txt | SDK 根目录 | 定义分区布局 |
RK3588MINIALL.ini | SDK rkbin/ 目录 | Miniloader 和 IDB 配置 |
package-file | SDK 根目录 | 定义 update.img 打包方式 |
.config | U-Boot 源码目录 | U-Boot 编译配置 |
附录 C: 参考资源
- Rockchip RK3588 TRM (Technical Reference Manual)
- Rockchip Linux SDK 文档
- U-Boot 源码
doc/README.rockchip - ATF (ARM Trusted Firmware) 文档
文档生成日期: 2026-05-10 基于对话内容: 多轮 RK3588 启动与分区相关技术讨论