构建ZYNQ的Linux启动镜像

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系统已正常运行。

猜你喜欢

转载自blog.csdn.net/u011239266/article/details/113756724