From 656daa75fafa47803b42c45eaa08068c96628441 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 14 Jun 2017 23:33:31 +0200 Subject: [PATCH] Fix SDcard size and format issue (#5004) * - fix overflow in SDcard size computation - fix format function - implement more informative format error handling * Move to a function --- radio/src/gui/480x272/radio_sdmanager.cpp | 6 +--- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 12 +++---- radio/src/sdcard.cpp | 33 ++++++++++++++++++- radio/src/sdcard.h | 1 + 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 125424e28..10874a11d 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -151,14 +151,10 @@ bool menuRadioSdManager(event_t _event) showMessageBox(STR_FORMATTING); logsClose(); audioQueue.stopSD(); - BYTE work[_MAX_SS]; - if (f_mkfs(0, FM_FAT32, 0, work, sizeof(work)) == FR_OK) { + if(sdCardFormat()) { f_chdir("/"); REFRESH_FILES(); } - else { - POPUP_WARNING(STR_SDCARD_ERROR); - } } event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index f560cdb32..8e99429db 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -174,14 +174,10 @@ void menuRadioSdManager(event_t _event) #if defined(CPUARM) audioQueue.stopSD(); #endif - BYTE work[_MAX_SS]; - if (f_mkfs(0, FM_FAT32, 0, work, sizeof(work)) == FR_OK) { + if(sdCardFormat()) { f_chdir("/"); REFRESH_FILES(); } - else { - POPUP_WARNING(STR_SDCARD_ERROR); - } } #if LCD_DEPTH > 1 @@ -190,7 +186,7 @@ void menuRadioSdManager(event_t _event) event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabGeneral, MENU_RADIO_SD_MANAGER, HEADER_LINE + reusableBuffer.sdmanager.count); - + switch (_event) { case EVT_ENTRY: f_chdir(ROOT_PATH); @@ -199,11 +195,11 @@ void menuRadioSdManager(event_t _event) lastPos = -1; #endif break; - + case EVT_ENTRY_UP: menuVerticalOffset = reusableBuffer.sdmanager.offset; break; - + #if defined(PCBTARANIS) case EVT_KEY_LONG(KEY_MENU): if (!READ_ONLY() && s_editMode == 0) { diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index c3544c10b..b24759c20 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -22,6 +22,37 @@ #include "opentx.h" #include "diskio.h" +bool sdCardFormat() +{ + BYTE work[_MAX_SS]; + FRESULT res = f_mkfs("", FM_FAT32, 0, work, sizeof(work)); + switch(res) { + case FR_OK : + return true; + case FR_DISK_ERR: + POPUP_WARNING("Format error"); + return false; + case FR_NOT_READY: + POPUP_WARNING("SDCard not ready"); + return false; + case FR_WRITE_PROTECTED: + POPUP_WARNING("SDCard write protected"); + return false; + case FR_INVALID_PARAMETER: + POPUP_WARNING("Format param invalid"); + return false; + case FR_INVALID_DRIVE: + POPUP_WARNING("Invalid drive"); + return false; + case FR_MKFS_ABORTED: + POPUP_WARNING("Format aborted"); + return false; + default: + POPUP_WARNING(STR_SDCARD_ERROR); + return false; + } +} + const char * sdCheckAndCreateDirectory(const char * path) { DIR archiveFolder; @@ -472,7 +503,7 @@ uint32_t sdGetNoSectors() uint32_t sdGetSize() { - return (sdGetNoSectors() * BLOCK_SIZE) / 1000000; + return (sdGetNoSectors() / 1000000) * BLOCK_SIZE; } uint32_t sdGetFreeSectors() diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 1edbdb7b3..c4ba537c9 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -95,6 +95,7 @@ void logsInit(); void logsClose(); void logsWrite(); +bool sdCardFormat(); uint32_t sdGetNoSectors(); uint32_t sdGetSize(); uint32_t sdGetFreeSectors();