|
|
@@ -22,6 +22,7 @@
|
|
|
#include "esp_log.h"
|
|
|
#include "sdkconfig.h"
|
|
|
#include "esp_heap_caps.h"
|
|
|
+#include "esp_flash_internal.h"
|
|
|
|
|
|
static const char TAG[] = "spi_flash";
|
|
|
|
|
|
@@ -42,7 +43,7 @@ static const char TAG[] = "spi_flash";
|
|
|
#define CHECK_WRITE_ADDRESS(CHIP, ADDR, SIZE)
|
|
|
#else /* FAILS or ABORTS */
|
|
|
#define CHECK_WRITE_ADDRESS(CHIP, ADDR, SIZE) do { \
|
|
|
- if (CHIP && CHIP->host->region_protected && CHIP->host->region_protected(CHIP->host, ADDR, SIZE)) { \
|
|
|
+ if (CHIP && CHIP->os_func->region_protected && CHIP->os_func->region_protected(CHIP->os_func_data, ADDR, SIZE)) { \
|
|
|
UNSAFE_WRITE_ADDRESS; \
|
|
|
} \
|
|
|
} while(0)
|
|
|
@@ -294,14 +295,15 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
}
|
|
|
|
|
|
- esp_err_t err = spiflash_start(chip);
|
|
|
- if (err != ESP_OK) {
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
+ esp_err_t err = ESP_OK;
|
|
|
// Check for write protected regions overlapping the erase region
|
|
|
if (chip->chip_drv->get_protected_regions != NULL &&
|
|
|
chip->chip_drv->num_protectable_regions > 0) {
|
|
|
+
|
|
|
+ err = spiflash_start(chip);
|
|
|
+ if (err != ESP_OK) {
|
|
|
+ return err;
|
|
|
+ }
|
|
|
uint64_t protected = 0;
|
|
|
err = chip->chip_drv->get_protected_regions(chip, &protected);
|
|
|
if (err == ESP_OK && protected != 0) {
|
|
|
@@ -313,10 +315,10 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ // Don't lock the SPI flash for the entire erase, as this may be very long
|
|
|
+ err = spiflash_end(chip, err);
|
|
|
}
|
|
|
|
|
|
- // Don't lock the SPI flash for the entire erase, as this may be very long
|
|
|
- err = spiflash_end(chip, err);
|
|
|
|
|
|
while (err == ESP_OK && len >= sector_size) {
|
|
|
err = spiflash_start(chip);
|
|
|
@@ -615,13 +617,24 @@ esp_err_t IRAM_ATTR esp_flash_read_encrypted(esp_flash_t *chip, uint32_t address
|
|
|
return spi_flash_read_encrypted(address, out_buffer, length);
|
|
|
}
|
|
|
|
|
|
+#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
|
+esp_err_t esp_flash_app_disable_protect(bool disable)
|
|
|
+{
|
|
|
+ if (disable) {
|
|
|
+ return esp_flash_app_disable_os_functions(esp_flash_default_chip);
|
|
|
+ } else {
|
|
|
+ return esp_flash_app_init_os_functions(esp_flash_default_chip);
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/*------------------------------------------------------------------------------
|
|
|
Adapter layer to original api before IDF v4.0
|
|
|
------------------------------------------------------------------------------*/
|
|
|
|
|
|
#ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL
|
|
|
|
|
|
-static esp_err_t spi_flash_translate_rc(esp_err_t err)
|
|
|
+static IRAM_ATTR esp_err_t spi_flash_translate_rc(esp_err_t err)
|
|
|
{
|
|
|
switch (err) {
|
|
|
case ESP_OK:
|
|
|
@@ -644,19 +657,19 @@ static esp_err_t spi_flash_translate_rc(esp_err_t err)
|
|
|
return ESP_OK;
|
|
|
}
|
|
|
|
|
|
-esp_err_t spi_flash_erase_range(uint32_t start_addr, uint32_t size)
|
|
|
+esp_err_t IRAM_ATTR spi_flash_erase_range(uint32_t start_addr, uint32_t size)
|
|
|
{
|
|
|
esp_err_t err = esp_flash_erase_region(NULL, start_addr, size);
|
|
|
return spi_flash_translate_rc(err);
|
|
|
}
|
|
|
|
|
|
-esp_err_t spi_flash_write(size_t dst, const void *srcv, size_t size)
|
|
|
+esp_err_t IRAM_ATTR spi_flash_write(size_t dst, const void *srcv, size_t size)
|
|
|
{
|
|
|
esp_err_t err = esp_flash_write(NULL, srcv, dst, size);
|
|
|
return spi_flash_translate_rc(err);
|
|
|
}
|
|
|
|
|
|
-esp_err_t spi_flash_read(size_t src, void *dstv, size_t size)
|
|
|
+esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size)
|
|
|
{
|
|
|
esp_err_t err = esp_flash_read(NULL, dstv, src, size);
|
|
|
return spi_flash_translate_rc(err);
|