Zynq-7000系列之linux开发学习笔记:编译U-BOOT(五)

开发板:Zynq7030数据采集板
PC平台:Ubuntu-18.04 + MobaXterm
开发环境:Xilinx Vivado + SDK -18.3
交叉编译工具:arm-linux-gnueabihf-
学习目标:生成 BOOT.bin 文件

一、下载u-boot源码

在第一篇文章Zynq-7000系列之linux开发学习笔记:开发前准备(一)中已经提供过u-boot的下载链接,这里再提供一下,方便中途看本文章的人进行下载,链接如下:
u-boot 2018.3 :https://github.com/Xilinx/u-boot-xlnx/tree/xilinx-v2018.3
下载完u-boot源码后,将文件解压到相应目录,我这里还是解压到前几篇文章使用的目录。进到目录可以看到如下的文件结构:

claude1009@ubuntu:~/xc7030$ cd u-boot-xlnx-xilinx-v2018.3/
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ ls
api     config.mk      drivers   include   MAINTAINERS  scripts
arch    configs        dts       Kbuild    Makefile     snapshot.commit
board   disk           env       Kconfig   net          test
cmd     doc            examples  lib       post         tools
common  Documentation  fs        Licenses  README

Zynq-7000系列之linux开发学习笔记:编译U-BOOT(五)_第1张图片

二、编译u-boot

首先我们要设置好交叉编译工具。这里是一个比较坑的一点,因为新版的SDK自动安装交叉编译工具,并且更新为 arm-linux-gnueabihf- ,已不是之前的 arm-xilinx-linux-gnueabi- 了。
这里一定要注意。使用旧版的软件时,比如2015.3左右版本的软件 ,就需要安装 arm-xilinx-linux-gnueabi- 交叉编译工具;而和我同样使用2018.3版本软件的同学,就可以不用管了,因为安装 Vivado时已经自动安装好了。现在有很多文章还都是旧的编译器,使用旧的命令编译就会显示没有命令。
这里先设置好环境变量,就可以看到有如下的交叉编译工具,操作如下:

claude1009@ubuntu:~$ source ./Xilinx/SDK/2018.3/settings64.sh
claude1009@ubuntu:~$ export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
claude1009@ubuntu:~$ ar
ar                              arm-linux-gnueabihf-gcc-ar      arm-linux-gnueabihf-size        arm-none-eabi-gcc-ranlib        armr5-none-eabi-addr2line       armr5-none-eabi-gcov-tool
arch                            arm-linux-gnueabihf-gcc-nm      arm-linux-gnueabihf-strings     arm-none-eabi-gcov              armr5-none-eabi-ar              armr5-none-eabi-gdb
arecord                         arm-linux-gnueabihf-gcc-ranlib  arm-linux-gnueabihf-strip       arm-none-eabi-gcov-dump         armr5-none-eabi-as              armr5-none-eabi-gprof
arecordmidi                     arm-linux-gnueabihf-gcov        arm-none-eabi-addr2line         arm-none-eabi-gcov-tool         armr5-none-eabi-c++             armr5-none-eabi-ld
arm2hpdl                        arm-linux-gnueabihf-gcov-dump   arm-none-eabi-ar                arm-none-eabi-gdb               armr5-none-eabi-c++filt         armr5-none-eabi-ld.bfd
arm-linux-gnueabihf-addr2line   arm-linux-gnueabihf-gcov-tool   arm-none-eabi-as                arm-none-eabi-ld                armr5-none-eabi-cpp             armr5-none-eabi-nm
arm-linux-gnueabihf-ar          arm-linux-gnueabihf-gdb         arm-none-eabi-c++               arm-none-eabi-ld.bfd            armr5-none-eabi-elfedit         armr5-none-eabi-objcopy
arm-linux-gnueabihf-as          arm-linux-gnueabihf-gprof       arm-none-eabi-c++filt           arm-none-eabi-nm                armr5-none-eabi-g++             armr5-none-eabi-objdump
arm-linux-gnueabihf-c++         arm-linux-gnueabihf-ld          arm-none-eabi-cpp               arm-none-eabi-objcopy           armr5-none-eabi-gcc             armr5-none-eabi-ranlib
arm-linux-gnueabihf-c++filt     arm-linux-gnueabihf-ld.bfd      arm-none-eabi-elfedit           arm-none-eabi-objdump           armr5-none-eabi-gcc-7.3.1       armr5-none-eabi-readelf
arm-linux-gnueabihf-cpp         arm-linux-gnueabihf-nm          arm-none-eabi-g++               arm-none-eabi-ranlib            armr5-none-eabi-gcc-ar          armr5-none-eabi-size
arm-linux-gnueabihf-elfedit     arm-linux-gnueabihf-objcopy     arm-none-eabi-gcc               arm-none-eabi-readelf           armr5-none-eabi-gcc-nm          armr5-none-eabi-strings
arm-linux-gnueabihf-g++         arm-linux-gnueabihf-objdump     arm-none-eabi-gcc-7.3.1         arm-none-eabi-size              armr5-none-eabi-gcc-ranlib      armr5-none-eabi-strip
arm-linux-gnueabihf-gcc         arm-linux-gnueabihf-ranlib      arm-none-eabi-gcc-ar            arm-none-eabi-strings           armr5-none-eabi-gcov            arpd
arm-linux-gnueabihf-gcc-7.3.1   arm-linux-gnueabihf-readelf     arm-none-eabi-gcc-nm            arm-none-eabi-strip             armr5-none-eabi-gcov-dump       arping

