本文主要主要介绍在目标开发板上boot Linux系统的过程,具体boot所需要的准备文件可以参考上一篇专栏:zynq7010启动Linux的三种方式:JTAG/SD卡/QSPI (一)准备工作
zynq boot linux系统主要可以有两种方式:Slave和Master,其中Slave对应的是JTAG的启动方式,必须要由上位机来控制CPU load fsbl和bitstream并执行PS和PL的初始化,而Master对应的是CPU自己从各种NVM介质中load boot file到OCM以及DDR中,然后执行FSBL以及后续操作。
官方提供的JTAG Boot过程如下:

图1.JTAG控制启动流程
a. 硬件配置启动Mode
需要配置zynq芯片的启动Mode为jtag,如下图,需要配置M0 = 0, M2 = 0

图2 zynq启动硬件strap配置
b. 配置串口终端和XSDB终端
选择Xilinx Tools > XSDB Console 打开调试窗口,并输入connect命令连接器件。

在SDK Terminal下新建串口终端,配置波特率为115200.

c. download FSBL to OCM and Execute
在XSDB窗口中,依次输入以下tcl命令:
ta 2 #选择目标器件为ARM Cortex-A9 MPCore #0
rst -processor #复位CPU
dow $directory/fsbl.elf #从directory(替换自己保存fsbl.elf的路径)下载fsbl.elf到OCM
con #CPU运行
after 1000 #延时1000ms
stop #CPU暂停
d. download bitstream to PL
在XSDB窗口中,依次输入以下tcl命令:
ta 4 #选择目标器件为xc7z010
fpga $directory/system_wrapper.bit #从directory下载bitstream到FPGA
after 1000 #延时1000ms
e. download uboot to memory and Execute
在XSDB窗口中,依次输入以下tcl命令:
ta 2 #选择目标器件为ARM Cortex-A9 MPCore #0
dow $directory/u-boot.elf #从directory下载u-boot.elf到内存
con #CPU运行
after 1000 #延时1000ms
stop #CPU暂停
(在这步执行的过程中,顺利情况可以在串口终端看到u-boot打印的信息了)
f. download kernel/devicetree/ramdisk to memory
在XSDB窗口中,依次输入以下tcl命令:
dow -data $directory/uImage 0x03000000
dow -data $directory/devicetree.dtb 0x02A00000
dow -data $directory/uramdisk.image.gz 0x02000000
con
after 1000
# 以上命令目的是将kernel/devicetree/ramdisk分别搬运到内存的指定地址
g. Execute Shell bootcmd
以上命令执行完后,在串口终端中显示的是u-boot界面:

输入"bootm 0x3000000 0x2000000 0x2A00000" 即可引导后续内核启动,启动完成后串口终端显示如下:

note: 在官方的指导教程中并没有下载FSBL.elf这一过程,取而代之的是用tcl脚本ps7_init.tcl来执行PS外设的初始化。
如果上一篇专栏中介绍的BOOT.bin、uImage、devicetree.dtb、uramdisk.tar.gz都有成功生成,那只需要将这些文件拷贝到SD卡中,然后将SD卡插入到开发板上,硬件strap按照图2配置成SD Mode,上电启动即可。
notice: 这些文件名务必不要做修改,SD卡启动是依靠搜索文件名的方式来boot对应的文件。
在Linux booting完成后,可以检查串口终端上是否打印有 Zynq> 提示符。
QSPI Boot过程,BootROM程序默认会从QSPI Flash的地址 0x00 开始读数据,依此递增地址直到读到有效的bin文件。然后执行fsbl,引导进入u-boot,之后u-boot根据bootcmd指定的偏移地址将kernel/devicetree/ramdisk文件从QSPI中搬移到内存中并引导内核启动。
所以QSPI Boot之前,预先需要将BOOT.bin、uImage、devicetree.dtb、uramdisk.tar.gz烧写到QSPI Flash的指定偏移位置。而这项工作又需要两个前提:1、先要把这些准备文件放到内存空间中;2、zynq能够进入u-boot并借助sf 命令给QSPI Flash烧写。
a. 进入u-boot
有三种方法可以让zynq进入到u-boot,前两种当然是对应上面介绍的两种Boot方式,Boot流程到u-boot这一步就可以了。另外一种方式是借助SDK的Xilinx Tools > Program Flash, 直接将BOOT.bin文件烧到QSPI中,然后从QSPI启动进入u-boot,其中Offset地址写到0x0即可。

b. 搬移boot文件到内存空间
如果是之前SD卡中已经有了各boot文件,那么只需要在串口终端中依此执行:
fatload mmc 0 0x8000000 BOOT.bin
fatload mmc 0 0x3000000 uImage
fatload mmc 0 0x2A00000 devicetree.dtb
fatload mmc 0 0x2000000 uramdisk.image.gz
如果是通过JTAG启动的方式,那么则需要借助XSDB窗口
dow -data $directory/BOOT.bin 0x08000000
dow -data $directory/uImage 0x03000000
dow -data $directory/devicetree.dtb 0x02A00000
dow -data $directory/uramdisk.image.gz 0x02000000
c. sf烧写QSPI Flash
在串口终端中依此执行:
sf probe 0 0 0 #选择QSPI Flash
sf erase 0 0x01000000 #擦除Flash 16MB的数据
sf write 0x08000000 0x0 0x300000 # 0 - 3MB空间写BOOT.bin数据
sf write 0x03000000 0x300000 0x500000 # 3 - 8MB空间写uImage数据
sf write 0x02A00000 0x800000 0x020000 # 8 - 8.125MB空间写devicetree.dtb数据
sf write 0x02000000 0x820000 0xF00000 # 8.125 - 15MB空间写uramdisk.image.gz数据
d. 重新上电启动
硬件strap按照图2配置成QSPI Mode,重新上电启动即可。在Linux booting完成后,可以检查串口终端上是否打印有 Zynq> 提示符。