From f6da7f3305df4a766c33c3341469346f76cdfb26 Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Mon, 24 Aug 2020 11:09:33 +0800 Subject: [PATCH] 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. --- .../include/bootloader_flash_config.h | 8 ++++++++ .../include/esp_image_format.h | 8 ++++++++ .../src/bootloader_flash_config_esp32.c | 5 +++++ .../bootloader_support/src/esp_image_format.c | 18 ++++++++++++++++++ components/esp32/cpu_start.c | 13 +++++++++++-- components/spi_flash/Kconfig | 8 ++++++++ 6 files changed, 58 insertions(+), 2 deletions(-) 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