接着我们需要修改一些文件:首先进入到configs目录,复制一份zynq_zc702_defconfig的配置,并改名为 zynq_zc703_defconfig ,再将里面内容的zc702也修改为 zc703 ,然后保存即可。

claude1009@ubuntu:~/xc7030$ cd u-boot-xlnx-xilinx-v2018.3/
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ ls
api   board  common     configs  doc            drivers  env       fs       Kbuild   lib       MAINTAINERS  net   README   snapshot.commit  tools
arch  cmd    config.mk  disk     Documentation  dts      examples  include  Kconfig  Licenses  Makefile     post  scripts  test
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ cd configs/
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3/configs$ cp zynq_zc702_defconfig zynq_zc703_defconfig
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3/configs$ vim zynq_zc703_defconfig

CONFIG_ARM=y
CONFIG_SYS_CONFIG_NAME="zynq_zc70x"
CONFIG_ARCH_ZYNQ=y
CONFIG_SYS_TEXT_BASE=0x4000000
CONFIG_SYS_MALLOC_F_LEN=0x800
CONFIG_IDENT_STRING=" Xilinx Zynq ZC703"
CONFIG_SPL_STACK_R_ADDR=0x200000
CONFIG_DEFAULT_DEVICE_TREE="zynq-zc703"
CONFIG_DEBUG_UART=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_FIT=y
CONFIG_FIT_SIGNATURE=y
CONFIG_FIT_VERBOSE=y

由于默认生成的u-boot默认使用 ramdisk 作为文件系统,而我们使用的是sd卡上的Linaro文件系统,所以还需修改一下 include/configs/zynq-common.h 这个文件,让u-boot在启动的时候不会试图去加载ramdisk image。该内容大概在271行:

claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ cd include/configs/
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3/include/configs$ vim zynq-common.h

"sdboot=if mmcinfo; then " \
                  "run uenvboot; " \
                  "echo Copying Linux from SD to RAM... && " \
                  "load mmc 0 ${kernel_load_address} ${kernel_image} && " \
                  "load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
                  "bootm ${kernel_load_address} - ${devicetree_load_address}; " \
        "fi\0" \

修改完后,正常来说就可以进行make编译了。
但由于Zynq7030数据采集板采用的是Xilinx Zynq 7030 SoC,官方下载的u-boot源码里面并没有包含7030的配置文件以及设备树,所以才复制一份 zynq_zc703_defconfig 的配置。这里还需要再复制一份 zynq-zc703.dts 设备树文件,不然编译的时候会报错。这里要注意!!!
这里还要修改一下设备树 zynq-zc703.dts 里面的启动配置,默认是没有的。
需要自己添加 bootargs = “console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0” ,具体的操作如下:

claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ cd arch/arm/dts/
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3/arch/arm/dts$ cp zynq-zc702.dts zynq-zc703.dts
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3/arch/arm/dts$ vim zynq-zc703.dts 

chosen {
        bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0";
        stdout-path = "serial0:115200n8";
};

接下来回到u-boot主目录下,就可以开始进行编译了。

claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ make clean
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ make zynq_zc703_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ make

这时可能会出现如下的错误:
Zynq-7000系列之linux开发学习笔记:编译U-BOOT(五)_第2张图片
这个是openssl的依赖问题,安装支持即可。

claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ sudo apt-get install libssl-dev

安装完成后,再进行make就可以了。等待一段时间,就可以生成u-boot了,大功告成0.0.0.0
Zynq-7000系列之linux开发学习笔记:编译U-BOOT(五)_第3张图片
此时就可以在u-boot源码的主目录下看到生成的u-boot,然后将u-boot复制到和fsbl.elf同一个文件夹中,并改名为u-boot.elf。

claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ ls
api    cmd        configs  Documentation  env       include  lib          Makefile  README           spl         tools       u-boot.cfg          u-boot.lds        u-boot.srec
arch   common     disk     drivers        examples  Kbuild   Licenses     net       scripts          System.map  u-boot      u-boot.cfg.configs  u-boot.map        u-boot.sym
board  config.mk  doc      dts            fs        Kconfig  MAINTAINERS  post      snapshot.commit  test        u-boot.bin  u-boot.img          u-boot-nodtb.bin
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ mv u-boot /home/claude1009/xc7030/uboot/
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ cd ..
claude1009@ubuntu:~/xc7030$ cd uboot/
claude1009@ubuntu:~/xc7030/uboot$ mv u-boot u-boot.elf

三、生成BOOT.bin

至此,生成BOOT.bin所需要的三个文件: fsbl.elf fsbl_wrapper.bit u-boot.elf 已经准备好了。接下来只需在SDK中,将三个文件生成BOOT.bin即可。操作如下图所示:
Zynq-7000系列之linux开发学习笔记:编译U-BOOT(五)_第4张图片
添加三个文件,Create Image即可。
然后将生成的BOOT.bin复制到SD卡中,将SD卡插入到板子止,打开PC端的MobaXterm,设置好串口,然后连接USB线和电源线,即可看到如下输出信息:
Zynq-7000系列之linux开发学习笔记:编译U-BOOT(五)_第5张图片

你可能感兴趣的:(Zynq-7000系列)