kopia lustrzana https://github.com/espressif/esp-idf
spi_flash: add config option to override flash size in bootloader header
Sometimes the flash size read from bootloader is not correct. This may forbid SPI Flash driver from reading the the area larger than the size in bootloader header. When the new config option is enabled, the latest configured ESPTOOLPY_FLAHSIZE in the app header will be used to override the value read from bootloader header.pull/6847/head
rodzic
e511dd58b3
commit
15f406ddb7
|
@ -28,6 +28,14 @@ extern "C" {
|
|||
*/
|
||||
void bootloader_flash_update_id(void);
|
||||
|
||||
/**
|
||||
* @brief Update the flash size in g_rom_flashchip (global esp_rom_spiflash_chip_t structure).
|
||||
*
|
||||
* @param size The size to store, in bytes.
|
||||
* @return None
|
||||
*/
|
||||
void bootloader_flash_update_size(uint32_t size);
|
||||
|
||||
/**
|
||||
* @brief Set the flash CS setup and hold time.
|
||||
*
|
||||
|
|
|
@ -169,6 +169,14 @@ esp_err_t esp_image_verify_bootloader(uint32_t *length);
|
|||
*/
|
||||
esp_err_t esp_image_verify_bootloader_data(esp_image_metadata_t *data);
|
||||
|
||||
/**
|
||||
* @brief Get the flash size of the image
|
||||
*
|
||||
* @param app_flash_size The value configured in the image header
|
||||
* @return Actual size, in bytes.
|
||||
*/
|
||||
int esp_image_get_flash_size(esp_image_flash_size_t app_flash_size);
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint32_t drom_addr;
|
||||
|
|
|
@ -33,6 +33,11 @@ void bootloader_flash_update_id(void)
|
|||
g_rom_flashchip.device_id = bootloader_read_flash_id();
|
||||
}
|
||||
|
||||
void bootloader_flash_update_size(uint32_t size)
|
||||
{
|
||||
g_rom_flashchip.chip_size = size;
|
||||
}
|
||||
|
||||
void IRAM_ATTR bootloader_flash_cs_timing_config(void)
|
||||
{
|
||||
SET_PERI_REG_MASK(SPI_USER_REG(0), SPI_CS_HOLD_M | SPI_CS_SETUP_M);
|
||||
|
|
|
@ -39,6 +39,11 @@ void bootloader_flash_update_id()
|
|||
g_rom_flashchip.device_id = bootloader_read_flash_id();
|
||||
}
|
||||
|
||||
void bootloader_flash_update_size(uint32_t size)
|
||||
{
|
||||
g_rom_flashchip.chip_size = size;
|
||||
}
|
||||
|
||||
void IRAM_ATTR bootloader_flash_cs_timing_config()
|
||||
{
|
||||
SET_PERI_REG_MASK(SPI_MEM_USER_REG(0), SPI_MEM_CS_HOLD_M | SPI_MEM_CS_SETUP_M);
|
||||
|
|
|
@ -851,3 +851,21 @@ static esp_err_t verify_simple_hash(bootloader_sha256_handle_t sha_handle, esp_i
|
|||
bootloader_munmap(hash);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
int esp_image_get_flash_size(esp_image_flash_size_t app_flash_size)
|
||||
{
|
||||
switch (app_flash_size) {
|
||||
case ESP_IMAGE_FLASH_SIZE_1MB:
|
||||
return 1 * 1024 * 1024;
|
||||
case ESP_IMAGE_FLASH_SIZE_2MB:
|
||||
return 2 * 1024 * 1024;
|
||||
case ESP_IMAGE_FLASH_SIZE_4MB:
|
||||
return 4 * 1024 * 1024;
|
||||
case ESP_IMAGE_FLASH_SIZE_8MB:
|
||||
return 8 * 1024 * 1024;
|
||||
case ESP_IMAGE_FLASH_SIZE_16MB:
|
||||
return 16 * 1024 * 1024;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -430,9 +430,8 @@ void start_cpu0_default(void)
|
|||
#endif
|
||||
|
||||
bootloader_flash_update_id();
|
||||
#if !CONFIG_SPIRAM_BOOT_INIT
|
||||
// Read the application binary image header. This will also decrypt the header if the image is encrypted.
|
||||
esp_image_header_t fhdr = {0};
|
||||
__attribute__((unused)) esp_image_header_t fhdr = {0};
|
||||
#ifdef CONFIG_APP_BUILD_TYPE_ELF_RAM
|
||||
fhdr.spi_mode = ESP_IMAGE_SPI_MODE_DIO;
|
||||
fhdr.spi_speed = ESP_IMAGE_SPI_SPEED_40M;
|
||||
|
@ -447,6 +446,7 @@ void start_cpu0_default(void)
|
|||
memcpy(&fhdr, (void*) SOC_DROM_LOW, sizeof(fhdr));
|
||||
#endif // CONFIG_APP_BUILD_TYPE_ELF_RAM
|
||||
|
||||
#if !CONFIG_SPIRAM_BOOT_INIT
|
||||
// If psram is uninitialized, we need to improve some flash configuration.
|
||||
bootloader_flash_clock_config(&fhdr);
|
||||
bootloader_flash_gpio_config(&fhdr);
|
||||
|
@ -454,6 +454,15 @@ void start_cpu0_default(void)
|
|||
bootloader_flash_cs_timing_config();
|
||||
#endif //!CONFIG_SPIRAM_BOOT_INIT
|
||||
|
||||
#if CONFIG_SPI_FLASH_SIZE_OVERRIDE
|
||||
int app_flash_size = esp_image_get_flash_size(fhdr.spi_size);
|
||||
if (app_flash_size < 1 * 1024 * 1024) {
|
||||
ESP_LOGE(TAG, "Invalid flash size in app image header.");
|
||||
abort();
|
||||
}
|
||||
bootloader_flash_update_size(app_flash_size);
|
||||
#endif //CONFIG_SPI_FLASH_SIZE_OVERRIDE
|
||||
|
||||
spi_flash_init();
|
||||
/* init default OS-aware flash access critical section */
|
||||
spi_flash_guard_set(&g_flash_guard_default_ops);
|
||||
|
|
|
@ -130,6 +130,14 @@ menu "SPI Flash driver"
|
|||
help
|
||||
Defines how many ticks will be before returning to continue a erasing.
|
||||
|
||||
config SPI_FLASH_SIZE_OVERRIDE
|
||||
bool "Override flash size in bootloader header by ESPTOOLPY_FLASHSIZE"
|
||||
default n
|
||||
help
|
||||
SPI Flash driver uses the flash size configured in bootloader header by default.
|
||||
Enable this option to override flash size with latest ESPTOOLPY_FLASHSIZE value from
|
||||
the app header if the size in the bootloader header is incorrect.
|
||||
|
||||
menu "Auto-detect flash chips"
|
||||
|
||||
config SPI_FLASH_SUPPORT_ISSI_CHIP
|
||||
|
|
Ładowanie…
Reference in New Issue