diff --git a/components/bootloader_support/include/bootloader_flash_config.h b/components/bootloader_support/include/bootloader_flash_config.h index 98c169f48a..8680cd3590 100644 --- a/components/bootloader_support/include/bootloader_flash_config.h +++ b/components/bootloader_support/include/bootloader_flash_config.h @@ -27,6 +27,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. * diff --git a/components/bootloader_support/include/esp_image_format.h b/components/bootloader_support/include/esp_image_format.h index 928a29adf6..f495933a16 100644 --- a/components/bootloader_support/include/esp_image_format.h +++ b/components/bootloader_support/include/esp_image_format.h @@ -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; diff --git a/components/bootloader_support/src/bootloader_flash_config_esp32.c b/components/bootloader_support/src/bootloader_flash_config_esp32.c index 5d2c8ecc22..e5028b25c6 100644 --- a/components/bootloader_support/src/bootloader_flash_config_esp32.c +++ b/components/bootloader_support/src/bootloader_flash_config_esp32.c @@ -32,6 +32,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); diff --git a/components/bootloader_support/src/esp_image_format.c b/components/bootloader_support/src/esp_image_format.c index e8d705cf80..1b753fbd17 100644 --- a/components/bootloader_support/src/esp_image_format.c +++ b/components/bootloader_support/src/esp_image_format.c @@ -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; + } +} \ No newline at end of file diff --git a/components/esp32/cpu_start.c b/components/esp32/cpu_start.c index f842ee437f..db730be465 100644 --- a/components/esp32/cpu_start.c +++ b/components/esp32/cpu_start.c @@ -421,9 +421,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; @@ -438,6 +437,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); @@ -445,6 +445,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); diff --git a/components/spi_flash/Kconfig b/components/spi_flash/Kconfig index d69ce3e990..f40b0b8340 100644 --- a/components/spi_flash/Kconfig +++ b/components/spi_flash/Kconfig @@ -114,6 +114,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