开发板:Zynq7030数据采集板
PC平台:Ubuntu-18.04 + MobaXterm
开发环境:Xilinx Vivado + SDK -18.3
交叉编译工具:arm-linux-gnueabihf-
学习目标:生成 BOOT.bin 文件
在第一篇文章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
首先我们要设置好交叉编译工具。这里是一个比较坑的一点,因为新版的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
这时可能会出现如下的错误:
这个是openssl的依赖问题,安装支持即可。
claude1009@ubuntu:~/xc7030/u-boot-xlnx-xilinx-v2018.3$ sudo apt-get install libssl-dev
安装完成后,再进行make就可以了。等待一段时间,就可以生成u-boot了,大功告成0.0.0.0
此时就可以在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所需要的三个文件: fsbl.elf 、 fsbl_wrapper.bit 、 u-boot.elf 已经准备好了。接下来只需在SDK中,将三个文件生成BOOT.bin即可。操作如下图所示:
添加三个文件,Create Image即可。
然后将生成的BOOT.bin复制到SD卡中,将SD卡插入到板子止,打开PC端的MobaXterm,设置好串口,然后连接USB线和电源线,即可看到如下输出信息: