sw_apps:zynqmp_fsbl: Added support for SD1 and SD1 with level shifter bootmodes

This patch adds support for SD1 and SD1 with level shifter bootmodes in FSBL

Signed-off-by: Sarat Chand Savitala <saratcha@xilinx.com>
Acked-by: Krishna Chaitanya Patakamuri <kpataka@xilinx.com>
This commit is contained in:
Sarat Chand Savitala 2015-09-05 21:51:18 +05:30 committed by Nava kishore Manne
parent 5ed1c08082
commit f6f21678a4
10 changed files with 93 additions and 37 deletions

View file

@ -534,10 +534,14 @@ extern "C" {
#endif
/**
* Definition for SD to be included
* Definitions for SD to be included
*/
#if (!defined(FSBL_SD_EXCLUDE) && defined( XPAR_XSDPS_0_DEVICE_ID))
#define XFSBL_SD
#if (!defined(FSBL_SD_EXCLUDE) && defined(XPAR_XSDPS_0_DEVICE_ID))
#define XFSBL_SD_0
#endif
#if (!defined(FSBL_SD_EXCLUDE) && defined(XPAR_XSDPS_1_DEVICE_ID))
#define XFSBL_SD_1
#endif
/**

View file

@ -451,8 +451,10 @@ static u32 XFsbl_PrimaryBootDeviceInit(XFsblPs * FsblInstancePtr)
if ( (BootMode == XFSBL_QSPI24_BOOT_MODE) ||
(BootMode == XFSBL_QSPI32_BOOT_MODE) ||
(BootMode == XFSBL_NAND_BOOT_MODE) ||
(BootMode == XFSBL_SD_BOOT_MODE) ||
(BootMode == XFSBL_EMMC_BOOT_MODE) ) {
(BootMode == XFSBL_SD0_BOOT_MODE) ||
(BootMode == XFSBL_EMMC_BOOT_MODE) ||
(BootMode == XFSBL_SD1_BOOT_MODE) ||
(BootMode == XFSBL_SD1_LS_BOOT_MODE)) {
/**
* Initialize the WDT and CSU drivers
*/
@ -548,11 +550,16 @@ static u32 XFsbl_PrimaryBootDeviceInit(XFsblPs * FsblInstancePtr)
#endif
} break;
case XFSBL_SD_BOOT_MODE:
case XFSBL_SD0_BOOT_MODE:
case XFSBL_EMMC_BOOT_MODE:
{
XFsbl_Printf(DEBUG_GENERAL,"SD/eMMC Boot Mode \n\r");
#ifdef XFSBL_SD
if (BootMode == XFSBL_SD0_BOOT_MODE) {
XFsbl_Printf(DEBUG_GENERAL,"SD0 Boot Mode \n\r");
}
else {
XFsbl_Printf(DEBUG_GENERAL,"eMMC Boot Mode \n\r");
}
#ifdef XFSBL_SD_0
/**
* Update the deviceops structure with necessary values
*/
@ -569,20 +576,31 @@ static u32 XFsbl_PrimaryBootDeviceInit(XFsblPs * FsblInstancePtr)
#endif
} break;
case XFSBL_USB_BOOT_MODE:
case XFSBL_SD1_BOOT_MODE:
case XFSBL_SD1_LS_BOOT_MODE:
{
XFsbl_Printf(DEBUG_GENERAL,"USB Boot Mode \n\r");
if (BootMode == XFSBL_SD1_BOOT_MODE) {
XFsbl_Printf(DEBUG_GENERAL, "SD1 Boot Mode \n\r");
}
else {
XFsbl_Printf(DEBUG_GENERAL,
"SD1 with level shifter Boot Mode \n\r");
}
#ifdef XFSBL_SD_1
/**
* Update the deviceops structure with necessary values
*
*/
FsblInstancePtr->DeviceOps.DeviceInit = XFsbl_SdInit;
FsblInstancePtr->DeviceOps.DeviceCopy = XFsbl_SdCopy;
FsblInstancePtr->DeviceOps.DeviceRelease = XFsbl_SdRelease;
#else
/**
* This bootmode is not supported in this release
*/
XFsbl_Printf(DEBUG_GENERAL,
"XFSBL_ERROR_UNSUPPORTED_BOOT_MODE\n\r");
"XFSBL_ERROR_UNSUPPORTED_BOOT_MODE\n\r");
Status = XFSBL_ERROR_UNSUPPORTED_BOOT_MODE;
#endif
} break;
default:
@ -604,7 +622,7 @@ static u32 XFsbl_PrimaryBootDeviceInit(XFsblPs * FsblInstancePtr)
/**
* Initialize the Device Driver
*/
Status = FsblInstancePtr->DeviceOps.DeviceInit();
Status = FsblInstancePtr->DeviceOps.DeviceInit(BootMode);
if (XFSBL_SUCCESS != Status) {
goto END;
}
@ -641,8 +659,10 @@ static u32 XFsbl_ValidateHeader(XFsblPs * FsblInstancePtr)
* Calculate the Flash Offset Address
* For file system based devices, Flash Offset Address should be 0 always
*/
if ((FsblInstancePtr->PrimaryBootDevice == XFSBL_SD_BOOT_MODE) ||
(FsblInstancePtr->PrimaryBootDevice == XFSBL_EMMC_BOOT_MODE))
if ((FsblInstancePtr->PrimaryBootDevice == XFSBL_SD0_BOOT_MODE) ||
(FsblInstancePtr->PrimaryBootDevice == XFSBL_EMMC_BOOT_MODE) ||
(FsblInstancePtr->PrimaryBootDevice == XFSBL_SD1_BOOT_MODE) ||
(FsblInstancePtr->PrimaryBootDevice == XFSBL_SD1_LS_BOOT_MODE))
{
FsblInstancePtr->ImageOffsetAddress = 0x0U;
} else {

View file

@ -373,8 +373,10 @@ void XFsbl_ErrorLockDown(u32 ErrorStatus)
if ( (BootMode == XFSBL_QSPI24_BOOT_MODE) ||
(BootMode == XFSBL_QSPI32_BOOT_MODE) ||
(BootMode == XFSBL_NAND_BOOT_MODE) ||
(BootMode == XFSBL_SD_BOOT_MODE) ||
(BootMode == XFSBL_EMMC_BOOT_MODE) )
(BootMode == XFSBL_SD0_BOOT_MODE) ||
(BootMode == XFSBL_EMMC_BOOT_MODE) ||
(BootMode == XFSBL_SD1_BOOT_MODE) ||
(BootMode == XFSBL_SD1_LS_BOOT_MODE) )
{
XFsbl_FallBack();
} else {

View file

@ -118,10 +118,11 @@ typedef struct {
#define XFSBL_JTAG_BOOT_MODE (0x0U)
#define XFSBL_QSPI24_BOOT_MODE (0x1U)
#define XFSBL_QSPI32_BOOT_MODE (0x2U)
#define XFSBL_SD_BOOT_MODE (0x3U)
#define XFSBL_SD0_BOOT_MODE (0x3U)
#define XFSBL_NAND_BOOT_MODE (0x4U)
#define XFSBL_SD1_BOOT_MODE (0x5U)
#define XFSBL_EMMC_BOOT_MODE (0x6U)
#define XFSBL_USB_BOOT_MODE (0x7U)
#define XFSBL_SD1_LS_BOOT_MODE (0xEU)
/**
* FSBL stages definition

View file

@ -52,6 +52,7 @@
/***************************** Include Files *********************************/
#include "xfsbl_hw.h"
#include "xfsbl_main.h"
#include "xil_exception.h"
/************************** Constant Definitions *****************************/
@ -297,7 +298,8 @@ u32 XFsbl_Htonl(u32 Value1)
* @return None
*
******************************************************************************/
void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, u32 MultibootReg)
void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName,
u32 MultibootReg, u32 DeviceFlags)
{
u32 Index;
@ -307,12 +309,26 @@ void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, u32 MultibootReg)
if (0x0U == MultiBootNum)
{
/* SD file name is BOOT.BIN when Multiboot register value is 0 */
(void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT.BIN");
if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) ||
(DeviceFlags == XFSBL_EMMC_BOOT_MODE)) {
(void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT.BIN");
}
else {
/* For XFSBL_SD1_BOOT_MODE or XFSBL_SD1_LS_BOOT_MODE */
(void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "1:/BOOT.BIN");
}
}
else
{
/* set default SD file name as BOOT0000.BIN */
(void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT0000.BIN");
if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) ||
(DeviceFlags == XFSBL_EMMC_BOOT_MODE)) {
(void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "BOOT0000.BIN");
}
else {
/* For XFSBL_SD1_BOOT_MODE or XFSBL_SD1_LS_BOOT_MODE */
(void)XFsbl_Strcpy((char *)XFsbl_SdEmmcFileName, "1:/BOOT0000.BIN");
}
/* Update file name (to BOOTXXXX.BIN) based on Multiboot register value */
for(Index = XFSBL_BASE_FILE_NAME_LEN - 1;

View file

@ -74,7 +74,8 @@ void *XFsbl_MemCpy(void * DestPtr, const void * SrcPtr, u32 Len);
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);
void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName,
u32 MultibootReg, u32 DeviceFlags);
u32 XFsbl_Htonl(u32 Value1);
u32 XFsbl_PowerUpIsland(u32 PwrIslandMask);

