Skip to content

RK3588 系统分区与启动流程完整分析

字数
5118 字
阅读时间
23 分钟

本文档基于对 RK3588 平台的系统分析,涵盖 BootROM、分区布局、U-Boot 编译、FIT 镜像、Miniloader、烧录机制等关键技术主题。


目录

  1. RK3588 BootROM (Maskrom) 机制
  2. 启动介质与搜索顺序
  3. IDB (IDBlock) 详解
  4. 完整启动流程
  5. U-Boot 编译流程
  6. FIT 镜像分析
  7. Miniloader 详解
  8. 分区表与存储布局
  9. 烧录机制与地址映射
  10. SPI Loader 跳转到 eMMC U-Boot
  11. 固件版本兼容性
  12. 关键命令行工具
  13. SPI 镜像分析案例
  14. 常见问题排查
  15. 附录

1. RK3588 BootROM (Maskrom) 机制

1.1 什么是 Maskrom

Maskrom 是固化在 RK3588 芯片内部 ROM(只读存储器)中的出厂代码,出厂后不可更改。大小约为 20-32KB。它是 RK3588 上电后执行的第一段代码。

1.2 Maskrom 的职责

  1. 最小化初始化:初始化芯片的基本硬件(时钟、内部 SRAM 等)
  2. 启动介质检测:按固定顺序扫描启动设备
  3. 加载 IDB (IDBlock):从启动介质读取第一级固件到内部 SRAM
  4. 固件验证:对 IDB 中包含的固件镜像进行校验和验证
  5. 跳转执行:将控制权移交到 TPL/SPL

1.3 Maskrom 模式

当 BootROM 在所有启动介质上都找不到有效固件时,芯片进入 Maskrom 模式(也称为 "rockusb" 模式)。在此模式下:

  • 芯片通过 USB OTG 接口与主机通信
  • 主机工具(如 rkdeveloptoolupgrade_tool)可以识别设备
  • 可以下载固件(MiniLoader)到内部 SRAM,启动最小系统
  • 这是"救砖"的基础——只要芯片能进 Maskrom,就能恢复

1.4 Maskrom 代码来源

Maskrom 代码由 Rockchip 在芯片流片时烧录,无法从软件层面读取或修改。它是整个可信启动链的信任根(Root of Trust)。


2. 启动介质与搜索顺序

2.1 支持的启动介质

RK3588 BootROM 支持的启动介质:

