BPI-R3开发板 - uboot编译

一. 获取源码

        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文件。

猜你喜欢

转载自blog.csdn.net/to_be_better_wen/article/details/129764922