4. OpenSTLinux系统启动与镜像烧录

STM32MP1 系列(如 STM32MP157)与常见 MCU 最大的不同,在于它内部集成了 Cortex-A7 应用核与 Cortex-M4 实时核,并采用“多阶段固件 + 操作系统”的启动模型。上电后并不是直接跳到 Linux,而是由芯片内部固化的 BootROM 逐级加载外部镜像,最终把控制权交给 Linux 内核。理解这条启动链,是后续做 HMI 界面、工业终端应用开发以及现场排障的基础。

一、启动链的六个阶段

STM32MP1 的启动链可以概括为:BootROM → TF-A(FSBL)→ OP-TEE → U-Boot(SSBL)→ Linux 内核 + 设备树 → 根文件系统。每一级都负责初始化一部分硬件,并把下一级镜像从存储介质搬到内存中执行。

BootROM 是芯片出厂固化的只读代码,不可修改。它根据 BOOT 引脚(BOOT0/BOOT1/BOOT2)的电平组合决定启动源,可选串口、SD 卡、eMMC、NOR/NAND 等。BootROM 只做最基础的事:初始化所选启动接口,读取镜像头,校验签名,然后把 TF-A 的 FSBL 加载到 SYSRAM 中运行。它不识别文件系统,只按固定偏移和头部结构读取原始数据。

TF-A(Trusted Firmware-A) 是第一阶段引导加载程序(FSBL)。它运行在 SYSRAM,负责初始化 DDR、时钟树、电源,并配置安全域。TF-A 还会加载 OP-TEE 到安全内存,然后跳转到 U-Boot。在 OpenSTLinux 中,TF-A 通常以 tf-a-stm32mp157f-dk2.stm32 形式提供,烧录在分区起始位置。

OP-TEE 是可信执行环境,运行在 ARM TrustZone 的安全世界。它提供安全服务、密钥管理和安全存储,普通 Linux 运行在非安全世界。OP-TEE 由 TF-A 加载,在 U-Boot 和 Linux 启动过程中保持驻留。

U-Boot 是第二阶段引导加载程序(SSBL),功能最丰富。它负责加载 Linux 内核镜像(zImage 或 Image)、设备树(.dtb)和根文件系统,并传递启动参数 bootargs。U-Boot 还提供命令行交互,是排障时最常用的工具。

Linux 内核与设备树:内核启动后挂载根文件系统,初始化驱动。设备树(Device Tree)以 .dts 源文件描述硬件资源,编译为 .dtb 后由 U-Boot 传给内核。同一内核配合不同设备树即可适配不同板卡,这是 STM32MP1 支持多板型的关键机制。

根文件系统:OpenSTLinux 默认使用 st-image-weston 或 st-image-core,包含 BusyBox、systemd、Weston/Wayland 图形栈等。它决定了系统启动后能提供哪些服务与界面。

STM32MP1 OpenSTLinux 启动链与存储介质映射 BootROM 芯片固化 · 选启动源 TF-A (FSBL) DDR/时钟/安全域 OP-TEE TrustZone 安全世界 U-Boot (SSBL) 加载内核/DTB/参数 Linux 内核 + DTB 驱动初始化 · 挂载 rootfs 存储介质分区布局 FSBL1 (TF-A) 偏移 0x0 FSBL2 (TF-A 备份) 冗余容错 OP-TEE 安全镜像 SSBL (U-Boot) 含 SPL + U-Boot bootfs (FAT) zImage + .dtb rootfs (ext4) Weston / systemd userfs / vendorfs 应用数据区 烧录方式 SD 卡烧录 dd / balenaEtcher 写 .img BOOT 引脚切 SD 启动 eMMC 烧录 STM32CubeProgrammer USB DFU / UART 模式 启动故障排查要点 ① 无串口输出 → 查 BOOT 引脚/供电 ② 卡在 TF-A → DDR 参数/镜像偏移 ③ U-Boot 无提示 → SSBL 分区损坏 ④ 内核 panic → bootargs/rootfs 路径 ⑤ 无显示 → DTB 显示节点/Weston ⑥ 反复重启 → 看门狗/电源时序 ⑦ 安全启动失败 → 签名/OTP 熔丝

二、SD 卡与 eMMC 烧录的差异

开发阶段最常用 SD 卡启动,因为烧录简单、可反复擦写。使用 dd 命令把 .img 写入 SD 卡时,注意目标设备名不能写错,否则可能覆盖主机硬盘:

# 确认 SD 卡设备节点(示例为 /dev/sdb,务必按实际确认)
lsblk
# 写入镜像,bs=1M 提升速度,status=progress 显示进度
sudo dd if=FlashLayout_sdcard_stm32mp157f-dk2-optee.tsv of=/dev/sdb bs=1M status=progress
sudo sync

eMMC 烧录通常借助 STM32CubeProgrammer,通过 USB DFU 或 UART 进入 BootROM 的下载模式。此时 BOOT 引脚需拨到“串口/USB 启动”,工具会按 .tsv 分区表把 FSBL、OP-TEE、SSBL、bootfs、rootfs 依次写入 eMMC 对应偏移。烧录完成后必须把 BOOT 引脚拨回 eMMC 启动,否则下次上电仍会进入下载模式。

判断烧录是否成功,最直接的方法是接串口(默认 115200-8-N-1),观察是否依次打印 TF-A、OP-TEE、U-Boot、内核日志。若只看到 BootROM 的 ROM code 提示就停住,说明 FSBL 未被正确加载。

三、启动故障排查思路

排障的核心是“定位卡在哪一级”。串口日志是唯一可靠的依据,不要凭猜测换镜像。常见现象与对应原因如下:

  • 完全无输出:检查供电是否稳定、BOOT 引脚组合是否正确、串口线是否接在调试 UART 上(STM32MP157 DK2 为 UART4,对应 /dev/ttySTM0)。
  • 卡在 TF-A:多为 DDR 初始化参数不匹配或 FSBL 分区偏移错误。确认使用的 TF-A 镜像与板卡 DDR 型号一致。
  • U-Boot 无提示:SSBL 分区损坏或 bootargs 中 root= 指向错误分区。可在 U-Boot 命令行用 printenv 查看环境变量。
  • 内核 panic:常见于根文件系统未找到,检查 bootargs 中的 root=/dev/mmcblk0p6 是否与实际分区号一致。
  • 无显示输出:确认设备树中显示节点已使能,且 Weston 服务已启动,可用 systemctl status weston 查看。

建议在开发板上保留一份可启动的 SD 卡作为“救援卡”,当 eMMC 镜像损坏时,用 SD 卡启动后重新烧录 eMMC,可大幅缩短恢复时间。掌握这条启动链,后续无论是裁剪内核、替换设备树,还是部署 HMI 应用,都能清楚知道改动落在哪一级、如何验证。