3、RK3568硬件与启动流程:芯片架构、DDR初始化与分区布局
RK3568 是瑞芯微推出的一款高性能、低功耗的通用型 SoC,广泛应用于边缘计算、工业控制、智能终端和 NAS 等场景。要完成 rootfs 的构建与系统部署,首先必须理解这颗芯片的硬件组成、启动顺序以及存储分区布局。本章将从芯片内部架构出发,逐步拆解从 ROM 代码到内核挂载 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 和内核镜像的烧写方式。
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 反复重启、内存测试报错。
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 参数。
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 分区中的文件系统可能损坏,或者分区偏移不正确。进一步排查步骤:
- 在 U-Boot 命令行执行
mmc list确认 eMMC 设备识别正常。 - 执行
part list mmc 0查看分区表,确认 boot 分区是否存在。 - 执行
ls mmc 0:1列出 boot 分区内容,检查内核镜像是否完整。 - 若分区内容为空,重新烧写 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 文件,否则系统无法正常挂载。