From 84f3444691b108b01b4805b0e98f6ad1f99b4459 Mon Sep 17 00:00:00 2001 From: Lingkai Dong Date: Thu, 10 Sep 2020 16:09:28 +0100 Subject: [PATCH 1/3] Add config target.internal-flash-uniform-sectors and set it to false for STM32L2/4/7 Some internal flashes have non-uniform sectors, and for those ones we want to skip the initialization of default LittleFileSystem on FlashIAPBlockDevice (unless the user specifies an address range that's uniform). This commit adds a config to indicate if sectors are uniform. --- targets/targets.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/targets/targets.json b/targets/targets.json index a2458619ad..ba30fddc99 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -84,6 +84,10 @@ "default-adc-vref": { "help": "Default reference voltage for ADC (float)", "value": "NAN" + }, + "internal-flash-uniform-sectors": { + "help": "Target's internal flash has uniform sector sizes", + "value": true } } }, @@ -1344,6 +1348,9 @@ "macro_name": "CLOCK_SOURCE" } }, + "overrides": { + "internal-flash-uniform-sectors": false + }, "device_has_add": [ "ANALOGOUT", "CAN", @@ -1495,6 +1502,9 @@ "macro_name": "CLOCK_SOURCE" } }, + "overrides": { + "internal-flash-uniform-sectors": false + }, "device_has_add": [ "SERIAL_ASYNCH", "FLASH", @@ -2109,7 +2119,8 @@ } }, "overrides": { - "lpticker_delay_ticks": 0 + "lpticker_delay_ticks": 0, + "internal-flash-uniform-sectors": false }, "macros_add": [ "MBED_TICKLESS", From 577d450c7b6824b3200b148c4b4a5ad373da21bd Mon Sep 17 00:00:00 2001 From: Lingkai Dong Date: Thu, 10 Sep 2020 16:12:42 +0100 Subject: [PATCH 2/3] PlatformStorage: skip LittleFileSystem on internal flash with non-uniform sectors --- storage/platform/source/PlatformStorage.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/storage/platform/source/PlatformStorage.cpp b/storage/platform/source/PlatformStorage.cpp index eadc60e4e6..20daad0e2a 100644 --- a/storage/platform/source/PlatformStorage.cpp +++ b/storage/platform/source/PlatformStorage.cpp @@ -156,10 +156,17 @@ MBED_WEAK FileSystem *FileSystem::get_default_instance() #elif COMPONENT_FLASHIAP +// To avoid alignment issues, initialize a filesystem if all sectors have the same size +// OR the user has specified an address range +#if MBED_CONF_TARGET_INTERNAL_FLASH_UNIFORM_SECTORS || \ + (MBED_CONF_FLASHIAP_BLOCK_DEVICE_SIZE != 0) && (MBED_CONF_FLASHIAP_BLOCK_DEVICE_BASE_ADDRESS != 0xFFFFFFFF) static LittleFileSystem flash("flash", BlockDevice::get_default_instance()); flash.set_as_default(); return &flash; +#else + return NULL; +#endif #else From 8910ec6db2fdeea149a7a9a2a22e6958e0491546 Mon Sep 17 00:00:00 2001 From: Lingkai Dong Date: Thu, 10 Sep 2020 16:13:33 +0100 Subject: [PATCH 3/3] kvstore general_tests_phase_1/2 tests: Skip TDBStore if FlashIAP sector size is non-uniform By default TDBStore requires blocks to have the same size. --- .../tests/TESTS/kvstore/general_tests_phase_1/main.cpp | 5 +++++ .../tests/TESTS/kvstore/general_tests_phase_2/main.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_1/main.cpp b/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_1/main.cpp index add632f1b8..ef7ad4d346 100644 --- a/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_1/main.cpp +++ b/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_1/main.cpp @@ -101,6 +101,11 @@ static void kvstore_init() TEST_ASSERT_EQUAL_ERROR_CODE(0, res); if (kv_setup == TDBStoreSet) { +#if COMPONENT_FLASHIAP && !COMPONENT_SPIF && !COMPONENT_QSPIF && !COMPONENT_DATAFLASH && !COMPONENT_SD + // TDBStore requires two areas of equal size, do the check for FlashIAP + TEST_SKIP_UNLESS(MBED_CONF_TARGET_INTERNAL_FLASH_UNIFORM_SECTORS || + (MBED_CONF_FLASHIAP_BLOCK_DEVICE_SIZE != 0) && (MBED_CONF_FLASHIAP_BLOCK_DEVICE_BASE_ADDRESS != 0xFFFFFFFF)) +#endif if (erase_val == -1) { flash_bd = new FlashSimBlockDevice(bd); kvstore = new TDBStore(flash_bd); diff --git a/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_2/main.cpp b/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_2/main.cpp index eb295b9611..a3b7b0fc80 100644 --- a/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_2/main.cpp +++ b/storage/kvstore/tests/TESTS/kvstore/general_tests_phase_2/main.cpp @@ -96,6 +96,11 @@ static void kvstore_init() TEST_ASSERT_EQUAL_ERROR_CODE(0, res); if (kv_setup == TDBStoreSet) { +#if COMPONENT_FLASHIAP && !COMPONENT_SPIF && !COMPONENT_QSPIF && !COMPONENT_DATAFLASH && !COMPONENT_SD + // TDBStore requires two areas of equal size + TEST_SKIP_UNLESS(MBED_CONF_TARGET_INTERNAL_FLASH_UNIFORM_SECTORS || + (MBED_CONF_FLASHIAP_BLOCK_DEVICE_SIZE != 0) && (MBED_CONF_FLASHIAP_BLOCK_DEVICE_BASE_ADDRESS != 0xFFFFFFFF)) +#endif if (erase_val == -1) { flash_bd = new FlashSimBlockDevice(bd); kvstore = new TDBStore(flash_bd);