3、RK3568硬件与启动流程:芯片架构、DDR初始化与分区布局

RK3568 是瑞芯微推出的一款高性能、低功耗的通用型 SoC,广泛应用于边缘计算、工业控制、智能终端和 NAS 等场景。要完成 rootfs 的构建与系统部署,首先必须理解这颗芯片的硬件组成、启动顺序以及存储分区布局。本章将从芯片内部架构出发,逐步拆解从 ROM 代码到内核挂载 rootfs 的完整链路,并结合实际开发板的分区表进行案例拆解,帮助读者建立从硬件复位到用户空间运行的全局视图。

RK3568 启动流程与分区布局总览 BootROM (固化代码) 加载 DTB 与 U-Boot DDR 初始化 训练与频率设定 U-Boot SPL 初始化时钟/串口 U-Boot TPL (可选) DDR 二次训练 U-Boot 主镜像 加载内核与 DTB eMMC / SD 卡分区布局 idbloader (SPL+TPL) u-boot.itb boot (内核+DTB) rootfs (ext4) userdata (可扩展) 启动介质选择: 1. eMMC 优先 2. SD 卡回退 3. SPI NOR Flash Linux Kernel 挂载 rootfs /sbin/init 用户空间起点 关键点:DDR 初始化失败会导致 U-Boot 无法运行;分区表偏移错误会导致内核无法找到 rootfs

3.1 RK3568 芯片架构核心模块

RK3568 采用四核 ARM Cortex-A55 架构,最高主频 2.0GHz,集成 Mali-G52 GPU 和 0.8 TOPS 算力的 NPU。从系统部署视角看,需要重点关注的模块包括:

  • CPU 簇:4×Cortex-A55,支持 64 位指令集,是运行 Linux 内核和应用程序的主处理单元。
  • DDR 控制器:支持 DDR4/LPDDR4/LPDDR4X,最高频率 1600MHz,位宽 32bit/16bit 可配。DDR 初始化参数直接影响系统稳定性。
  • 存储接口:eMMC 5.1、SD 3.0、SPI NOR/NAND Flash 控制器,决定了系统固件的存放介质。
  • 显示与多媒体:HDMI 2.0、MIPI DSI、LVDS 等显示接口,以及 VPU 视频编解码单元。
  • 外设总线:PCIe 3.0、USB 3.0、GMAC 以太网、I2C/SPI/UART 等,用于连接外围设备。

在构建 rootfs 时,CPU 架构决定编译工具链(aarch64-linux-gnu-),DDR 容量影响 swap 分区和内存分配策略,而存储接口类型则决定了 bootloader 和内核镜像的烧写方式。

核心原理:RK3568 的启动过程是一个多级引导链。芯片内部的 BootROM 固化在硅片上,上电后首先执行,它负责从选定的启动介质(eMMC、SD、SPI)读取第一级引导代码。由于 BootROM 无法直接识别 ext4 等文件系统,因此引导代码必须存放在特定偏移位置,且格式为裸二进制或特定封装格式。

3.2 启动顺序与各阶段职责

RK3568 的完整启动链路分为五个阶段,每个阶段都有明确的输入输出和职责边界:

阶段 代码载体 主要职责 输出产物
1. BootROM 芯片内部 ROM 初始化时钟、检测启动介质、加载 idbloader 跳转到 DDR 中的 SPL 代码
2. DDR 初始化 TPL/SPL 内嵌驱动 配置 DDR 控制器、训练时序、设置频率 DDR 可正常读写
3. U-Boot SPL idbloader.img 初始化串口、时钟、存储控制器,加载 U-Boot 主镜像 跳转到 U-Boot 主镜像
4. U-Boot 主镜像 u-boot.itb 加载内核镜像与 DTB 到内存,设置启动参数 跳转到内核入口
5. Linux Kernel boot.img 中的 Image 初始化设备驱动、挂载 rootfs、执行 /sbin/init 用户空间进程启动

在实际开发中,DDR 初始化是最容易出问题的环节。RK3568 的 DDR 驱动会根据硬件设计(芯片型号、位宽、通道数)自动训练,但若板级硬件有改动(如更换 DDR 颗粒),必须重新生成 TPL 并更新 idbloader。常见的错误现象是:串口无输出、U-Boot 反复重启、内存测试报错。

