zynq7010启动Linux的三种方式:JTAG/SD卡/QSPI (二)Boot流程
语宸YC
编辑于 2022年06月14日 23:18
收录于文集
共2篇

本文主要主要介绍在目标开发板上boot Linux系统的过程,具体boot所需要的准备文件可以参考上一篇专栏:zynq7010启动Linux的三种方式:JTAG/SD卡/QSPI (一)准备工作

0. zynq Boot方式

zynq boot linux系统主要可以有两种方式:Slave和Master,其中Slave对应的是JTAG的启动方式,必须要由上位机来控制CPU load fsbl和bitstream并执行PS和PL的初始化,而Master对应的是CPU自己从各种NVM介质中load boot file到OCM以及DDR中,然后执行FSBL以及后续操作。

1. JTAG Boot

官方提供的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外设的初始化。

2. SD卡 Boot

如果上一篇专栏中介绍的BOOT.bin、uImage、devicetree.dtb、uramdisk.tar.gz都有成功生成,那只需要将这些文件拷贝到SD卡中,然后将SD卡插入到开发板上,硬件strap按照图2配置成SD Mode,上电启动即可。

notice: 这些文件名务必不要做修改,SD卡启动是依靠搜索文件名的方式来boot对应的文件。

在Linux booting完成后,可以检查串口终端上是否打印有 Zynq> 提示符。 

3. QSPI Boot

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> 提示符。