[FL-2654] Updater: retrying pre-boot SD card mount multiple times (#1402)

* Updater: retrying pre-boot SD card mount multiple times
* Updater: added delay before retrying SD card mount on early boot

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
hedger 2022-07-31 02:48:55 +03:00 committed by GitHub
parent 712a48b5db
commit 84550d5878
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 11 deletions

View File

@ -26,8 +26,7 @@ static FS_Error storage_ext_parse_error(SDError error);
static bool sd_mount_card(StorageData* storage, bool notify) { static bool sd_mount_card(StorageData* storage, bool notify) {
bool result = false; bool result = false;
const uint8_t max_init_counts = 10; uint8_t counter = BSP_SD_MaxMountRetryCount();
uint8_t counter = max_init_counts;
uint8_t bsp_result; uint8_t bsp_result;
SDData* sd_data = storage->data; SDData* sd_data = storage->data;

View File

@ -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() { static bool flipper_update_init() {
furi_hal_clock_init(); furi_hal_clock_init();
furi_hal_rtc_init(); furi_hal_rtc_init();
@ -34,13 +49,9 @@ static bool flipper_update_init() {
return false; return false;
} }
if(BSP_SD_Init(true)) {
return false;
}
pfs = malloc(sizeof(FATFS)); 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) { static bool flipper_update_load_stage(const string_t work_dir, UpdateManifest* manifest) {

View File

@ -331,6 +331,10 @@ void SD_SPI_Bus_To_Normal_State() {
* @{ * @{
*/ */
uint8_t BSP_SD_MaxMountRetryCount() {
return 10;
}
/** /**
* @brief Initializes the SD/SD communication. * @brief Initializes the SD/SD communication.
* @param None * @param None

View File

@ -198,6 +198,7 @@ typedef struct {
/** @defgroup STM32_ADAFRUIT_SD_Exported_Functions /** @defgroup STM32_ADAFRUIT_SD_Exported_Functions
* @{ * @{
*/ */
uint8_t BSP_SD_MaxMountRetryCount();
uint8_t BSP_SD_Init(bool reset_card); uint8_t BSP_SD_Init(bool reset_card);
uint8_t uint8_t
BSP_SD_ReadBlocks(uint32_t* pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout); BSP_SD_ReadBlocks(uint32_t* pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout);

View File

@ -1,8 +1,8 @@
from SCons.Builder import Builder from SCons.Builder import Builder
from SCons.Action import Action from SCons.Action import Action
from SCons.Errors import UserError from SCons.Warnings import warn, WarningOnByDefault
import SCons import SCons
from fbt.appmanifest import ( from fbt.appmanifest import (
FlipperAppType, FlipperAppType,
AppManager, AppManager,
@ -22,7 +22,7 @@ def LoadApplicationManifests(env):
try: try:
appmgr.load_manifest(entry.File("application.fam").abspath, entry.name) appmgr.load_manifest(entry.File("application.fam").abspath, entry.name)
except FlipperManifestException as e: except FlipperManifestException as e:
raise UserError(e) warn(WarningOnByDefault, str(e))
def PrepareApplicationsBuild(env): def PrepareApplicationsBuild(env):