一. 获取源码
https://github.com/mtk-openwrt/u-boot
二. 编译步骤
编译环境为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
1. 配置
make mt7986a_bpir3_sd_defconfig。
由命令可知,该uboot被配置了用于烧写在SD卡中,还可以选择编译烧写在SPI-NOR,SPI-NAND和eMMC,如下:
[root@ u-boot-mtksoc]#ls configs/ | grep 7986
mt7986a_bpir3_emmc_defconfig
mt7986a_bpir3_sd_defconfig
mt7986a_emmc_rfb_defconfig
mt7986a_emmc_sb_rfb_defconfig
mt7986a_sd_rfb_defconfig
mt7986b_emmc_rfb_defconfig
mt7986b_sd_rfb_defconfig
mt7986_nmbm_snfi_nand_sb_rfb_defconfig
mt7986_rfb_defconfig
mt7986_snfi_nand_rfb_defconfig
mt7986_spim_nand_rfb_defconfig
mt7986_spim_nand_sb_rfb_defconfig
mt7986_spim_nor_rfb_defconfig
2. 编译代码
make CROSS_COMPILE=aarch64-openwrt-linux- V=1
V=1:可以看到具体的编译命令是什么,便于查看编译问题的具体原因。
PS:编译过程中可能会报如下错误:
tools/sunxi_toc0.o: In function `toc0_verify_header':
sunxi_toc0.c:(.text+0x4f5): undefined reference to `RSA_set0_key'
sunxi_toc0.c:(.text+0x50c): undefined reference to `RSA_get0_n'
sunxi_toc0.c:(.text+0x52a): undefined reference to `RSA_get0_e'
sunxi_toc0.c:(.text+0x5f0): undefined reference to `RSA_set0_key'
sunxi_toc0.c:(.text+0x702): undefined reference to `RSA_set0_key'
sunxi_toc0.c:(.text+0x719): undefined reference to `RSA_get0_n'
sunxi_toc0.c:(.text+0x726): undefined reference to `RSA_get0_n'
sunxi_toc0.c:(.text+0x743): undefined reference to `RSA_get0_e'
sunxi_toc0.c:(.text+0x750): undefined reference to `RSA_get0_e'
tools/sunxi_toc0.o: In function `toc0_set_header':
sunxi_toc0.c:(.text+0xaa5): undefined reference to `RSA_get0_d'
sunxi_toc0.c:(.text+0xafe): undefined reference to `RSA_get0_d'
sunxi_toc0.c:(.text+0xd81): undefined reference to `RSA_get0_n'
sunxi_toc0.c:(.text+0xda9): undefined reference to `RSA_get0_e'
sunxi_toc0.c:(.text+0xde9): undefined reference to `RSA_get0_n'
sunxi_toc0.c:(.text+0xe11): undefined reference to `RSA_get0_e'
sunxi_toc0.c:(.text+0xf14): undefined reference to `RSA_get0_n'
sunxi_toc0.c:(.text+0xf29): undefined reference to `BN_bn2binpad'
sunxi_toc0.c:(.text+0xf3b): undefined reference to `RSA_get0_e'
sunxi_toc0.c:(.text+0xf50): undefined reference to `BN_bn2binpad'
tools/lib/ecdsa/ecdsa-libcrypto.o: In function `prepare_ctx':
ecdsa-libcrypto.c:(.text+0xcd): undefined reference to `OPENSSL_init_ssl'
ecdsa-libcrypto.c:(.text+0x185): undefined reference to `EC_GROUP_order_bits'
tools/lib/ecdsa/ecdsa-libcrypto.o: In function `ecdsa_check_signature.isra.3':
ecdsa-libcrypto.c:(.text+0x3ad): undefined reference to `ECDSA_SIG_set0'
tools/lib/ecdsa/ecdsa-libcrypto.o: In function `ecdsa_sign':
ecdsa-libcrypto.c:(.text+0x497): undefined reference to `ECDSA_SIG_get0'
ecdsa-libcrypto.c:(.text+0x4ae): undefined reference to `BN_bn2binpad'
ecdsa-libcrypto.c:(.text+0x4c0): undefined reference to `BN_bn2binpad'
tools/lib/ecdsa/ecdsa-libcrypto.o: In function `ecdsa_add_verify_data':
ecdsa-libcrypto.c:(.text+0x68d): undefined reference to `EC_GROUP_order_bits'
ecdsa-libcrypto.c:(.text+0x6d3): undefined reference to `EC_POINT_get_affine_coordinates'
tools/lib/rsa/rsa-sign.o: In function `rsa_sign':
rsa-sign.c:(.text+0x524): undefined reference to `OPENSSL_init_ssl'
tools/lib/rsa/rsa-sign.o: In function `rsa_get_params':
rsa-sign.c:(.text+0x973): undefined reference to `RSA_get0_key'
rsa-sign.c:(.text+0x9c0): undefined reference to `RSA_get0_key'
tools/lib/rsa/rsa-sign.o: In function `rsa_add_verify_data':
rsa-sign.c:(.text+0xe21): undefined reference to `EVP_PKEY_get0_RSA'
collect2: error: ld returned 1 exit status
scripts/Makefile.host:104: recipe for target 'tools/dumpimage' failed
make[1]: *** [tools/dumpimage] Error 1
Makefile:1916: recipe for target 'tools' failed
make: *** [tools] Error 2
编译sunxi_toc0.c缺少openssl库,也可能是因为openssl版本低导致的。这里我手动编译安装了openssl-1.1.1n版本的库,具体步骤如下:
cd openssl-1.1.1n
./configure
make && make install
ldconfig
3. 取出uboot
uboot编译成功结果如下:
[root@ u-boot-mtksoc]#make CROSS_COMPILE=aarch64-openwrt-linux-
UPD include/generated/timestamp_autogenerated.h
ENVC include/generated/env.txt
ENVP include/generated/env.in
ENVT include/generated/environment.h
CC cmd/version.o
AR cmd/built-in.o
CC env/common.o
AR env/built-in.o
LD u-boot
OBJCOPY u-boot.srec
OBJCOPY u-boot-nodtb.bin
RELOC u-boot-nodtb.bin
CAT u-boot-dtb.bin
COPY u-boot.bin
SYM u-boot.sym
MKIMAGE u-boot-mtk.bin
CFGCHK u-boot.cfg
OFCHK .config
u-boot:代码编译的最原始的uboot,包含符号信息,debug信息等等。
u-boot-nodtb.bin:u-boot通过objcopy,留下了必要的段,所以大小较u-boot小非常多。
u-boot-dtb.bin:是在u-boot-nodtb.bin的基础上,追加了dts/dt.dtb文件。
u-boot.bin:是u-boot-dtb.bin的副本。
u-boot.sym:u-boot的符号表信息。
u-boot-mtk.bin:u-boot.bin文件通过mkimage命令处理过的文件。用于最终烧写的文件。
三. 总结
编译BPI-R3开发板uboot用的交叉编译工具链是编译openwrt产生的,编译过程中可能会报openssl相关错误,可以安装openssl-1.1.1n解决,记得安装完openssl就运行ldconfig,uboot编译完,烧写u-boot-mtk.bin文件。