ZYNQ的启动流程
ZYNQ启动分为两个阶段,第一阶段是BOOT ROM(厂家固化代码);第二阶段是FSBL(First Stage Bootloader)SDK工具来制作。
经过以上两个阶段,arm端程序以及PL端配置程序才开始运行
1、第一阶段
上电后,zynq会首先执行片内boot rom代码,boot rom代码读取boot mode 寄存器来判断是哪一种启动方式(SD card /QSPI flash / JTAG)
确定好启动方式后,boot rom从相应的启动设备中加载First Stage Bootloader(FSBL)到on chip memory (ocm) ram,并将执行权交付给FSBL.
2、第二阶段
fsbl主要做了以下的工作,初始化CPU,初始化串口,ps一些控制器的初始化,禁止L1 data cache ,注册ARM中断向量,通过boot mode寄存器,判断是哪种启动方式。
固化方式
1、生成FSBL 用来加载应用程序并配置 PL。
等编译完成,修改代码,添加调试宏定义 FSBL_DEBUG_INFO
这个宏可以在启动输出 FSBL 的一些状态信息,有利于调试,但是会导致启动时间变长。
2、使用 FSBL、 BIT 文件和 C 应用程序来创建启动镜像。
3、烧录进qspi flash中
双核固化启动
1、建立FSBL文件
2、在FSBL的src中找到main.c文件打开,在里面添加一段代码,用于启动CPU1。这段代码放在main函数前
#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x10000000
void StartCpu1(void)
{
#if 1
fsbl_printf(DEBUG_GENERAL,"FSBL: Write the address of the application for CPU 1 to 0xFFFFFFF0\n\r");
Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
dmb(); //waits until write has finished
fsbl_printf(DEBUG_GENERAL,"FSBL: Execute the SEV instruction to cause CPU 1 to wake up and jump to the application\n\r");
sev();
#endif
}
找到Load boot image的位置,将CPU1的启动函数,放置于此位置,改动后的代码段如下:
/*
* Load boot image
*/
HandoffAddress = LoadBootImage();
fsbl_printf(DEBUG_INFO,"Handoff Address: 0x%08lx\r\n",HandoffAddress);
StartCpu1(); /*add starting cpu1*/
保存并编译
3、建立bin文件
由于运用到了双核,需要添加运行在core1下工程的.elf文件