Эх сурвалжийг харах

spi_flash(LEGACY_IMPL): Add a Kconfig option - Bypass a block erase and always do sector erase

Closes: IDF-1561
KonstantinKondrashov 5 жил өмнө
parent
commit
5c98ff015e

+ 8 - 0
components/spi_flash/Kconfig

@@ -84,6 +84,14 @@ menu "SPI Flash driver"
             The implementation of SPI flash has been greatly changed in IDF v4.0.
             Enable this option to use the legacy implementation.
 
+    config SPI_FLASH_BYPASS_BLOCK_ERASE
+        bool "Bypass a block erase and always do sector erase"
+        default n
+        help
+            Some flash chips can have very high "max" erase times, especially for block erase (32KB or 64KB).
+            This option allows to bypass "block erase" and always do sector erase commands.
+            This will be much slower overall in most cases, but improves latency for other code to run.
+
     config SPI_FLASH_YIELD_DURING_ERASE
         bool "Enables yield operation during flash erase"
         default y

+ 4 - 1
components/spi_flash/flash_ops.c

@@ -244,11 +244,14 @@ esp_err_t IRAM_ATTR spi_flash_erase_range(size_t start_addr, size_t size)
             int64_t start_time_us = esp_timer_get_time();
 #endif
             spi_flash_guard_start();
+#ifndef CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE
             if (sector % sectors_per_block == 0 && end - sector >= sectors_per_block) {
                 rc = esp_rom_spiflash_erase_block(sector / sectors_per_block);
                 sector += sectors_per_block;
                 COUNTER_ADD_BYTES(erase, sectors_per_block * SPI_FLASH_SEC_SIZE);
-            } else {
+            } else
+#endif
+            {
                 rc = esp_rom_spiflash_erase_sector(sector);
                 ++sector;
                 COUNTER_ADD_BYTES(erase, SPI_FLASH_SEC_SIZE);