bootloader: add API for erasing flash region
Signed-off-by: Mahavir Jain <mahavir@espressif.com> Closes: https://github.com/espressif/esp-idf/issues/2166
This commit is contained in:
parent
6250918dfa
commit
1cbdfcc493
3 changed files with 43 additions and 3 deletions
|
@ -21,6 +21,7 @@
|
||||||
#include "esp_spi_flash.h"
|
#include "esp_spi_flash.h"
|
||||||
|
|
||||||
#define FLASH_SECTOR_SIZE 0x1000
|
#define FLASH_SECTOR_SIZE 0x1000
|
||||||
|
#define FLASH_BLOCK_SIZE 0x10000
|
||||||
|
|
||||||
/* Provide a Flash API for bootloader_support code,
|
/* Provide a Flash API for bootloader_support code,
|
||||||
that can be used from bootloader or app code.
|
that can be used from bootloader or app code.
|
||||||
|
@ -100,6 +101,16 @@ 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);
|
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);
|
||||||
|
|
||||||
/* Cache MMU block size */
|
/* Cache MMU block size */
|
||||||
#define MMU_BLOCK_SIZE 0x00010000
|
#define MMU_BLOCK_SIZE 0x00010000
|
||||||
|
|
||||||
|
|
|
@ -102,8 +102,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);
|
partitions = bootloader_mmap(ESP_PARTITION_TABLE_OFFSET, ESP_PARTITION_TABLE_MAX_LEN);
|
||||||
if (!partitions) {
|
if (!partitions) {
|
||||||
ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", ESP_PARTITION_TABLE_OFFSET, ESP_PARTITION_TABLE_MAX_LEN);
|
ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", ESP_PARTITION_TABLE_OFFSET, ESP_PARTITION_TABLE_MAX_LEN);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ESP_LOGD(TAG, "mapped partition table 0x%x at 0x%x", ESP_PARTITION_TABLE_OFFSET, (intptr_t)partitions);
|
ESP_LOGD(TAG, "mapped partition table 0x%x at 0x%x", ESP_PARTITION_TABLE_OFFSET, (intptr_t)partitions);
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ bool bootloader_common_erase_part_type_data(const char *list_erase, bool ota_dat
|
||||||
// partition->label is not null-terminated string.
|
// partition->label is not null-terminated string.
|
||||||
strncpy(label, (char *)&partition->label, sizeof(partition->label));
|
strncpy(label, (char *)&partition->label, sizeof(partition->label));
|
||||||
if (fl_ota_data_erase == true || (bootloader_common_label_search(list_erase, label) == true)) {
|
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) {
|
if (err != ESP_OK) {
|
||||||
ret = false;
|
ret = false;
|
||||||
marker = "err";
|
marker = "err";
|
||||||
|
|
|
@ -73,6 +73,11 @@ esp_err_t bootloader_flash_erase_sector(size_t sector)
|
||||||
return spi_flash_erase_sector(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
|
#else
|
||||||
/* Bootloader version, uses ROM functions only */
|
/* Bootloader version, uses ROM functions only */
|
||||||
#include <soc/dport_reg.h>
|
#include <soc/dport_reg.h>
|
||||||
|
@ -246,4 +251,28 @@ esp_err_t bootloader_flash_erase_sector(size_t sector)
|
||||||
return spi_to_esp_err(esp_rom_spiflash_erase_sector(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
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue