diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h index 48bdb867..937b6012 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_hw.h @@ -539,11 +539,12 @@ extern "C" { /** * Definitions for SD to be included */ -#if (!defined(FSBL_SD_EXCLUDE) && defined(XPAR_XSDPS_0_DEVICE_ID)) +#if (!defined(FSBL_SD_EXCLUDE) && (XPAR_XSDPS_0_BASEADDR == 0xFF160000)) #define XFSBL_SD_0 #endif -#if (!defined(FSBL_SD_EXCLUDE) && defined(XPAR_XSDPS_1_DEVICE_ID)) +#if (!defined(FSBL_SD_EXCLUDE) && (XPAR_XSDPS_0_BASEADDR == 0xFF170000) ||\ + (XPAR_XSDPS_1_BASEADDR == 0xFF170000)) #define XFSBL_SD_1 #endif diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c index 15084148..7f2e6da0 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.c @@ -299,7 +299,7 @@ u32 XFsbl_Htonl(u32 Value1) * ******************************************************************************/ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DeviceFlags) + u32 MultibootReg, u32 DrvNum) { u32 Index; @@ -309,8 +309,7 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, if (0x0U == MultiBootNum) { /* SD file name is BOOT.BIN when Multiboot register value is 0 */ - if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || - (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + if (DrvNum == XFSBL_SD_DRV_NUM_0) { (void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT.BIN"); } else { @@ -321,8 +320,7 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, else { /* set default SD file name as BOOT0000.BIN */ - if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || - (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + if (DrvNum == XFSBL_SD_DRV_NUM_0) { (void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT0000.BIN"); } else { @@ -349,6 +347,39 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, "File name is %s\r\n",XFsbl_SdEmmcFileName); } +/*****************************************************************************/ +/** + * This function is used to obtain drive number based on design and boot mode + * + * @param DeviceFlags contain boot mode information + * + * @return Drive number (0 or 1) + * + *****************************************************************************/ +u32 XFsbl_GetDrvNumSD(u32 DeviceFlags) +{ + u32 DrvNum; + + /* + * If design has both SD0 and SD1, select drive number based on bootmode + * If design has ONLY SD0 or ONLY SD1, drive number should be "0" + */ +#ifdef XPAR_XSDPS_1_DEVICE_ID + if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || + (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + DrvNum = XFSBL_SD_DRV_NUM_0; + } + else { + /* For XFSBL_SD1_BOOT_MODE or XFSBL_SD1_LS_BOOT_MODE */ + DrvNum = XFSBL_SD_DRV_NUM_1; + } +#else + DrvNum = XFSBL_SD_DRV_NUM_0; +#endif + + return DrvNum; +} + /****************************************************************************/ /** * diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h index cecc072e..05e9150b 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_misc.h @@ -62,6 +62,8 @@ extern "C" { #include "xil_exception.h" /************************** Constant Definitions *****************************/ +#define XFSBL_SD_DRV_NUM_0 0 +#define XFSBL_SD_DRV_NUM_1 1 /**************************** Type Definitions *******************************/ @@ -75,7 +77,8 @@ int XFsbl_MemCmp(const void *Str1Ptr, const void *Str2Ptr, u32 Count); char *XFsbl_Strcpy(char *DestPtr, const char *SrcPtr); char * XFsbl_Strcat(char* Str1Ptr, const char* Str2Ptr); void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DeviceFlags); + u32 MultibootReg, u32 DrvNum); +u32 XFsbl_GetDrvNumSD(u32 DeviceFlags); u32 XFsbl_Htonl(u32 Value1); u32 XFsbl_PowerUpIsland(u32 PwrIslandMask); diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c index 17f17ae5..06cb4729 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_sd.c @@ -66,8 +66,9 @@ /************************** Function Prototypes ******************************/ extern void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, - u32 MultibootReg, u32 DeviceFlags); + u32 MultibootReg, u32 DrvNum); +extern u32 XFsbl_GetDrvNumSD(u32 DeviceFlags); /************************** Variable Definitions *****************************/ @@ -91,14 +92,15 @@ u32 XFsbl_SdInit(u32 DeviceFlags) char *boot_file = buffer; u32 MultiBootOffset=0U; TCHAR *path; + u32 DrvNum; - /* Set logical drive number as 0 or 1 based on SD0 or SD1 */ - if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) || - (DeviceFlags == XFSBL_EMMC_BOOT_MODE)) { + DrvNum = XFsbl_GetDrvNumSD(DeviceFlags); + + /* Set logical drive number */ + if (DrvNum == XFSBL_SD_DRV_NUM_0) { path = "0:/"; } else { - /* For XFSBL_SD1_BOOT_MODE or XFSBL_SD1_LS_BOOT_MODE */ path = "1:/"; } @@ -120,7 +122,7 @@ u32 XFsbl_SdInit(u32 DeviceFlags) /** * Create boot image name */ - XFsbl_MakeSdFileName(boot_file, MultiBootOffset, DeviceFlags); + XFsbl_MakeSdFileName(boot_file, MultiBootOffset, DrvNum); rc = f_open(&fil, boot_file, FA_READ); if (rc) {