一, ZYNQ 的启动镜像我们需要执行以下文件:
1、 Boot ROM 头文件:控制 Boot ROM 设置,比如就地执行、加密、FSBL 偏移量、镜像文件大小等;
2、 First-Stage Boot Loader;
3、 PL 配置文件,即 BIT 文件;
4、 运行在 PS 上的软件应用程序。
其中,FPGA BIT文件定义 PL 的行为。PS软件elf运行在 PS 中的程序。
在 ZYNQ 中,PS 作为主器件,PL 可以看作是 PS 的一个外设,因此需要由 PS 来配置 PL。这个配置顺序的优势是它允许对 PS 单独上电的时候,此时 PL 不上电,以减小功耗。不过也有例外,就是我们在使用JTAG 下载程序的时候,此时是使用电脑作为主机来配置 PL。
软件代码和配置 FPGA 的 BIT 文件可以存储在连接到 PS 端的配置存储器件中。PS 支持多种片外非易失性存储器(Quad SPI Flash,NAND Flash,NOR Flash 或 SD 卡)。
二,ZYNQ SoC 的启动由片上的 BootROM 开始。
片上BootROM 是ZYNQ上的一块非易失性存储器,它包含了ZYNQ所支持的配置器件的驱动,而且里面的代码是不可修改的。BootROM中代码首先会在片外的非易失性存储器中寻找一个头文件,头文件里定义了一些启动信息,用于配置BootROM的运行。这些启动信息包括是程序是否就地执行(excute in place),FSBL 的偏移地址以及是否为安全模式等。头文件的存在确保BootROM能够按照配置器件被格式化后的方式操作。BootROM 执行之后,下一个配置阶段被称为 First-Stage Boot Loader (FSBL),它是由设计者所创建的。FSBL可以配置DDR存储器和硬件设计过程中所定义的一些外设。这些器件需要在加载软件应用及配置 PL之前就初始化完毕。
三,双核固化步骤
1,APP_CPU1_ADDR必须是CPU1的lscript.d中写的起始地址,偏移一点固化进去是起不来的。
比如这里void Start_cpu1()中APP_CPU1_ADDR的地址就是0x2000000
- void Start_cpu1()
- {
- u32 RegVal;
-
- //Disable cache on OCM
- Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
- // S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
-
- //Disable cache on fsbl vector table location
- Xil_SetTlbAttributes(0x00000000,0x14de2);
- // S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
-
- Xil_Out32(CPU1_CATCH, APP_CPU1_ADDR);
-
- /* Unlock the slcr register access lock */
- Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE);
-
- // the user must stop the associated clock, de-assert the reset, and then restart the clock. During a
- // system or POR reset, hardware automatically takes care of this. Therefore, a CPU cannot run the code
- // that applies the software reset to itself. This reset needs to be applied by the other CPU or through
- // JTAG or PL. Assuming the user wants to reset CPU1, the user must to set the following fields in the
- // slcr.A9_CPU_RST_CTRL (address 0xF8000244) register in the order listed:
- // 1. A9_RST1 = 1 to assert reset to CPU1
- // 2. A9_CLKSTOP1 = 1 to stop clock to CPU1
- // 3. A9_RST1 = 0 to release reset to CPU1
- // 4. A9_CLKSTOP1 = 0 to restart clock to CPU1
-
- /* Assert and deassert cpu1 reset and clkstop using above sequence*/
- RegVal = Xil_In32(A9_CPU_RST_CTRL);
- RegVal |= A9_RST1_MASK;
- Xil_Out32(A9_CPU_RST_CTRL, RegVal);
- RegVal |= A9_CLKSTOP1_MASK;
- Xil_Out32(A9_CPU_RST_CTRL, RegVal);
- RegVal &= ~A9_RST1_MASK;
- Xil_Out32(A9_CPU_RST_CTRL, RegVal);
- RegVal &= ~A9_CLKSTOP1_MASK;
- Xil_Out32(A9_CPU_RST_CTRL, RegVal);
-
- /* lock the slcr register access */
- Xil_Out32(XSLCR_LOCK_ADDR, XSLCR_LOCK_CODE);
- }
2,新建fsbl,取名为fsbl bbbb,不做任何更改,用于生产BOOT.bin生成Bin文件,添加文件顺序:
(1) fsbl_bbbb.elf, (2)工程.bit (3)cpu0.elf.·(4)cpul.elf
3.新建 fsbl,文件
fsbl中的的main 函数-384 行加上…BootModeRegister-JTAG MODE;·用于固化时的引导
4.固化引导文件选用修改过的fsb1.elf,固化文件选用.Bin,Flash·Type选择qspi x4 single