MT7981 UBOOT与ATF编译实战:从分区表解析到FIP构建
1. MT7981平台Bootloader架构解析
MT7981作为联发科新一代网络处理器,其Bootloader架构相比传统MT7621/7628平台有显著变化。最核心的区别在于引入了**BL2(Bootloader Stage 2)和FIP(Firmware Image Package)**分区设计,取代了旧方案中单一的uboot分区。这种变化源于ARM Trusted Firmware(ATF)规范的引入,通过分层验证机制提升启动安全性。
实际查看分区表时会发现这样的结构:
mtd0: 00040000 00010000 "BL2" mtd1: 00010000 00010000 "u-boot-env" mtd2: 000b0000 00010000 "Factory" mtd3: 00080000 00010000 "FIP"BL2作为初始引导加载程序,负责最基本的硬件初始化和FIP加载。FIP则是包含BL31(ATF运行时固件)、BL33(uboot)等组件的容器格式。这种设计带来两个优势:一是BL2体积固定(256KB),避免因uboot膨胀导致启动失败;二是通过数字签名验证FIP完整性,防止恶意固件刷入。
2. 编译环境搭建与依赖处理
在Ubuntu 20.04 LTS环境下,需要安装以下关键组件:
sudo apt-get install -y gcc-aarch64-linux-gnu \ device-tree-compiler libssl-dev \ uuid-dev flex bison特别注意两点:一是必须使用aarch64架构工具链,因为MT7981是64位Cortex-A53核心;二是clang编译器可能遇到链接问题,建议优先使用gcc。实测中发现openssl版本冲突是常见问题,当出现"undefined reference to `EVP_md5'"等错误时,可尝试:
sudo apt-get install libssl1.1=1.1.1f-1ubuntu2对于ATF编译,还需要额外配置python3环境:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 13. U-Boot编译实战步骤
3.1 配置与编译
获取源码后,首先选择正确的defconfig:
make mt7981_spim_nor_rfb_defconfig关键配置项需要手动调整:
- CONFIG_OF_SEPARATE:必须设为y,避免设备树嵌入导致的兼容性问题
- CONFIG_DEBUG_UART:设置为对应串口(如0x11002000)
- CONFIG_MTDIDS_DEFAULT:配置为"nor0=spi0.0"
编译时建议增加线程数提升速度:
make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu-3.2 常见问题解决
遇到"relocation truncated to fit"错误时,需检查:
- 是否启用了不必要的驱动模块
- 在include/configs/mt7981.h中调整CONFIG_SYS_MALLOC_LEN(建议≥0x200000)
生成的目标文件中:
- u-boot.bin:原始二进制镜像
- u-boot-mtk.bin:联发科头部格式的镜像
4. ATF编译与FIP合成
4.1 ATF编译流程
首先配置目标平台:
make PLAT=mt7981 \ CROSS_COMPILE=aarch64-linux-gnu- \ BL33=../uboot-mtk-20220606/u-boot.bin关键参数说明:
- PLAT:必须指定为mt7981
- BL33:指向编译好的uboot镜像路径
- DEBUG=1:开发阶段建议开启调试符号
编译完成后,在build/mt7981/release/目录下会生成:
- bl2.bin:二级引导程序
- bl31.bin:ARM可信固件
- fip.bin:最终镜像包
4.2 FIP深度解析
使用fiptool工具可以查看FIP内部结构:
./tools/fiptool/fiptool info build/mt7981/release/fip.bin典型输出示例:
BL31: offset=0x88, size=0x8061 BL33: offset=0x80E9, size=0x63710如需自定义FIP内容(如加入硬件密钥),可使用:
fiptool update --nt-fw u-boot.bin fip.bin5. 烧写与验证
5.1 分区烧写顺序
- 先烧写BL2到mtd0:
mtd write bl2.bin BL2 - 再烧写FIP到mtd3:
mtd write fip.bin FIP
5.2 启动日志分析
成功启动时,串口输出应包含以下关键阶段:
[BL2] Starting at EL3 [BL31] OP-TEE ep:0x0 [BL33] U-Boot starting...若卡在BL2阶段,需检查:
- 时钟配置是否正确
- SPI NOR Flash的读写时序参数
- BL2是否针对具体Flash型号做过适配
6. 高级调试技巧
使用OpenOCD进行JTAG调试时,配置脚本需特别注意:
set _CHIPNAME mt7981 set _TAPID 0x0792601f在uboot中启用详细调试信息:
setenv bootargs earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200 debug内存检测异常时,可尝试调整DRAM参数:
fdt set /memory reg <0x40000000 0x20000000>