判断方法:当板卡上电后串口完全无输出时,优先检查 BootROM 是否成功加载 idbloader。可通过示波器测量 eMMC 的 CLK 引脚是否有时钟信号,或使用 RKDevTool 的日志模式观察芯片是否进入 MaskROM 模式。

3.3 分区布局与偏移地址

RK3568 的存储介质(eMMC 或 SD 卡)采用固定偏移的分区方案,不同于 PC 上常见的 GPT/MBR 分区表。固件烧写工具(如 RKDevTool、upgrade_tool)直接按偏移地址写入镜像,而不是通过分区表识别。标准布局如下:

偏移地址      分区名          大小        内容
0x00000000    idbloader      4MB         SPL + TPL + DDR 初始化代码
0x00004000    u-boot.itb     8MB         U-Boot 主镜像(含 FIT 封装)
0x0000C000    boot          64MB         Linux 内核 Image + DTB
0x0001C000    rootfs        512MB~2GB   rootfs 镜像(ext4 或 squashfs)
0x0009C000    userdata      剩余空间     用户数据分区(可选)

这里的偏移地址以 512 字节扇区为单位。例如,idbloader 从扇区 0 开始,u-boot.itb 从扇区 0x4000(即 8MB 偏移)开始。这种固定偏移设计简化了 BootROM 的查找逻辑,但也意味着修改分区大小必须同步调整烧写脚本和内核 cmdline 中的 root 参数。

风险提示:如果 boot 分区大小被修改,但内核 cmdline 中的 root=/dev/mmcblk0pX 没有同步更新,内核将无法找到 rootfs,导致启动失败。建议在构建系统时使用 PARTLABEL 或 UUID 方式挂载 rootfs,避免依赖固定的分区编号。

3.4 实战案例:从串口日志定位启动故障

假设我们拿到一块自研 RK3568 核心板,烧写官方固件后上电,串口输出如下:

U-Boot SPL board init
U-Boot SPL 2017.09-rockchip
Trying to boot from MMC1
U-Boot 2017.09-rockchip (Jan 05 2024 - 10:30:00)
DRAM:  2 GiB
MMC:   mmc@fe310000: 0
Loading Environment from MMC... OK
Model: Rockchip RK3568 Evaluation Board
Net:   eth0: ethernet@fe2a0000
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
reading boot.scr
** Unable to read file boot.scr **

从日志看,U-Boot 已成功初始化 DDR 和 eMMC,但在读取 boot.scr 时失败。这说明 boot 分区中的文件系统可能损坏,或者分区偏移不正确。进一步排查步骤:

  1. 在 U-Boot 命令行执行 mmc list 确认 eMMC 设备识别正常。
  2. 执行 part list mmc 0 查看分区表,确认 boot 分区是否存在。
  3. 执行 ls mmc 0:1 列出 boot 分区内容,检查内核镜像是否完整。
  4. 若分区内容为空,重新烧写 boot.img,并核对烧写脚本中的偏移地址。

最终发现是烧写工具使用了错误的偏移参数,导致内核镜像写入了错误位置。修正偏移后,系统正常启动。这个案例说明,理解分区偏移是排障的基础。

3.5 常见误区与总结复盘

在 RK3568 系统部署中,以下误区需要特别留意:

  • 误区一:认为 U-Boot 可以读取 ext4 格式的 rootfs。实际上 U-Boot 只负责加载内核和 DTB,rootfs 的挂载由内核完成。U-Boot 需要的是 boot 分区中的内核镜像文件,通常为 Image 或 zImage 格式。
  • 误区二:忽略 DDR 初始化参数。更换 DDR 颗粒或调整频率后,必须重新生成 TPL。否则可能出现内存不稳定、随机死机等问题。
  • 误区三:混淆 eMMC 和 SD 卡的启动顺序。RK3568 默认优先从 eMMC 启动,若 eMMC 中没有有效固件,才会回退到 SD 卡。调试时可通过拨码开关或 BootROM 引脚强制选择启动介质。
  • 误区四:分区大小随意修改。修改分区大小后,需要同步更新烧写脚本、内核 cmdline 以及可能的 fstab 文件,否则系统无法正常挂载。
总结复盘:掌握 RK3568 的启动流程,本质上是理解一条从硬件复位到用户空间的链路。每个阶段都有明确的输入输出和失败模式。在实际项目中,建议建立一份启动日志基线,记录正常启动时的串口输出,便于后续对比排障。同时,将分区布局表纳入版本管理,任何修改都需经过评审,避免因偏移错误导致批量生产事故。