diff --git a/components/spi_flash/Kconfig b/components/spi_flash/Kconfig index 18b60978f1..e884726c5b 100644 --- a/components/spi_flash/Kconfig +++ b/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 diff --git a/components/spi_flash/flash_ops.c b/components/spi_flash/flash_ops.c index 3bf2b179d1..c7086d3f83 100644 --- a/components/spi_flash/flash_ops.c +++ b/components/spi_flash/flash_ops.c @@ -236,11 +236,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);