文章目录
- Change Log
- 0 前言
- 1 启动过程
- 2 FSBL制作
- 3 逻辑bitstream制作
- 4 U-Boot制作
- 5 内核制作
- 6 设备树制作
- 7 文件系统制作
- 8 Boot.bin制作
- 9 启动
Change Log
2021年2月8日:首次发布。
0 前言
在ZYNQ+PetaLinux控制AXI GPIO实现LED灯亮灭中,我们通过PetaLinux的方式为ZYNQ制作了Linux启动镜像并成功通过AXI GPIO控制了LED灯的亮灭。而在本实例中,我们将不使用PetaLinux,直接下载官方源码来构建Linux启动镜像。但需要说明的是,本实例仅仅只是提出如何通过源码来构建镜像,在实际应用的过程中,由于PetaLinux的便利性和实用性,我们还是推荐使用PetaLinux工具。
1 启动过程
1.1 Stage 0 (BootROM: BootROM Header)
在上电复位或者热复位之后,处理器首先执行 BootRom 里的代码,这一步是最初始启动设置。BootRom 存放了一段用户不可更改的代码,当然是在非 JTAG 模式下才执行,代码里包含了最基本的 NAND,NOR,Quad-SPI,SD 和 PCAP 的驱动。另外一个很重要的作用就是把stage 1 的代码搬运到 OCM 中,就是 FSBL 代码(First Stage Boot Loader),空间限制为192KB。
1.2 Stage 1 (FSBL / User code)
当 BootRom 搬运 FSBL 到 OCM 后,处理开始执行 FSBL 代码,FSBL 主要有以下几个作用:
- 初始化 PS 端配置,这些配置也就是在 Vivado 工程中对 ZYNQ 核的配置。包括初始化DDR,MIO,SLCR 寄存器。主要是执行 ps7_init.c 和 ps7_init.h,ps7_init.tcl 的执行效果跟ps7_init.c 是一样的。
- 如果有 PL 端程序,加载 PL 端 bitstream
- 加载 second stage bootloader 或者 bare-metal 应用程序到 DDR 存储器
- 交接给 second stage bootloader 或 bare-metal 应用程序
1.3 Stage 2 (U-Boot / System / Application)
Second stage bootloader 是可选项,一般是在跑系统的情况下使用,比如 linux 系统的u-boot。
1.4 总结
要在ZYNQ上运行Linux系统需要的镜像文件,必须包括FSBL,逻辑bitstream,u-boot,设备树,内核及文件系统。启动顺序为FSBL加载逻辑bitstream及引导u-boot启动,u-boot引导内核启动,内核引导文件系统。以下将会详细分步骤解析各文件的制作过程。
2 FSBL制作
首先在Vivado中导出硬件工程。
然后在Xilinx SDK中新建工程
新建工程时需要选择刚才导出的hdf文件
下一步选择Zynq FSBL
然后选择编译工程。
等待编译完成就会有相应的elf文件产生。
FSBL文件制作完毕。
3 逻辑bitstream制作
逻辑bitstream文件可在Vivado中选择Generate Bitstream后产生。
逻辑bitstram文件制作完毕。
4 U-Boot制作
U-Boot的制作需要在Linux环境中,并已安装Vivado+SDK的交叉编译环境和基础库。
安装dtc(设备树编译器)工具
sudo apt-get install device-tree-compiler
sudo apt-get install libssl-dev:i386 flex:i386 bison:i386 libselinux1:i386 libncurses5 libncurses5-dev libc6:i386 libstdc++6:i386 zlib1g:i386 libssl-dev tftpd tftp openbsd-inetd tofrodos:i386 iproute2:i386 gawk:i386 gcc net-tools:i386 zlib1g-dev:i386
sudo apt-get install u-boot-tools
4.1 Uboot源码下载
git clone https://github.com/Xilinx/u-boot-xlnx.git
4.2 下载U-Boot源码的2015.4版本
git checkout xilinx-v2015.4
4.3 编译U-Boot
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zed_config
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
等待一段时间编译完毕,编译完毕后在当前目录下就会产生u-boot文件。
u-boot制作完毕。
5 内核制作
内核的制作需要在Linux环境中,并已安装Vivado+SDK的交叉编译环境和基础库。
5.1 内核源码下载
git clone http://github.com/Digilent/linux-Digilent-Dev
5.2 内核编译
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig uImage LOADADDR=0x00008000
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
等待一段时间编译完毕,编译完毕后在arch/arm/boot目录下就会产生uImage文件。
内核制作完毕。
6 设备树制作
要生成dtb格式的设备树文件,需要对dts格式的文件进行编译。
在Linux内核源码目录中,进入arch/arm/boot/dts子目录,生成dtb设备树。
dtc -O dtb -I dts devicetree.dtb zynq-zed.dts
等待一段时间编译完毕,编译完毕后在arch/arm/boot/dts目录下就会产生devicetree.dtb设备树文件。
设备树编译完毕。
7 文件系统制作
在不修改Uboot的情况下,默认文件系统为uramdisk.image.gz。uramdisk.image.gz通过Xilinx官方提供的arm_ramdisk.image.gz制作出来。
7.1 下载arm_ramdisk.image.gz
7.2 制作uramdisk.image.gz
mkimage -A arm -T ramdisk -C gzip -d arm_ramdisk.image.gz uramdisk.image.gz
制作完毕后,在当前目录下产生uramdisk.image.gz文件。
8 Boot.bin制作
前面提到的fsbl,逻辑bitstream及u-boot需要制作成Boot.bin放置到SD卡中,才能让ZYNQ认出来并启动。下面讲解如何制作Boot.bin
通过Xilinx的SDK中的Create Boot Image工作制作。
选择刚刚做出来的fsbl,逻辑bitstream及u-boot文件。
制作完毕后在相应目录下产生BOOT.bin文件。
至此,ZYNQ的Linux启动镜像已全部制作完毕,下面进入启动。
9 启动
将BOOT.bin,设备树,内核及文件系统复制到SD卡中。
将SD卡插入开发板中,将ZYNQ上电并连接串口打印信息。
如上图所示,ZYNQ的Linux系统已正常运行。