介质类型接口说明
SPI NOR FlashFSPI (Flexible SPI)通常 16MB,用于存放 boot 固件
SPI NAND FlashFSPI更大容量,较少使用
eMMCeMMC 5.1最常用的主存储
SD CardSDMMC可插拔启动

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偏移地址
主副本640x8000 (32KB)
备份 110880x88000 (544KB)
备份 221120x108000 (1056KB)
备份 331360x188000 (1568KB)
备份 441600x208000 (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.binspl.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 各阶段存储位置

阶段镜像存储位置加载到
TPLddr.bin (idbloader.img)eMMC/SPI Sector 64内部 SRAM
SPLspl.bin (idbloader.img)eMMC/SPI Sector 64+DRAM
ATFbl31.imgboot 分区 (FIT)DRAM
OP-TEEtee.binboot 分区 (FIT)DRAM (安全区域)
U-Bootu-boot.binboot 分区 (FIT)DRAM
LinuxImage + DTBboot 分区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 三种打包模式

模式输出文件说明
FITu-boot.itbFlattened Image Tree,将所有固件打包为单个镜像
DECOMP分散文件各镜像独立存放(用于调试)
RKFW(默认)update.imgRockchip 固件包格式,包含完整分区和固件

5.3 关键文件对应关系

输出文件组成用途
idbloader.imgddr.bin + spl.bin烧录到 IDB 区域 (Sector 64)
u-boot.itb / uboot.imgbl31.elf + tee.bin + u-boot-nodtb.bin + u-boot.dtb放到 boot 分区
trust.imgbl31.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-Bootu-boot-nodtb.bin~1MB
Device Treeu-boot.dtb~180KB
总计u-boot.itb~1.5-2MB

6.4 SPL 加载 FIT 的过程

  1. SPL 从存储介质的 boot 分区读取 u-boot.itb
  2. SPL 解析 FIT header,找到各组件的位置
  3. SPL 验证每个组件的哈希值(如启用了验证)
  4. SPL 将 ATF (BL31) 和 OP-TEE (BL32) 加载到安全 DRAM 区域
  5. SPL 将 U-Boot (BL33) 加载到 DRAM
  6. SPL 返回到 ATF (BL31),ATF 再依次初始化 OP-TEE 和 U-Boot

7. Miniloader 详解

7.1 什么是 Miniloader

Miniloader 是一个小型引导加载程序,通常在 Maskrom 模式下通过 upgrade_tooldb 命令下载到芯片内部 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标签大小
uboot0x2000 (8192)0x3FFF"uboot"4MB
boot0x4000 (16384)0x13FFF"boot"32MB
rootfs0x14000 (81920)0x33FFF"rootfs"约 64MB
userdata0x34000 (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-1d28000054a9

MBR 分区表的 PARTUUID

MBR 分区使用 SSSSSSSS-PP 格式:

PARTUUID=009009-09

其中 SSSSSSSS 是 32 位 NT 磁盘签名(零填充的十六进制),PP 是分区号(零填充的十六进制,从 1 开始)。

注意事项

  • GPT 分区必须使用完整 UUID,不能简写
  • 614e0000-0000 这种短格式既不是有效的 GPT UUID,也不符合 MBR 格式
  • 可以在系统运行后通过以下命令验证:
bash
ls -l /dev/disk/by-partuuid/
blkid | grep PARTUUID

9. 烧录机制与地址映射

9.1 upgrade_tool 关键命令

命令全称作用目标地址
dbdownload boot下载 Miniloader 到芯片内部 SRAM 并执行SRAM(非存储介质地址)
ulupload loader将 idbloader.img 写入存储介质 IDB 区域自动写入 Sector 64
wlwrite at LBA将数据写入存储介质的指定 LBA 位置用户指定的 LBA
rdread从存储介质读取数据用户指定的 LBA
eferase flash擦除指定存储介质指定介质
ssdshow storage device列出所有存储设备及其容量-

9.2 烧录地址映射表

烧录时工具内部维护的地址映射:

逻辑名称LBA 偏移 (Sector)字节偏移内容
gpt0x00 (0)0x000000GPT Partition Table
idblock0x40 (64)0x008000idbloader.img (IDB)
uboot0x2000 (8192)0x400000uboot.img (uboot 分区)
boot0x4000 (16384)0x800000boot.img (boot 分区)
rootfs0x14000 (81920)0x2800000rootfs (rootfs 分区)
userdata0x34000 (212992)0x6800000userdata (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 时:

  1. ddr.bin + spl.bin 被合并为 idblock 格式
  2. 第一份写入 Sector 64-1087
  3. 重复 4 次备份:
    • 备份 1: Sector 1088-2111
    • 备份 2: Sector 2112-3135
    • 备份 3: Sector 3136-4159
    • 备份 4: Sector 4160-5183

9.5 wlul 的区别

命令目标行为
ulIDB 专用自动写入 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 → Linux

10.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 模式通信的工具。

常用命令:

bash
# 列出所有连接的 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 ef

12.2 rkdeveloptool

开源替代工具,功能和 upgrade_tool 类似:

bash
# 列出设备
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~512KBIDB (5 副本)ddr.bin + spl.bin,分布在 5 个备份位置
0x080000~2MBu-boot.itbFIT 镜像,包含 ATF + OP-TEE + U-Boot
其余-未使用/填充剩余 SPI Flash 空间

13.3 识别 IDB 的方法

通过搜索 IDB 的 Magic 签名可以定位 IDB 副本:

bash
hexdump -C spi_image.bin | grep "IDB\|idblock\|fead"

13.4 SPI 镜像的生成方法

通常使用以下流程生成 SPI 烧录镜像:

  1. 创建一个与 SPI Flash 容量相同的空文件
  2. 将 IDB 写入 Sector 64 偏移处
  3. 将 u-boot.itb 写入 boot 分区位置
  4. 输出完整的 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 芯片

解决:

  1. 检查 upgrade_tool ssd 输出确认存储设备状态
  2. db 下载 Miniloader,然后 ul 写入 IDB
  3. 如仍无法启动,使用完整的 update.img 进行 uf 更新

14.3 DDR 初始化失败

症状: 设备在 TPL 阶段挂起,串口无输出或仅有 BootROM 输出

原因:

  • DDR bin 版本与硬件不匹配
  • DDR 电源问题
  • BL31 版本与 ddr.bin 不兼容

解决:

  1. 确认使用正确的 ddr.bin(从对应 SDK 版本提取)
  2. 检查 DDR bin 和 BL31 的 Magic 值是否兼容
  3. 尝试从不同 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 镜像签名失败(如果启用了验证)

解决:

  1. upgrade_tool wl 确认 boot 分区的 LBA 地址
  2. 检查 boot 分区内容:upgrade_tool rl 0x4000 0x4000 boot_dump.bin
  3. 使用 dumpimage -l u-boot.itb 检查 FIT 镜像结构是否正确

15. 附录

附录 A: 常用验证命令

bash
# 查看分区表
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.txtSDK 根目录定义分区布局
RK3588MINIALL.iniSDK rkbin/ 目录Miniloader 和 IDB 配置
package-fileSDK 根目录定义 update.img 打包方式
.configU-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 启动与分区相关技术讨论

贡献者

The avatar of contributor named as Px Px

页面历史

撰写