|
|
@@ -44,6 +44,7 @@
|
|
|
#include "cache_utils.h"
|
|
|
#include "esp_flash.h"
|
|
|
#include "esp_attr.h"
|
|
|
+#include "esp_timer.h"
|
|
|
|
|
|
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size);
|
|
|
|
|
|
@@ -238,7 +239,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);
|
|
|
@@ -250,6 +257,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);
|