前面我们已经安装了Zynq Linux开发环境,主要是安装了Ubuntu 14.04.3版本的Linux操作系统和XILINX的PetaLinux 2017.4版本工具,下面就使用PetaLinux工具进行FSBL、U-Boot和Linux内核的编译过程进行学习,首先简要了解下Zynq-7000的启动配置过程,通常分为3个阶段:
(1)、阶段0:称为BootROM阶段,系统上电复位或者热复位后执行厂家固化在芯片BootROM中的程序,系统在此阶段采集模式引脚的状态,该段代码为用户不可以修改的代码。
(2)、阶段1:称为FSBL阶段,即第一级启动引导程序(First Stage Boot Loader),它可以是如何用户控制的代码。
(3)、阶段2:称为SSBL阶段,即第二级启动引导程序(Second Stage Boot Loader), Linux开发下此阶段通常为U-Boot代码,如果是裸机应用也可以是用户实际编写的程序。U-Boot启动后就可以引导启动Linux内核了。
以上阶段0执行的是厂家固化代码,我们不需要编译下载过程,阶段1和阶段2是用户代码,需要有修改编译和下载过程,下面为具体实验步骤:
1、FSBL编译:打开Ubuntu系统的命令终端,输入下面命令创建一个FSBL安装目录:
mkdir -p /home/tronlong/Zynq/Linux-system/FSBL
再把创龙科技提供的第一张光盘的“Linux-system\FSBL\src”目录下FSBL源码embeddedsw-gdea7f98-v1.1.tar.gz文件拷贝导虚拟机共享目录,然后输入下面命令将其复制到Linux-system目录:
cp -a /mnt/hgfs/share/embeddedsw-gdea7f98-v1.1.tar.gz/home/tronlong/Zynq/Linux-system/
再输入下面命令进入到源码目录并解压文件:
cd /home/tronlong/Zynq/Linux-system/
tar -xvf embeddedsw-gdea7f98-v1.1.tar.gz -C FSBL/
输入下面命令使能PetaLinux安装目录下的环境变量配置文件:
source /home/tronlong/Zynq/PetaLinux/settings.sh
输入下面命令进入“FSBL/lib/sw_apps/zynq_fsbl/src”目录,执行FSBL清理命令:
cd/home/tronlong/Zynq/Linux-system/FSBL/lib/sw_apps/zynq_fsbl/src/
make clean
再输入以下命令进行FSBL编译:
make "BOARD=zc702" "CFLAGS=-DFSBL_DEBUG"
编译完成后会在当前路径下生成fsbl.elf文件,输入下面命令将编译出来的fsbl.elf制作生成BOOT.BIN文件在当前路径下:
/home/tronlong/Zynq/PetaLinux/tools/hsm/bin/bootgen-image bootgen.bif -o BOOT.BIN
2、U-Boot编译:先输入下面命令创建U-Boot安装目录:
mkdir -p /home/tronlong/Zynq/Linux-system/U-Boot-2017.01
再把第一张光盘的“Linux-system\U-Boot\U-Boot-2017.01\src\”目录下U-Boot源码u-boot-xlnx-gf812dfb-v1.0.tar.gz文件拷贝导虚拟机共享目录,然后输入下面命令将其复制到Linux-system目录:
cp -a /mnt/hgfs/share/u-boot-xlnx-gf812dfb-v1.0.tar.gz/home/tronlong/Zynq/Linux-system/
再输入下面命令进入到源码目录并解压文件:
cd /home/tronlong/Zynq/Linux-system
tar -zxvf u-boot-xlnx-gf812dfb-v1.0.tar.gz -CU-Boot-2017.01
输入下面命令进入U-Boot源码安装目录并执行U-Boot清理命令:
cd U-Boot-2017.01/
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-distclean
再输入如下命令配置U-Boot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-zynq_zc702_defconfig
输入以下命令进行U-Boot编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 16
编译完成后用ls命令可以查看到在U-Boot源码的顶层目录生成的u-boot.bin文件,如下图所示:
3、Linux内核编译:先输入下面命令创建Linux内核源码安装目录:
mkdir -p /home/tronlong/Zynq/Linux-system/kernel
再把第一张光盘的“Linux-system\kernel\src\”目录下Linux内核源码linux-xlnx-gee6f0c1-v1.2.tar.gz文件拷贝导虚拟机共享目录,然后输入下面命令将其复制到Linux-system目录:
cp -a /mnt/hgfs/share/linux-xlnx-gee6f0c1-v1.2.tar.gz/home/tronlong/Zynq/Linux-system/
再输入下面命令进入到源码目录并解压文件:
cd /home/tronlong/Zynq/Linux-system
tar -zxvf linux-xlnx-gee6f0c1-v1.2.tar.gz -C kernel/
进入Linux内核源码安装目录,输入下面Linux内核清理命令:
cd /home/tronlong/Zynq/Linux-system/kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-distclean
再输入如下命令配置Linux内核:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-xilinx_zynq_defconfig
编译Linux内核镜像uImage文件需要依赖u-boot-tools工具包,先输入如下指令安装:
sudo apt-get install u-boot-tools
需要输入root用户密码后安装,如下图示:
输入以下命令进行Linux内核编译,指令中的“0x02080000”为内核镜像文件uImage的内存加载地址:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-UIMAGE_LOADADDR=0x02080000 uImage -j 16
编译完成后,在Linux内核源码安装目录的“arch/arm/boot”路径下可以看到生成内核镜像文件uImage,可用ls arch/arm/boot命令查看,如下图示:
最后需将内核镜像文件复制到SD系统启动卡文件系统rootfs分区boot目录。
4、设备树编译:创龙科技提供的dts设备树源文件位于Linux内核源码"arch/arm/boot/dts/"目录下,包括了基础设备树文件和动态设备树文件,系统上电启动后自动加载基础设备树文件,动态设备树文件需要在文件系统下进行加载,创龙TLZ7x-EasyEVM开发板仅提供了基础设备树文件方式,在Linux 内核源码安装目录下,输入下面命令编译生成dtb设备树文件:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-zynq-zc702.dtb
编译完成后,在Linux内核源码安装目录的“arch/arm/boot/dts/”路径下会生成由zynq-zc702.dts设备树源文件编译生成的dtb文件,将其复制到SD卡文件系统rootfs分区的boot目录供U-Boot上电后自动加载。以上过程看文字可能比较抽象,这里提供一个操作视频供大家参考,中间要等待的时间有跳过:
以上步骤是参考创龙科技提供的文档和源码进行实验,如要具体修改的话还得研究源代码,修改后按上面步骤编译完后直接替换到SD系统启动卡上对应文件就可以实现更新。