Bladeren bron

[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>
hedger 3 jaren geleden
bovenliggende
commit
84550d5878

+ 1 - 2
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) {
 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 = max_init_counts;
+    uint8_t counter = BSP_SD_MaxMountRetryCount();
     uint8_t bsp_result;
     uint8_t bsp_result;
     SDData* sd_data = storage->data;
     SDData* sd_data = storage->data;
 
 

+ 17 - 6
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() {
 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) {

+ 4 - 0
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.
   * @brief  Initializes the SD/SD communication.
   * @param  None
   * @param  None

+ 1 - 0
firmware/targets/f7/fatfs/stm32_adafruit_sd.h

@@ -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);

+ 3 - 3
site_scons/site_tools/fbt_apps.py

@@ -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):