From 304f67e42a4b251a7dc79f4179d4dba670c07e99 Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Fri, 24 Apr 2020 02:09:15 +0800 Subject: [PATCH] spi_flash(LEGACY_IMPL): Add a Kconfig option - Bypass a block erase and always do sector erase Closes: IDF-1561 --- components/spi_flash/Kconfig | 8 ++++++++ components/spi_flash/flash_ops.c | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/components/spi_flash/Kconfig b/components/spi_flash/Kconfig index c9dd305a1f..6785852488 100644 --- a/components/spi_flash/Kconfig +++ b/components/spi_flash/Kconfig @@ -100,6 +100,14 @@ menu "SPI Flash driver" this option, and the lock will be bypassed on SPI1 bus. Otherwise if extra devices are needed to attach to SPI1 bus, enable this option. + 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 91d77c77c7..81fa35fce6 100644 --- a/components/spi_flash/flash_ops.c +++ b/components/spi_flash/flash_ops.c @@ -247,11 +247,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);