sw_apps:zynqmp_fsbl: Fix for issue with SD1 boot when design has no SD0
This patch deduces correct drive number for SD based on which SD instance(s) are in design and the boot mode used. Signed-off-by: Sarat Chand Savitala <saratcha@xilinx.com> Acked-by: Krishna Chaitanya Patakamuri <kpataka@xilinx.com>
This commit is contained in:
parent
a83a191293
commit
816e90b214
4 changed files with 51 additions and 14 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue