Xilinx FSBL+PMUFW+app project

本篇主要紀錄使用Xilinx去建立具備可修改FSBL、PMUFW、SWDT app的整合性project

  • 系統環境: win10

  • Xilinx版本: 2021.2

  • FPGA: ultra96v2(zynq ultraScale+)

目標

  • 我們的目標是在以下cpu core建立程序

    • A53_0 : fsbl

    • A53_1: wdt polling test standalone

    • R5_0: rtos process

    • PMU: PMUFW

  • MPSOC的開機順序是

    • FSBL

    • PMUFW

    • stand alone APP(或RTOS)


流程

1.Vivado

在建立本專案目標時要先確認FPGA ps side的設定

2.FSBL

  • 首先用standalone建立一個platform,並須注意fsbl一定只能在A53_0(或R5_0)

  • 修改A53_0的standalone psu BSP,(STD IN/OUT 改UART1就不寫了)

  • BSP zynqmp_fsbl_bsp 要設true,後續編譯才不會出現錯誤

  • 打勾或是表格內容基本上就是參考zynqmp_fsbl

  • platform build up後,create application,選在A53_0,取名建議為A53_fsbl

  • templates選擇zynq mp fsbl

  • 建議找到XFsbl_Printf(DEBUG_PRINT_ALWAYS,"Zynq MP First Stage Boot Loader\n\r");這行稍微小改一下以便後續確認A53_fsbl.elf確定有取代原本的bootloader

3. SWDT app

  • 在原本的platform建立一個新的domain,這裡主要是方便測試用的

  • 在a53_1,找wdt example,import example

  • Note: 測試SWDT建議在swdt_polling_example加入以下片段,方能正常執行

....

//define
#define PMU_GLOBAL_BASEADDR      0XFFD80000U
#define PMU_GLOBAL_ERROR_SRST_EN_1    ( ( PMU_GLOBAL_BASEADDR ) + 0X0000056CU )
#define PMU_GLOBAL_ERROR_EN_1    ( ( PMU_GLOBAL_BASEADDR ) + 0X000005A0U )
#define PMU_GLOBAL_ERROR_SRST_EN_1_LPD_SWDT_MASK    0X00001000U
#define PMU_GLOBAL_ERROR_STATUS_1    ( ( PMU_GLOBAL_BASEADDR ) + 0X00000530U )
#define PMU_GLOBAL_ERROR_STATUS_1_LPD_SWDT_MASK     0X00001000U
#define RPU_BASEADDR      0XFF9A0000U

...


int swdt_polling_example()
{
    ....
    /*
	 * Set the initial Divider ratio at the smallest value.
	 */
	XWdtPs_SetControlValue(&Watchdog,
			       (u8) XWDTPS_CLK_PRESCALE,
			       (u8) XWDTPS_CCR_PSCALE_4096);
			
         RegValue = Xil_In32(PMU_GLOBAL_ERROR_SRST_EN_1);
         //RegValue |= XFSBL_WDT_MASK;//old
         RegValue |= PMU_GLOBAL_ERROR_SRST_EN_1_LPD_SWDT_MASK;//Jay
         Xil_Out32(PMU_GLOBAL_ERROR_SRST_EN_1, RegValue);

         /* Enable SWDT0/1 System Watchdog Timer Error */
             RegValue = Xil_In32(PMU_GLOBAL_ERROR_EN_1);
             //RegValue |= XFSBL_WDT_MASK;//old
             RegValue |= PMU_GLOBAL_ERROR_SRST_EN_1_LPD_SWDT_MASK;//Jay
             Xil_Out32(PMU_GLOBAL_ERROR_EN_1, RegValue);
        XWdtPs_EnableOutput(&Watchdog, XWDTPS_RESET_SIGNAL);
        return 0
}

int main(){
    swdt_polling_example();
    return 0;
}

4.PMUFW

  • 在原本的platform建立一個新的pmu domain

  • Create pmu app,process選pmu_0,以及相關模板

  • PMU有跑成功,執行板子上電看console,不會有一個錯誤提示訊息,還蠻明顯的,所以這邊就不放console照片

  • Note: 如果要測試SWDT,記得要道xpfw_config.h,將ENABLE_EM_VAL (0U),改成ENABLE_EM_VAL (1U)

小結

完成以上步驟之後,就可以直接在vitis project修改 PMUFW以及FSBL


BOOTIMAGE

當你修改好上面那些,並且要建立一個image開機時,要進到vitis -> Create boot image -> zynq and zynq ultraScale,會出現以下視窗。

找到紅色框框add,或edit去新增,修改bootimage設定

修改File path,找到剛剛project編譯好的FSBL.elf,PMUFW.elf

由於我們這次是用R5 app,因此在打包image的時候要記的CPU選R5

加好以後結果如下:

Last updated