diff --git a/applications/storage/storages/storage_ext.c b/applications/storage/storages/storage_ext.c index 4a9d4218..7341a6ec 100644 --- a/applications/storage/storages/storage_ext.c +++ b/applications/storage/storages/storage_ext.c @@ -26,8 +26,7 @@ static FS_Error storage_ext_parse_error(SDError error); static bool sd_mount_card(StorageData* storage, bool notify) { bool result = false; - const uint8_t max_init_counts = 10; - uint8_t counter = max_init_counts; + uint8_t counter = BSP_SD_MaxMountRetryCount(); uint8_t bsp_result; SDData* sd_data = storage->data; diff --git a/firmware/targets/f7/Src/update.c b/firmware/targets/f7/Src/update.c index af247195..36204829 100644 --- a/firmware/targets/f7/Src/update.c +++ b/firmware/targets/f7/Src/update.c @@ -22,6 +22,21 @@ static FATFS* pfs = NULL; } \ } +static bool flipper_update_mount_sd() { + for(int i = 0; i < BSP_SD_MaxMountRetryCount(); ++i) { + if(BSP_SD_Init((i % 2) == 0) != MSD_OK) { + /* Next attempt will be without card reset, let it settle */ + furi_delay_ms(1000); + continue; + } + + if(f_mount(pfs, "/", 1) == FR_OK) { + return true; + } + } + return false; +} + static bool flipper_update_init() { furi_hal_clock_init(); furi_hal_rtc_init(); @@ -34,13 +49,9 @@ static bool flipper_update_init() { return false; } - if(BSP_SD_Init(true)) { - return false; - } - pfs = malloc(sizeof(FATFS)); - CHECK_FRESULT(f_mount(pfs, "/", 1)); - return true; + + return flipper_update_mount_sd(); } static bool flipper_update_load_stage(const string_t work_dir, UpdateManifest* manifest) { diff --git a/firmware/targets/f7/fatfs/stm32_adafruit_sd.c b/firmware/targets/f7/fatfs/stm32_adafruit_sd.c index 1ca38abe..6db430a5 100644 --- a/firmware/targets/f7/fatfs/stm32_adafruit_sd.c +++ b/firmware/targets/f7/fatfs/stm32_adafruit_sd.c @@ -331,6 +331,10 @@ void SD_SPI_Bus_To_Normal_State() { * @{ */ +uint8_t BSP_SD_MaxMountRetryCount() { + return 10; +} + /** * @brief Initializes the SD/SD communication. * @param None diff --git a/firmware/targets/f7/fatfs/stm32_adafruit_sd.h b/firmware/targets/f7/fatfs/stm32_adafruit_sd.h index 74a0e0c2..e0c5e3be 100644 --- a/firmware/targets/f7/fatfs/stm32_adafruit_sd.h +++ b/firmware/targets/f7/fatfs/stm32_adafruit_sd.h @@ -198,6 +198,7 @@ typedef struct { /** @defgroup STM32_ADAFRUIT_SD_Exported_Functions * @{ */ +uint8_t BSP_SD_MaxMountRetryCount(); uint8_t BSP_SD_Init(bool reset_card); uint8_t BSP_SD_ReadBlocks(uint32_t* pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout); diff --git a/site_scons/site_tools/fbt_apps.py b/site_scons/site_tools/fbt_apps.py index 2ffdcae3..a0c43fa7 100644 --- a/site_scons/site_tools/fbt_apps.py +++ b/site_scons/site_tools/fbt_apps.py @@ -1,8 +1,8 @@ from SCons.Builder import Builder from SCons.Action import Action -from SCons.Errors import UserError - +from SCons.Warnings import warn, WarningOnByDefault import SCons + from fbt.appmanifest import ( FlipperAppType, AppManager, @@ -22,7 +22,7 @@ def LoadApplicationManifests(env): try: appmgr.load_manifest(entry.File("application.fam").abspath, entry.name) except FlipperManifestException as e: - raise UserError(e) + warn(WarningOnByDefault, str(e)) def PrepareApplicationsBuild(env):