View file

@ -85,7 +85,7 @@ void XFsbl_RestartWdt();
typedef struct {
u32 DeviceBaseAddress; /**< Flash device base address */
u32 (*DeviceInit) ();
u32 (*DeviceInit) (u32 DeviceFlags);
/**< Function pointer for Device initialization code */
u32 (*DeviceCopy) (u32 SrcAddress, PTRSIZE DestAddress, u32 Length);
/**< Function pointer for device copy */
@ -97,8 +97,8 @@ typedef struct {
/**
* SD driver functions
*/
#ifdef XFSBL_SD
u32 XFsbl_SdInit(void );
#if (defined(XFSBL_SD_0) || defined(XFSBL_SD_1))
u32 XFsbl_SdInit(u32 DeviceFlags);
u32 XFsbl_SdCopy(u32 SrcAddress, PTRSIZE DestAddress, u32 Length);
u32 XFsbl_SdRelease(void );
#endif
@ -107,7 +107,7 @@ u32 XFsbl_SdRelease(void );
* NAND driver functions
*/
#ifdef XFSBL_NAND
u32 XFsbl_NandInit(void );
u32 XFsbl_NandInit(u32 DeviceFlags);
u32 XFsbl_NandCopy(u32 SrcAddress, PTRSIZE DestAddress, u32 Length);
u32 XFsbl_NandRelease(void );
#endif

View file

@ -184,7 +184,7 @@ END:
* @return None
*
*****************************************************************************/
u32 XFsbl_Qspi24Init()
u32 XFsbl_Qspi24Init(u32 DeviceFlags)
{
XQspiPsu_Config *QspiConfig;
u32 Status = XFSBL_SUCCESS;
@ -730,7 +730,7 @@ u32 XFsbl_Qspi24Release()
* @return None
*
*****************************************************************************/
u32 XFsbl_Qspi32Init()
u32 XFsbl_Qspi32Init(u32 DeviceFlags)
{
XQspiPsu_Config *QspiConfig;
u32 Status = XFSBL_SUCCESS;

View file

@ -183,10 +183,10 @@ extern "C" {
/************************** Function Prototypes ******************************/
u32 XFsbl_Qspi24Init(void );
u32 XFsbl_Qspi24Init(u32 DeviceFlags);
u32 XFsbl_Qspi24Copy(u32 SrcAddress, PTRSIZE DestAddress, u32 Length);
u32 XFsbl_Qspi24Release(void );
u32 XFsbl_Qspi32Init(void );
u32 XFsbl_Qspi32Init(u32 DeviceFlags);
u32 XFsbl_Qspi32Copy(u32 SrcAddress, PTRSIZE DestAddress, u32 Length);
u32 XFsbl_Qspi32Release(void );

View file

@ -51,8 +51,9 @@
******************************************************************************/
/***************************** Include Files *********************************/
#include "xfsbl_hw.h"
#include "xfsbl_main.h"
#ifdef XFSBL_SD
#if (defined(XFSBL_SD_0) || defined(XFSBL_SD_1))
#include "xparameters.h"
#include "ff.h"
@ -64,7 +65,8 @@
/***************** Macros (Inline Functions) Definitions *********************/
/************************** Function Prototypes ******************************/
extern void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName, u32 MultibootReg);
extern void XFsbl_MakeSdFileName(char *XFsbl_SdEmmcFileName,
u32 MultibootReg, u32 DeviceFlags);
/************************** Variable Definitions *****************************/
@ -81,14 +83,24 @@ static FATFS fatfs;
* @return None
*
*****************************************************************************/
u32 XFsbl_SdInit(void )
u32 XFsbl_SdInit(u32 DeviceFlags)
{
u32 Status = XFSBL_SUCCESS;
FRESULT rc;
char buffer[32];
char *boot_file = buffer;
u32 MultiBootOffset=0U;
TCHAR *path = "0:/"; /* Logical drive number is 0 */
TCHAR *path;
/* Set logical drive number as 0 or 1 based on SD0 or SD1 */
if ((DeviceFlags == XFSBL_SD0_BOOT_MODE) ||
(DeviceFlags == XFSBL_EMMC_BOOT_MODE)) {
path = "0:/";
}
else {
/* For XFSBL_SD1_BOOT_MODE or XFSBL_SD1_LS_BOOT_MODE */
path = "1:/";
}
/* Register volume work area, initialize device */
rc = f_mount(&fatfs, path, 0);
@ -108,7 +120,7 @@ u32 XFsbl_SdInit(void )
/**
* Create boot image name
*/
XFsbl_MakeSdFileName(boot_file, MultiBootOffset);
XFsbl_MakeSdFileName(boot_file, MultiBootOffset, DeviceFlags);
rc = f_open(&fil, boot_file, FA_READ);
if (rc) {