在Vitis IDE软件中,可以生成FSBL的程序(FSBL在ZYNQ内部的SRAM中运行)。FSBL程序的主要作用是,引导bit文件加载到PL侧,引导裸机程序启动(或引导U-BOOT启动)。
一、FSBL源码的生成
新建应用工程,创建zynq_fsbl工程。
二、FSBL程序简单解析
在FSBL工程中,可以看到main.c文件,下面简单解析文件中的几个关键函数,捋清楚FSBL的运行过程。
2.1 ps7_init函数
对PS端的配置信息进行初始化操作,包括MIO、PLL、CLK、DDR等;
应该是将vivado中ZYNQ IP中配置的相关图形化的信息,通过vitis进行解析,生成相关信息。然后在FSBL工程中,通过调用ps7_init函数,将信息写入到对应的相关寄存器中,完成对SOC硬件的配置。
2.2 刷Dcache缓存、禁用DCache缓存
先调用Xil_DCacheFlush函数完成刷DCache缓存的操作,然后再调用Xil_DCacheDisable禁用DCache缓存。
2.3 注册异常处理函数
调用RegisterHandlers函数。
2.4 DDR读写测试
调用DDRInitCheck函数。
2.5 PCAP的初始化
处理器配置访问端口的初始化,调用InitPcap函数完成初始化。
PCAP端口用来加载bits文件到PL端,因此需要进行初始化操作。
2.6 读取BOOT_MODE寄存器
ZYNQ上电后,会将启动模式的MIO的状态保存到BOOT_MODE寄存器中。BOOT_MODE寄存器记录了ZYNQ的启动方式(QSPI、SD卡启动等)。
调用Xil_in32(BOOT_MODE_REG)函数读取寄存器。
2.7 确定ZYNQ的启动模式,执行不同的处理
逐个比较BOOT_MODE寄存器数值,确定启动模式。比如启动模式为QFLASH,那么:
第一步,初始化QFLASH设备;
第二步,将MoveImage函数指向QFLASH设备的读写函数实体。
2.8 加载启动镜像
调用LoadBootImage函数。将bit文件加载到PL端,然后启动U-BOOT。
2.9 跳转到u-boot运行地址,启动u-boot
调用FsblHandoff(HandoffAddress)函数,启动u-boot后,FSBL程序退出。