mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-09 04:25:32 +00:00
Merge branch 'fix/esp_flash_coredump_4.0' into 'release/v4.0'
esp_flash: fix coredump issues (backport v4.0) See merge request espressif/esp-idf!6136
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user