ZYNQ7000 uboot实现两级引导及加载FPGA程序

ZYNQ7000 uboot实现两级引导及加载FPGA程序

​ 这里主要是针对qspi flash启动,然后uboot源码为xilinx-v2019.2版本。

一、启动介绍

​ zynq一般情况下,我们是通过xilinx的sdk生成fsbl,然后和fpga程序、uboot一起,生成boot.bin文件,最后固化到spi flash。这样,我们每次更新uboot或者fpga程序,都要重新生成boot.bin,比较麻烦。因此这里可以用uboot secondary program loader即uboot spl来取代xilinx sdk的fsbl, 并且uboot spl很小,可以完全从zynq的 OCM启动。

​ uboot spl为uboot的第二阶段加载器,一般用来引导真正的uboot,在zynq中可以用来替换fsbl作为第一阶段的引导。这样每次更新了uboot,只需要将新的uboot通过网络或者jtag固化到指定的spi flash位置即可。当设备上电,uboot spl起来后,会从固定的位置去加载uboot。

二、uboot spl

​ 要实现uboot secondary program loader,则需要PS端启动初始化代码,可以从xilinx sdk的hw platform工程获得。如图所示:

ZYNQ7000 uboot实现两级引导及加载FPGA程序

只需要上图中的ps7_init_gpl.cps7_init_gpl.h文件拷贝到{uboot源码}/board/xilinx/zynq 目录下对应的目录即可,如下图所示。比如,我目前是通过zynq_zed 这个改的,所以只需要把ps7_init_gpl.cps7_init_gpl.h文件拷贝到zynq_zed 目录。
ZYNQ7000 uboot实现两级引导及加载FPGA程序

​ 如果是从qspi启动,需要在zynq-common.h 里面修改CONFIG_SYS_SPI_U_BOOT_OFFS 宏,来指定uboot在spi flash中存放的位置,当uboot spl程序起来后,则会从这个位置去引导uboot。

​ 最后编译uboot源码,则会在uboot源码根目录下生成一个spl目录,然后将spl目录的boot.bin 固化到spi flash,这里已经生成了boot.bin文件,因此不需要xilinx sdk再来生成boot.bin文件。其中uboot spl引导的uboot文件为u-boot.img,因此在固化uboot时,应该固化编译生成的u-boot.img文件(u-boot.img比u-boot.bin多64字节的头)。

##三、加载FPGA程序

​ zynq主要用Device Configuration Interface (devcfg)来加载FPGA程序,而在uboot下提供了fpga加载相关的指令,都是基于devcfg 控制器驱动实现的。如图所示:

ZYNQ7000 uboot实现两级引导及加载FPGA程序

​ 因此fpga程序也没必要每次和fsbl一起,生成boot.bin文件。完全可以通过uboot的命令来实现加载,并且通过uboot来更新fpga程序也更方便。