diff --git a/components/bootloader_support/include_bootloader/bootloader_flash.h b/components/bootloader_support/include_bootloader/bootloader_flash.h index 763136e03..85a482781 100644 --- a/components/bootloader_support/include_bootloader/bootloader_flash.h +++ b/components/bootloader_support/include_bootloader/bootloader_flash.h @@ -21,6 +21,7 @@ #include "esp_spi_flash.h" #define FLASH_SECTOR_SIZE 0x1000 +#define FLASH_BLOCK_SIZE 0x10000 /* Provide a Flash API for bootloader_support code, that can be used from bootloader or app code. @@ -100,4 +101,14 @@ esp_err_t bootloader_flash_write(size_t dest_addr, void *src, size_t size, bool */ esp_err_t bootloader_flash_erase_sector(size_t sector); +/** + * @brief Erase the Flash range. + * + * @param start_addr start address of flash offset + * @param size sector aligned size to be erased + * + * @return esp_err_t + */ +esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size); + #endif diff --git a/components/bootloader_support/src/bootloader_common.c b/components/bootloader_support/src/bootloader_common.c index a17492601..479407845 100644 --- a/components/bootloader_support/src/bootloader_common.c +++ b/components/bootloader_support/src/bootloader_common.c @@ -106,8 +106,8 @@ bool bootloader_common_erase_part_type_data(const char *list_erase, bool ota_dat partitions = bootloader_mmap(ESP_PARTITION_TABLE_OFFSET, ESP_PARTITION_TABLE_MAX_LEN); if (!partitions) { - ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", ESP_PARTITION_TABLE_OFFSET, ESP_PARTITION_TABLE_MAX_LEN); - return false; + ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", ESP_PARTITION_TABLE_OFFSET, ESP_PARTITION_TABLE_MAX_LEN); + return false; } ESP_LOGD(TAG, "mapped partition table 0x%x at 0x%x", ESP_PARTITION_TABLE_OFFSET, (intptr_t)partitions); @@ -128,7 +128,7 @@ bool bootloader_common_erase_part_type_data(const char *list_erase, bool ota_dat // partition->label is not null-terminated string. strncpy(label, (char *)&partition->label, sizeof(label) - 1); if (fl_ota_data_erase == true || (bootloader_common_label_search(list_erase, label) == true)) { - err = esp_rom_spiflash_erase_area(partition->pos.offset, partition->pos.size); + err = bootloader_flash_erase_range(partition->pos.offset, partition->pos.size); if (err != ESP_OK) { ret = false; marker = "err"; diff --git a/components/bootloader_support/src/bootloader_flash.c b/components/bootloader_support/src/bootloader_flash.c index a7a6f6e61..735c21327 100644 --- a/components/bootloader_support/src/bootloader_flash.c +++ b/components/bootloader_support/src/bootloader_flash.c @@ -73,6 +73,11 @@ esp_err_t bootloader_flash_erase_sector(size_t sector) return spi_flash_erase_sector(sector); } +esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size) +{ + return spi_flash_erase_range(start_addr, size); +} + #else /* Bootloader version, uses ROM functions only */ #include @@ -247,4 +252,28 @@ esp_err_t bootloader_flash_erase_sector(size_t sector) return spi_to_esp_err(esp_rom_spiflash_erase_sector(sector)); } +esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size) +{ + if (start_addr % FLASH_SECTOR_SIZE != 0) { + return ESP_ERR_INVALID_ARG; + } + if (size % FLASH_SECTOR_SIZE != 0) { + return ESP_ERR_INVALID_SIZE; + } + size_t start = start_addr / FLASH_SECTOR_SIZE; + size_t end = start + size / FLASH_SECTOR_SIZE; + const size_t sectors_per_block = FLASH_BLOCK_SIZE / FLASH_SECTOR_SIZE; + + esp_rom_spiflash_result_t rc = ESP_ROM_SPIFLASH_RESULT_OK; + for (size_t sector = start; sector != end && rc == ESP_ROM_SPIFLASH_RESULT_OK; ) { + 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; + } else { + rc = esp_rom_spiflash_erase_sector(sector); + ++sector; + } + } + return spi_to_esp_err(rc); +} #endif