|
|
@@ -35,6 +35,7 @@
|
|
|
#include "esp_flash_partitions.h"
|
|
|
#include "cache_utils.h"
|
|
|
#include "esp_flash.h"
|
|
|
+#include "esp_timer.h"
|
|
|
|
|
|
/* bytes erased by SPIEraseBlock() ROM function */
|
|
|
#define BLOCK_ERASE_SIZE 65536
|
|
|
@@ -227,7 +228,13 @@ esp_err_t IRAM_ATTR spi_flash_erase_range(size_t start_addr, size_t size)
|
|
|
esp_rom_spiflash_result_t rc;
|
|
|
rc = spi_flash_unlock();
|
|
|
if (rc == ESP_ROM_SPIFLASH_RESULT_OK) {
|
|
|
+#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
|
|
+ int64_t no_yield_time_us = 0;
|
|
|
+#endif
|
|
|
for (size_t sector = start; sector != end && rc == ESP_ROM_SPIFLASH_RESULT_OK; ) {
|
|
|
+#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
|
|
+ int64_t start_time_us = esp_timer_get_time();
|
|
|
+#endif
|
|
|
spi_flash_guard_start();
|
|
|
if (sector % sectors_per_block == 0 && end - sector >= sectors_per_block) {
|
|
|
rc = esp_rom_spiflash_erase_block(sector / sectors_per_block);
|
|
|
@@ -239,6 +246,13 @@ esp_err_t IRAM_ATTR spi_flash_erase_range(size_t start_addr, size_t size)
|
|
|
COUNTER_ADD_BYTES(erase, SPI_FLASH_SEC_SIZE);
|
|
|
}
|
|
|
spi_flash_guard_end();
|
|
|
+#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
|
|
+ no_yield_time_us += (esp_timer_get_time() - start_time_us);
|
|
|
+ if (no_yield_time_us / 1000 >= CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS) {
|
|
|
+ no_yield_time_us = 0;
|
|
|
+ vTaskDelay(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS);
|
|
|
+ }
|
|
|
+#endif
|
|
|
}
|
|
|
}
|
|
|
COUNTER_STOP(erase);
|