@@ -177,9 +177,15 @@ int sdmmc_cardinserted() {
177177 return 1 ; //sdmmc_cardready;
178178}
179179
180+
181+ static bool sdmmc_controller_initialised = false;
182+
180183//---------------------------------------------------------------------------------
181- void sdmmc_controller_init () {
184+ void sdmmc_controller_init ( bool force_init ) {
182185//---------------------------------------------------------------------------------
186+
187+ if (!force_init && sdmmc_controller_initialised ) return ;
188+
183189 deviceSD .isSDHC = 0 ;
184190 deviceSD .SDOPT = 0 ;
185191 deviceSD .res = 0 ;
@@ -230,6 +236,8 @@ void sdmmc_controller_init() {
230236 * (vu16 * )(SDMMC_BASE + REG_SDBLKLEN ) = 512 ;
231237 * (vu16 * )(SDMMC_BASE + REG_SDSTOP ) = 0 ;
232238
239+ sdmmc_controller_initialised = true;
240+
233241 setTarget (& deviceSD );
234242}
235243
@@ -486,11 +494,25 @@ void sdmmcMsgHandler(int bytes, void *user_data) {
486494 fifoSendValue32 (FIFO_SDMMC , retval );
487495}
488496
497+ //---------------------------------------------------------------------------------
498+ int sdmmc_nand_startup () {
499+ //---------------------------------------------------------------------------------
500+ sdmmc_controller_init (false);
501+ return sdmmc_nand_init ();
502+ }
503+
504+ //---------------------------------------------------------------------------------
505+ int sdmmc_sd_startup () {
506+ //---------------------------------------------------------------------------------
507+ sdmmc_controller_init (false);
508+ return sdmmc_sdcard_init ();
509+ }
510+
489511//---------------------------------------------------------------------------------
490512void sdmmcValueHandler (u32 value , void * user_data ) {
491513//---------------------------------------------------------------------------------
492514 int result = 0 ;
493-
515+ int sdflag = 0 ;
494516 int oldIME = enterCriticalSection ();
495517
496518 switch (value ) {
@@ -500,12 +522,13 @@ void sdmmcValueHandler(u32 value, void* user_data) {
500522 break ;
501523
502524 case SDMMC_SD_START :
525+ sdflag = 1 ;
526+ /* Falls through. */
527+ case SDMMC_NAND_START :
503528 if (sdmmc_read16 (REG_SDSTATUS0 ) == 0 ) {
504529 result = 1 ;
505530 } else {
506- sdmmc_controller_init ();
507- sdmmc_nand_init ();
508- result = sdmmc_sdcard_init ();
531+ result = (sdflag == 1 ) ? sdmmc_sd_startup () : sdmmc_nand_startup ();
509532 }
510533 break ;
511534
0 commit comments