From 174a7b29d974fdc19dd6b93c390b97a5d1e25b5d Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 27 Jul 2012 17:52:03 +0000 Subject: [PATCH] [ersky9x] Radio blocked on start when playing a sound before SD card initialization end. --- src/eeprom_arm.cpp | 8 ++++++++ src/ersky9x/audio.cpp | 3 +++ src/ersky9x/diskio.c | 35 ++++++++++++++++------------------- src/logs.cpp | 2 +- src/sdcard.h | 11 +++++++++++ 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/eeprom_arm.cpp b/src/eeprom_arm.cpp index 65e1d97ed..4638b588c 100644 --- a/src/eeprom_arm.cpp +++ b/src/eeprom_arm.cpp @@ -921,6 +921,10 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc) DIR archiveFolder; UINT written; + if (!sd_card_mounted()) { + return STR_NO_SDCARD; + } + // check and create folder here strcpy(buf, STR_MODELS_PATH); FRESULT result = f_opendir(&archiveFolder, buf); @@ -992,6 +996,10 @@ const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name) FIL restoreFile; UINT read; + if (!sd_card_mounted()) { + return STR_NO_SDCARD; + } + strcpy(buf, STR_MODELS_PATH); buf[sizeof(MODELS_PATH)-1] = '/'; strcpy(&buf[sizeof(MODELS_PATH)], model_name); diff --git a/src/ersky9x/audio.cpp b/src/ersky9x/audio.cpp index b6397b2f4..d5d00c221 100644 --- a/src/ersky9x/audio.cpp +++ b/src/ersky9x/audio.cpp @@ -462,6 +462,9 @@ void AudioQueue::playFile(const char *filename, uint8_t flags) printf("playFile(\"%s\")\n", filename); fflush(stdout); #endif + if (!sd_card_mounted()) + return; + CoEnterMutexSection(audioMutex); uint8_t next_widx = (widx + 1) % AUDIO_QUEUE_LENGTH; diff --git a/src/ersky9x/diskio.c b/src/ersky9x/diskio.c index 5f413ff51..ee1a5f70b 100644 --- a/src/ersky9x/diskio.c +++ b/src/ersky9x/diskio.c @@ -67,6 +67,7 @@ #define CARD_SDHCCOMBO (CARD_TYPE_bmSDIO|CARD_SDHC) // States for initialising card +#define SD_ST_ERR -1 #define SD_ST_EMPTY 0 #define SD_ST_INIT1 1 #define SD_ST_INIT2 2 @@ -76,12 +77,12 @@ #define SD_ST_STBY 6 #define SD_ST_TRAN 7 #define SD_ST_DATA 8 -#define SD_ST_ERR 9 +#define SD_ST_MOUNTED 9 uint32_t Card_ID[4] ; uint32_t Card_SCR[2] ; uint32_t Card_CSD[4] ; -uint32_t Card_state = SD_ST_EMPTY ; +int32_t Card_state = SD_ST_EMPTY ; uint32_t Sd_128_resp[4] ; uint32_t Sd_rca ; uint32_t Cmd_8_resp ; @@ -857,11 +858,15 @@ void sdPoll10mS() case SD_ST_TRAN: sdAcmd51(); - Card_state = SD_ST_DATA; sdAcmd6(); // Set bus width to 4 bits, and speed to 9 MHz // Should check the card can do this **** + Card_state = SD_ST_DATA; + break; + + case SD_ST_DATA: f_mount(0, &g_FATFS_Obj); retrieveAvailableAudioFiles(); + Card_state = SD_ST_MOUNTED; break; case SD_ST_ERR: @@ -873,14 +878,12 @@ void sdPoll10mS() // returns 1 for YES, 0 for NO uint32_t sd_card_ready( void ) { - if ( CardIsConnected() ) - { - if ( Card_state == SD_ST_DATA ) - { - return 1 ; - } - } - return 0 ; + return CardIsConnected() && Card_state >= SD_ST_DATA; +} + +uint32_t sd_card_mounted( void ) +{ + return CardIsConnected() && Card_state == SD_ST_MOUNTED; } uint32_t sd_cmd16() @@ -917,8 +920,7 @@ uint32_t sd_read_block(uint32_t block_no, uint32_t *data) CoEnterMutexSection(sdMutex); - if (Card_state == SD_ST_DATA) { - if (CardIsConnected()) { + if (sd_card_ready()) { sd_cmd16(); // Block size = 512, nblocks = 1 phsmci->HSMCI_BLKR = ((512) << 16) | 1; @@ -937,8 +939,6 @@ uint32_t sd_read_block(uint32_t block_no, uint32_t *data) break; } } - - } } phsmci->HSMCI_MR &= ~(uint32_t)HSMCI_MR_PDCMODE; @@ -954,8 +954,7 @@ uint32_t sd_write_block( uint32_t block_no, uint32_t *data ) CoEnterMutexSection(sdMutex); - if (Card_state == SD_ST_DATA) { - if (CardIsConnected()) { + if (sd_card_ready()) { sd_cmd16(); // Block size = 512, nblocks = 1 phsmci->HSMCI_BLKR = ((512) << 16) | 1; @@ -974,8 +973,6 @@ uint32_t sd_write_block( uint32_t block_no, uint32_t *data ) break; } } - - } } phsmci->HSMCI_MR &= ~(uint32_t)HSMCI_MR_PDCMODE; diff --git a/src/logs.cpp b/src/logs.cpp index e9ad91bf2..77e68d068 100644 --- a/src/logs.cpp +++ b/src/logs.cpp @@ -133,7 +133,7 @@ void writeLogs() lastLogTime = tmr10ms; if (!g_oLogFile.fs) { - if (openLogs()) + if (!sd_card_mounted() || openLogs()) return; } diff --git a/src/sdcard.h b/src/sdcard.h index d3d47b46e..6b9cfbeed 100644 --- a/src/sdcard.h +++ b/src/sdcard.h @@ -70,5 +70,16 @@ inline const pm_char *SDCARD_ERROR(FRESULT result) extern void sdPoll10mS(); +#if defined(PCBARM) +extern "C" { +extern uint32_t sd_card_ready(); +extern uint32_t sd_card_mounted(); +} +#else +#define sd_card_ready() (true) +#define sd_card_mounted() (true) +#endif + + #endif