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 图形栈等。它决定了系统启动后能提供哪些服务与界面。
二、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 启动,否则下次上电仍会进入下载模式。
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 应用,都能清楚知道改动落在哪一级、如何验证。