• ZYNQ双核启动和固化步骤


    一, 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

    1. void Start_cpu1()
    2. {
    3. u32 RegVal;
    4. //Disable cache on OCM
    5. Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
    6. // S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
    7. //Disable cache on fsbl vector table location
    8. Xil_SetTlbAttributes(0x00000000,0x14de2);
    9. // S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
    10. Xil_Out32(CPU1_CATCH, APP_CPU1_ADDR);
    11. /* Unlock the slcr register access lock */
    12. Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE);
    13. // the user must stop the associated clock, de-assert the reset, and then restart the clock. During a
    14. // system or POR reset, hardware automatically takes care of this. Therefore, a CPU cannot run the code
    15. // that applies the software reset to itself. This reset needs to be applied by the other CPU or through
    16. // JTAG or PL. Assuming the user wants to reset CPU1, the user must to set the following fields in the
    17. // slcr.A9_CPU_RST_CTRL (address 0xF8000244) register in the order listed:
    18. // 1. A9_RST1 = 1 to assert reset to CPU1
    19. // 2. A9_CLKSTOP1 = 1 to stop clock to CPU1
    20. // 3. A9_RST1 = 0 to release reset to CPU1
    21. // 4. A9_CLKSTOP1 = 0 to restart clock to CPU1
    22. /* Assert and deassert cpu1 reset and clkstop using above sequence*/
    23. RegVal = Xil_In32(A9_CPU_RST_CTRL);
    24. RegVal |= A9_RST1_MASK;
    25. Xil_Out32(A9_CPU_RST_CTRL, RegVal);
    26. RegVal |= A9_CLKSTOP1_MASK;
    27. Xil_Out32(A9_CPU_RST_CTRL, RegVal);
    28. RegVal &= ~A9_RST1_MASK;
    29. Xil_Out32(A9_CPU_RST_CTRL, RegVal);
    30. RegVal &= ~A9_CLKSTOP1_MASK;
    31. Xil_Out32(A9_CPU_RST_CTRL, RegVal);
    32. /* lock the slcr register access */
    33. Xil_Out32(XSLCR_LOCK_ADDR, XSLCR_LOCK_CODE);
    34. }

    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

     

  • 相关阅读:
    关于毕业答辩PPT制作与提问环节
    积分球检测水质的原理是什么?
    [杂谈] [杂谈]老实人要突破的想法,显眼包?
    软件安全开发生命周期(SSDL)全景图
    Selenium基础:自动化你的网页交互
    C++内存管理与模板初阶
    M.2接口电路设计
    搜索算法总结
    java8:Collector集合方法
    perl下mysql同步监控
  • 原文地址:https://blog.csdn.net/wangjie36/article/details/126339308