This is an automated email from the ASF dual-hosted git repository.
GUIDINGLI pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new b54346fb920 espressif-risc-v: simplify code for simpleboot.
b54346fb920 is described below
commit b54346fb920f379fca374eb8a9c337d8072541b3
Author: Laczen JMS <[email protected]>
AuthorDate: Thu Aug 27 12:16:25 2026 +0200
espressif-risc-v: simplify code for simpleboot.
Simpleboot on espressif changes the location of irom and drom segments
in the image. Instead of correcting in `map_rom_segments` a routine
is introduced that corrects the load addresses before calling
`map_rom_segments`.
Signed-off-by: Laczen JMS <[email protected]>
---
arch/risc-v/src/common/espressif/esp_start.c | 80 ++++++++++++++++++----------
1 file changed, 52 insertions(+), 28 deletions(-)
diff --git a/arch/risc-v/src/common/espressif/esp_start.c
b/arch/risc-v/src/common/espressif/esp_start.c
index debc53e5eb2..f5bb149ca71 100644
--- a/arch/risc-v/src/common/espressif/esp_start.c
+++ b/arch/risc-v/src/common/espressif/esp_start.c
@@ -214,33 +214,23 @@ extern uint8_t _rodata_reserved_end[];
* Private Functions
****************************************************************************/
+#ifdef CONFIG_ESPRESSIF_SIMPLE_BOOT
/****************************************************************************
- * Name: map_rom_segments
+ * Name: modify_rom_segments_lma
*
* Description:
- * Configure the MMU and Cache peripherals for accessing ROM code and data.
+ * Retrieve the correct rom segment load address from image
*
* Input Parameters:
- * None.
+ * Pointer to irom and drom load addresses
*
* Returned Value:
- * None.
- *
+ * 0 if OK, -EIO on error
****************************************************************************/
-#if defined(CONFIG_ESPRESSIF_BOOTLOADER_MCUBOOT) || \
- defined(CONFIG_ESPRESSIF_SIMPLE_BOOT)
-static int map_rom_segments(uint32_t app_drom_start, uint32_t app_drom_vaddr,
- uint32_t app_drom_size, uint32_t app_irom_start,
- uint32_t app_irom_vaddr, uint32_t app_irom_size)
+int modify_rom_segments_lma(uint32_t *app_irom_start,
+ uint32_t *app_drom_start)
{
- uint32_t rc = 0;
- uint32_t actual_mapped_len = 0;
- uint32_t app_irom_start_aligned = app_irom_start & MMU_FLASH_MASK;
- uint32_t app_irom_vaddr_aligned = app_irom_vaddr & MMU_FLASH_MASK;
- uint32_t app_drom_start_aligned = app_drom_start & MMU_FLASH_MASK;
- uint32_t app_drom_vaddr_aligned = app_drom_vaddr & MMU_FLASH_MASK;
-#ifdef CONFIG_ESPRESSIF_SIMPLE_BOOT
esp_image_header_t image_header; /* Header for entire image */
esp_image_segment_header_t WORD_ALIGNED_ATTR segment_hdr;
bool padding_checksum = false;
@@ -248,9 +238,6 @@ static int map_rom_segments(uint32_t app_drom_start,
uint32_t app_drom_vaddr,
unsigned int ram_segments = 0;
unsigned int rom_segments = 0;
size_t offset = CONFIG_BOOTLOADER_OFFSET_IN_FLASH;
-#endif
-
-#ifdef CONFIG_ESPRESSIF_SIMPLE_BOOT
/* Read image header */
@@ -259,7 +246,7 @@ static int map_rom_segments(uint32_t app_drom_start,
uint32_t app_drom_vaddr,
true) != ESP_OK)
{
ets_printf("Failed to load image header!\n");
- abort();
+ return -EIO;
}
offset += sizeof(esp_image_header_t);
@@ -275,7 +262,7 @@ static int map_rom_segments(uint32_t app_drom_start,
uint32_t app_drom_vaddr,
true) != ESP_OK)
{
ets_printf("failed to read segment header at %x\n", offset);
- abort();
+ return -EIO;
}
if (IS_NONE(segment_hdr.load_addr))
@@ -315,16 +302,14 @@ static int map_rom_segments(uint32_t app_drom_start,
uint32_t app_drom_vaddr,
if (IS_DROM(segment_hdr.load_addr) &&
segment_hdr.load_addr == (uint32_t)_image_drom_vma)
{
- app_drom_start = offset + sizeof(esp_image_segment_header_t);
- app_drom_start_aligned = app_drom_start & MMU_FLASH_MASK;
+ *app_drom_start = offset + sizeof(esp_image_segment_header_t);
rom_segments++;
}
if (IS_IROM(segment_hdr.load_addr) &&
segment_hdr.load_addr == (uint32_t)_image_irom_vma)
{
- app_irom_start = offset + sizeof(esp_image_segment_header_t);
- app_irom_start_aligned = app_irom_start & MMU_FLASH_MASK;
+ *app_irom_start = offset + sizeof(esp_image_segment_header_t);
rom_segments++;
}
@@ -347,8 +332,37 @@ static int map_rom_segments(uint32_t app_drom_start,
uint32_t app_drom_vaddr,
}
ets_printf("total segments stored %d\n", segments - 1);
+ return 0;
+}
#endif
+/****************************************************************************
+ * Name: map_rom_segments
+ *
+ * Description:
+ * Configure the MMU and Cache peripherals for accessing ROM code and data.
+ *
+ * Input Parameters:
+ * None.
+ *
+ * Returned Value:
+ * None.
+ *
+ ****************************************************************************/
+
+#if defined(CONFIG_ESPRESSIF_BOOTLOADER_MCUBOOT) || \
+ defined(CONFIG_ESPRESSIF_SIMPLE_BOOT)
+static int map_rom_segments(uint32_t app_drom_start, uint32_t app_drom_vaddr,
+ uint32_t app_drom_size, uint32_t app_irom_start,
+ uint32_t app_irom_vaddr, uint32_t app_irom_size)
+{
+ uint32_t rc = 0;
+ uint32_t actual_mapped_len = 0;
+ uint32_t app_irom_start_aligned = app_irom_start & MMU_FLASH_MASK;
+ uint32_t app_irom_vaddr_aligned = app_irom_vaddr & MMU_FLASH_MASK;
+ uint32_t app_drom_start_aligned = app_drom_start & MMU_FLASH_MASK;
+ uint32_t app_drom_vaddr_aligned = app_drom_vaddr & MMU_FLASH_MASK;
+
cache_hal_disable(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL);
/* Clear the MMU entries that are already set up,
@@ -369,6 +383,7 @@ static int map_rom_segments(uint32_t app_drom_start,
uint32_t app_drom_vaddr,
cache_bus_mask_t bus_mask = cache_ll_l1_get_bus(0, app_drom_vaddr_aligned,
app_drom_size);
+
cache_ll_l1_enable_bus(0, bus_mask);
bus_mask = cache_ll_l1_get_bus(0, app_irom_vaddr_aligned, app_irom_size);
cache_ll_l1_enable_bus(0, bus_mask);
@@ -411,8 +426,9 @@ static int map_rom_segments(uint32_t app_drom_start,
uint32_t app_drom_vaddr,
#if defined(CONFIG_ARCH_CHIP_ESP32C6) || defined(CONFIG_ARCH_CHIP_ESP32H2)
static void IRAM_ATTR NOINLINE_ATTR recalib_bbpll(void)
{
- rtc_cpu_freq_config_t old_config;
- rtc_clk_cpu_freq_get_config(&old_config);
+ rtc_cpu_freq_config_t old_config;
+
+ rtc_clk_cpu_freq_get_config(&old_config);
if (old_config.source == SOC_CPU_CLK_SRC_PLL
#ifdef CONFIG_ARCH_CHIP_ESP32H2
@@ -523,6 +539,13 @@ void __esp_start(void)
uint32_t app_drom_size = (uint32_t)_image_drom_size;
uint32_t app_drom_vaddr = (uint32_t)_image_drom_vma;
+#ifdef CONFIG_ESPRESSIF_SIMPLE_BOOT
+ if (modify_rom_segments_lma(&app_irom_start, &app_drom_start) != 0)
+ {
+ while (true);
+ }
+#endif
+
if (map_rom_segments(app_drom_start, app_drom_vaddr, app_drom_size,
app_irom_start, app_irom_vaddr, app_irom_size) != 0)
{
@@ -646,6 +669,7 @@ void __esp_start(void)
*/
wdt_hal_context_t rwdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
+
wdt_hal_write_protect_disable(&rwdt_ctx);
wdt_hal_set_flashboot_en(&rwdt_ctx, false);
wdt_hal_disable(&rwdt_ctx);