构建 Avaota A1 的 eMMC 系统镜像
TF-A、U-Boot、Linux 和 Buildroot 分别产生不同类型的文件,最终还要把它们装入同一张 eMMC 镜像。build-full-mainline.sh 固定各工程版本、传递构建输入,并在生成 raw 后调用布局检查脚本。
确认构建脚本输入
构建脚本固定使用以下 Git 提交:
| 工程 | 固定提交 | 在镜像中的作用 |
|---|---|---|
| TF-A A523/T527 分支 | b5de74a685fb73b784e45bbbd18dd9a0c528d8b2 | 生成 BL31 |
| U-Boot v2026.07 | ece349ade2973e220f524ce59e59711cc919263f | 生成 SPL、FIT 和 U-Boot proper |
| Linux v7.2 | 8d3ae59288f1e7d58d76558a6ee96d533bc5019f | 生成 Image、DTB 和内核模块 |
| Buildroot 2026.05.1 | cb857ba4c87a93e5265a9e4a3f32071abf39e14a | 生成 rootfs、FAT 和整盘 raw |
工具链也不是系统 PATH 中随便一个 GCC,而是 SDK 内固定目录:
out/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/
完整提交哈希说明上游基点,课程补丁记录 Avaota A1 的增量修改。发布包同时保存源码版本、补丁和二进制,这样既能复现构建,也能直接核对板上运行的产物。
执行构建脚本
脚本以 Debug 方式构建 T527 所属 A523 平台的 BL31:
make -C trusted-firmware-a-a523 \
PLAT=sun55i_a523 \
DEBUG=1 \
SUNXI_PSCI_USE_SCPI=0 \
SUNXI_PSCI_USE_NATIVE=1
随后将生成的 bl31.bin 作为 U-Boot FIT 的输入,并显式留空 SCP:
make -C u-boot-v2026.07 avaota-a1_defconfig
make -C u-boot-v2026.07 \
BL31="<TF-A debug bl31.bin>" \
SCP=
这两个参数共同决定 FIT 内容:BL31 提供 EL3/PSCI,SCP= 表示本次组合不加入独立 SCP 固件。脚本还会搜索 FIT,拒绝出现厂商或 SyterKit 标记,避免“主线目录中混入厂商启动件”。
Buildroot 最后执行 avaota_a1_mainline_defconfig,通过 local.mk 使用同级 linux-v7.2,再由 post-build 和 genimage 吸收 U-Boot、Image、DTB、extlinux 与 rootfs。
构建系统组件与 eMMC 镜像
从 mainline-a1 目录执行:
./build-full-mainline.sh
脚本会先检查源码版本和移植补丁,再依次生成 BL31、U-Boot、Linux 与 Buildroot 产物。版本检查不是额外限制,而是在阻止不同提交的二进制被放进同一张镜像;检查失败时应先恢复课程指定的源码状态,再重新构建。
检查构建产物
buildroot-2026.05.1/output/images/
├── u-boot-sunxi-with-spl.bin
├── Image
├── sun55i-t527-avaota-a1.dtb
├── boot.vfat
├── rootfs.ext2
└── avaota-a1-full-mainline.img
raw 大小应为 805306368 字节。这个数值只证明文件没有明显截断;真正的完成条件是随后由 verify-mainline-layout.sh 检查 eGON、FIT、两个分区及其内容,并为同一份 raw 生成 SHA-256。
完整构建结束后,raw 的 8 KiB 位置应与本次生成的 u-boot-sunxi-with-spl.bin 逐字节一致,FAT 中的 Image、DTB 与 extlinux 也应来自同一输出目录。下一节使用工程脚本逐层检查这些关系。