[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:
parent
712a48b5db
commit
84550d5878
@ -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;
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user