一. 获取源码
https://github.com/mtk-openwrt/arm-trusted-firmware
二. 编译步骤
和编译uboot一样,编译环境为ubuntu 18.04。交叉编译工具链我用的是openwrt编译生成的工具链,并设置到环境变量,如下:
export PATH=$PATH:/root/mt8976/BPI-R3-OPENWRT-V21.02.3-main/staging_dir/toolchain-aarch64_cortex-a53_gcc-8.4.0_musl/bin
export STAGING_DIR=/root/mt8976/BPI-R3-OPENWRT-V21.02.3-main/staging_dir
编译的过程,STAGING_DIR可能会导致编译报错,可以去掉。
1. 编译
命令如下:
make -f Makefile \
CROSS_COMPILE=aarch64-openwrt-linux- \
PLAT=mt7986 \
BOOT_DEVICE=nor \
DRAM_USE_DDR4=1 \
BL33=/root/mt8976/u-boot-mtksoc/u-boot-dtb.bin \
all fip V=1
CROSS_COMPILE:选择交叉编译工具
PLAT:表示CPU平台名。可选的是mt7622/mt7981/mt7986。
BOOT_DEVICE:系统从什么存储设备启动。可选的设备如下:
NAND_TYPE:当BOOT_DEVICE选择的是snand或spim-nand时,此选项才有效。如果不配置此选项,NAND_TYPE将会被配置为默认值。注意:NAND_TYPE必须被配置为开发板上SPI-NAND的正确参数,否则设备将启动失败。可配置的值如下:
DRAM_USE_DDR4:此选项只用于mt7981/mt7986。
DDR3_FLYBY:此选项只对于mt7622有效。
BL33:指定uboot镜像的路径。
2. 制作镜像
make完成后,会产生两个文件:bl2.img和fip.bin。路径在arm-trusted-firmware-mtksoc/build/mt7986/release下。将两个文件打包成一个镜像文件,命令如下:
dd if=bl2.img of=spi-nor.img
dd if=fip.bin of=spi-nor.img bs=1k seek=1024
运行上面两条指令后,内核启动之前需要的程序都打包好了。由于在编译atf的时候指定了uboot的路径,所以,uboot其实已经包含在了fip.bin文件中。至于为什么fip.bin为什么烧写在偏移起始位置,后面文章再说。
三. 总结
本文介绍了BPI-R3开发板的atf文件的编译过程,主要介绍了编译参数的含义和适用范围。最后介绍了如何制作atf镜像。