运行裸FSBL,不要DDR,并且也不跳转到SSBL,即UBOOT。直接在FSBL中加入用户的应用程序的代码,这样,就可以在没有DDR的环境下,运行PS。但是限制条件是,FSBL不能超过192K,从而保证OCM可以容纳FSBL的运行。
需要在FSBL的源代码中做相应的修改。
首先,要去除DDR读写检查的代码。在main.c文件中。
#if 0
Status = DDRInitCheck();
if (Status == XST_FAILURE) {
fsbl_printf(DEBUG_GENERAL,"DDR_INIT_FAIL \r\n");
/* Error Handling here */
OutputStatus(DDR_INIT_FAIL);
/*
* Calling FsblHookFallback instead of Fallback
* since, devcfg driver is not yet initialized
*/
FsblHookFallback();
}
#endif
另外,我们在读FSBL代码时也发现,为什么SDCard启动时,一定要命名为BOOT.BIN。
/*
* SD BOOT MODE
*/
#if defined(XPAR_PS7_SD_0_S_AXI_BASEADDR) || defined(XPAR_XSDPS_0_BASEADDR)
if (BootModeRegister == SD_MODE) {
fsbl_printf(DEBUG_GENERAL,"Boot mode is SD\r\n");
/*
* SD initialization returns file open error or success
*/
Status = InitSD("BOOT.BIN");
if (Status != XST_SUCCESS) {
fsbl_printf(DEBUG_GENERAL,"SD_INIT_FAIL\r\n");
OutputStatus(SD_INIT_FAIL);
FsblFallback();
}
MoveImage = SDAccess;
fsbl_printf(DEBUG_INFO,"SD Init Done \r\n");
} else
if (BootModeRegister == MMC_MODE) {
fsbl_printf(DEBUG_GENERAL,"Booting Device is MMC\r\n");
/*
* MMC initialization returns file open error or success
*/
Status = InitSD("BOOT.BIN");
if (Status != XST_SUCCESS) {
fsbl_printf(DEBUG_GENERAL,"MMC_INIT_FAIL\r\n");
OutputStatus(SD_INIT_FAIL);
FsblFallback();
}
MoveImage = SDAccess;
fsbl_printf(DEBUG_INFO,"MMC Init Done \r\n");
} else
#endif
注意,initSD(“BOOT.BIN”),指定了从SD卡的FAT32分区查找的启动文件名。
最后,FSBL加载了IMAGE之后,会返回一个HandoffAddress,这个地址就是BOOT.BIN中的SSBL的运行地址。
/*
* Load boot image
*/
HandoffAddress = LoadBootImage();
/*
* FSBL handoff to valid handoff address or
* exit in JTAG
*/
FsblHandoff(HandoffAddress);
注意,FSBL移交之后,就不会再跳转回来了。这就是Call调用和Handoff移交的最重要区别。
所以,我们要做的,就是阻止FSBL最后的handoff,方法很简单,在handoff之前加入死循环即可。
while(1);
FsblHandoff(HandoffAddress);
然后,在这个死循环之前,加入我们自己的任务函数的调用。
do_user_application(...);
while(1);
FsblHandoff(HandoffAddress);
这个函数,就是我们的自定义用户程序了。