ZYNQ双核固化

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寄存器,判断是哪种启动方式。

ZYNQ双核固化_第1张图片

固化方式

1、生成FSBL 用来加载应用程序并配置 PL。

ZYNQ双核固化_第2张图片​​​​​​​

等编译完成,修改代码,添加调试宏定义 FSBL_DEBUG_INFO

这个宏可以在启动输出 FSBL 的一些状态信息,有利于调试,但是会导致启动时间变长。

ZYNQ双核固化_第3张图片

2、使用 FSBL、 BIT 文件和 C 应用程序来创建启动镜像。

ZYNQ双核固化_第4张图片

3、烧录进qspi flash中

ZYNQ双核固化_第5张图片

双核固化启动

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文件

ZYNQ双核固化_第6张图片

 

4、烧录进QSPI FLASH中

你可能感兴趣的:(FPGA,fpga开发)