diff --git a/components/bootloader/zynqmp_fsbl/xfsbl_main.c b/components/bootloader/zynqmp_fsbl/xfsbl_main.c index 1fd23da..ae3040a 100644 --- a/components/bootloader/zynqmp_fsbl/xfsbl_main.c +++ b/components/bootloader/zynqmp_fsbl/xfsbl_main.c @@ -339,6 +339,8 @@ void XFsbl_PrintFsblBanner(void ) XFsbl_Printf(DEBUG_PRINT_ALWAYS, "Release %d.%d %s - %s\r\n", SDK_RELEASE_YEAR, SDK_RELEASE_QUARTER,__DATE__,__TIME__); + XFsbl_Printf(DEBUG_PRINT_ALWAYS, + "BSC variant with fallback recover (v0.1.0) \n\r"); #endif /** diff --git a/components/bootloader/zynqmp_fsbl/xfsbl_misc.c b/components/bootloader/zynqmp_fsbl/xfsbl_misc.c index aeb7cf5..2235e3c 100644 --- a/components/bootloader/zynqmp_fsbl/xfsbl_misc.c +++ b/components/bootloader/zynqmp_fsbl/xfsbl_misc.c @@ -364,7 +364,7 @@ u32 XFsbl_Htonl(u32 Value1) * ******************************************************************************/ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DrvNum) + u32 MultibootReg, u32 DrvNum, u32 FlbkOn) { u32 Index; @@ -372,7 +372,18 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, u32 FileNameLen; u32 MultiBootNum = MultibootReg; - if (0x0U == MultiBootNum) + if (0x0U != FlbkOn) + { + /* SD file name is FLBK.BIN when FlbkOn is not 0 */ + if (DrvNum == XFSBL_SD_DRV_NUM_0) { + (void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "FLBK.BIN"); + } + else { + /* For second SD instance, include drive number 1 as well */ + (void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "1:/FLBK.BIN"); + } + } + else if (0x0U == MultiBootNum) { /* SD file name is BOOT.BIN when Multiboot register value is 0 */ if (DrvNum == XFSBL_SD_DRV_NUM_0) { diff --git a/components/bootloader/zynqmp_fsbl/xfsbl_misc.h b/components/bootloader/zynqmp_fsbl/xfsbl_misc.h index 9a6eea3..0185b7d 100644 --- a/components/bootloader/zynqmp_fsbl/xfsbl_misc.h +++ b/components/bootloader/zynqmp_fsbl/xfsbl_misc.h @@ -81,7 +81,7 @@ char *XFsbl_Strcpy(char *DestPtr, const char *SrcPtr); char * XFsbl_Strcat(char* Str1Ptr, const char* Str2Ptr); int XFsbl_Strcmp(const char* Str1Ptr, const char* Str2Ptr); void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DrvNum); + u32 MultibootReg, u32 DrvNum, u32 FlbkOn); u32 XFsbl_GetDrvNumSD(u32 DeviceFlags); u32 XFsbl_Htonl(u32 Value1); u32 XFsbl_PowerUpIsland(u32 PwrIslandMask); diff --git a/components/bootloader/zynqmp_fsbl/xfsbl_sd.c b/components/bootloader/zynqmp_fsbl/xfsbl_sd.c index 06cb472..0d37707 100644 --- a/components/bootloader/zynqmp_fsbl/xfsbl_sd.c +++ b/components/bootloader/zynqmp_fsbl/xfsbl_sd.c @@ -66,7 +66,7 @@ /************************** Function Prototypes ******************************/ extern void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DrvNum); + u32 MultibootReg, u32 DrvNum, u32 FlbkOn); extern u32 XFsbl_GetDrvNumSD(u32 DeviceFlags); @@ -93,6 +93,9 @@ u32 XFsbl_SdInit(u32 DeviceFlags) u32 MultiBootOffset=0U; TCHAR *path; u32 DrvNum; + char *fallback_file; + FIL fallbackFil; + u32 FlbkOn = 0; DrvNum = XFsbl_GetDrvNumSD(DeviceFlags); @@ -105,8 +108,8 @@ u32 XFsbl_SdInit(u32 DeviceFlags) } /* Register volume work area, initialize device */ - rc = f_mount(&fatfs, path, 0); - XFsbl_Printf(DEBUG_INFO,"SD: rc= %.8x\n\r", rc); + rc = f_mount(&fatfs, path, 1/*Mount now*/); + XFsbl_Printf(DEBUG_INFO,"SD: path='%s' rc= %.8x\n\r", path, rc); if (rc != FR_OK) { Status = XFSBL_ERROR_SD_INIT; @@ -120,9 +123,30 @@ u32 XFsbl_SdInit(u32 DeviceFlags) MultiBootOffset = XFsbl_In32(CSU_CSU_MULTI_BOOT); /** + * Check if fallback is enabled + */ + fallback_file = DrvNum == XFSBL_SD_DRV_NUM_0 ? "FLBK.TXT" : "1:/FLBK.TXT"; + XFsbl_Printf(DEBUG_INFO,"Checking fallback trigger file: '%s'\n\r", fallback_file); + rc = f_open(&fallbackFil, fallback_file, FA_CREATE_NEW); + if (rc == FR_EXIST) { + //Previous boot failed -> Fallback mode ON + XFsbl_Printf(DEBUG_INFO," Found fallback trigger file. Fallback mode ON\n\r"); + FlbkOn = 1; + } else if (rc == FR_OK) { + //Previous boot seems to be valid + XFsbl_Printf(DEBUG_INFO," Created fallback trigger file. Fallback mode OFF\n\r"); + f_close(&fallbackFil); + } else { + XFsbl_Printf(DEBUG_INFO," Error opening trigger file: rc= %.8x\n\r", rc); + Status = XFSBL_ERROR_SD_F_OPEN; + XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_SD_F_OPEN\n\r"); + goto END; + } + + /** * Create boot image name */ - XFsbl_MakeSdFileName(boot_file, MultiBootOffset, DrvNum); + XFsbl_MakeSdFileName(boot_file, MultiBootOffset, DrvNum, FlbkOn); rc = f_open(&fil, boot_file, FA_READ); if (rc) {