|
|
@@ -19,56 +19,46 @@
|
|
|
#include "esp32/rom/cache.h"
|
|
|
#include "esp32/rom/secure_boot.h"
|
|
|
#elif CONFIG_IDF_TARGET_ESP32S2
|
|
|
-#include "esp32s2/rom/cache.h"
|
|
|
#include "esp32s2/rom/secure_boot.h"
|
|
|
-#include "soc/extmem_reg.h"
|
|
|
-#include "soc/cache_memory.h"
|
|
|
#elif CONFIG_IDF_TARGET_ESP32S3
|
|
|
-#include "esp32s3/rom/cache.h"
|
|
|
#include "esp32s3/rom/secure_boot.h"
|
|
|
-#include "soc/extmem_reg.h"
|
|
|
-#include "soc/cache_memory.h"
|
|
|
#elif CONFIG_IDF_TARGET_ESP32C3
|
|
|
-#include "esp32c3/rom/cache.h"
|
|
|
#include "esp32c3/rom/efuse.h"
|
|
|
#include "esp32c3/rom/crc.h"
|
|
|
#include "esp32c3/rom/uart.h"
|
|
|
#include "esp32c3/rom/gpio.h"
|
|
|
#include "esp32c3/rom/secure_boot.h"
|
|
|
-#include "soc/extmem_reg.h"
|
|
|
-#include "soc/cache_memory.h"
|
|
|
#elif CONFIG_IDF_TARGET_ESP32H2
|
|
|
-#include "esp32h2/rom/cache.h"
|
|
|
#include "esp32h2/rom/efuse.h"
|
|
|
#include "esp32h2/rom/crc.h"
|
|
|
#include "esp32h2/rom/uart.h"
|
|
|
#include "esp32h2/rom/gpio.h"
|
|
|
#include "esp32h2/rom/secure_boot.h"
|
|
|
-#include "soc/extmem_reg.h"
|
|
|
-#include "soc/cache_memory.h"
|
|
|
#elif CONFIG_IDF_TARGET_ESP32C2
|
|
|
-#include "esp32c2/rom/cache.h"
|
|
|
#include "esp32c2/rom/efuse.h"
|
|
|
#include "esp32c2/rom/crc.h"
|
|
|
#include "esp32c2/rom/rtc.h"
|
|
|
#include "esp32c2/rom/uart.h"
|
|
|
#include "esp32c2/rom/gpio.h"
|
|
|
#include "esp32c2/rom/secure_boot.h"
|
|
|
-#include "soc/extmem_reg.h"
|
|
|
-#include "soc/cache_memory.h"
|
|
|
+
|
|
|
#else // CONFIG_IDF_TARGET_*
|
|
|
#error "Unsupported IDF_TARGET"
|
|
|
#endif
|
|
|
#include "esp_rom_spiflash.h"
|
|
|
|
|
|
#include "soc/soc.h"
|
|
|
-#include "esp_cpu.h"
|
|
|
#include "soc/rtc.h"
|
|
|
#include "soc/gpio_periph.h"
|
|
|
#include "soc/efuse_periph.h"
|
|
|
#include "soc/rtc_periph.h"
|
|
|
#include "soc/timer_periph.h"
|
|
|
+#include "hal/mmu_hal.h"
|
|
|
+#include "hal/cache_types.h"
|
|
|
+#include "hal/cache_ll.h"
|
|
|
+#include "hal/cache_hal.h"
|
|
|
|
|
|
+#include "esp_cpu.h"
|
|
|
#include "esp_image_format.h"
|
|
|
#include "esp_secure_boot.h"
|
|
|
#include "esp_flash_encrypt.h"
|
|
|
@@ -716,99 +706,74 @@ static void set_cache_and_start_app(
|
|
|
{
|
|
|
int rc __attribute__((unused));
|
|
|
|
|
|
- ESP_LOGD(TAG, "configure drom and irom and start");
|
|
|
+ ESP_EARLY_LOGD(TAG, "configure drom and irom and start");
|
|
|
+ //-----------------------Disable Cache to do the mapping---------
|
|
|
#if CONFIG_IDF_TARGET_ESP32
|
|
|
Cache_Read_Disable(0);
|
|
|
Cache_Flush(0);
|
|
|
-#elif SOC_ICACHE_ACCESS_RODATA_SUPPORTED
|
|
|
- uint32_t autoload = Cache_Suspend_ICache();
|
|
|
- Cache_Invalidate_ICache_All();
|
|
|
-#else // access rodata with DCache
|
|
|
- uint32_t autoload = Cache_Suspend_DCache();
|
|
|
- Cache_Invalidate_DCache_All();
|
|
|
-#endif
|
|
|
-
|
|
|
- /* Clear the MMU entries that are already set up,
|
|
|
- * so the new app only has the mappings it creates.
|
|
|
- */
|
|
|
-#if CONFIG_IDF_TARGET_ESP32
|
|
|
- for (int i = 0; i < DPORT_FLASH_MMU_TABLE_SIZE; i++) {
|
|
|
- DPORT_PRO_FLASH_MMU_TABLE[i] = DPORT_FLASH_MMU_TABLE_INVALID_VAL;
|
|
|
- }
|
|
|
#else
|
|
|
- for (size_t i = 0; i < FLASH_MMU_TABLE_SIZE; i++) {
|
|
|
- FLASH_MMU_TABLE[i] = MMU_TABLE_INVALID_VAL;
|
|
|
- }
|
|
|
+ cache_hal_disable(CACHE_TYPE_ALL);
|
|
|
#endif
|
|
|
+
|
|
|
+ mmu_hal_init();
|
|
|
+
|
|
|
+ //-----------------------MAP DROM--------------------------
|
|
|
uint32_t drom_load_addr_aligned = drom_load_addr & MMU_FLASH_MASK;
|
|
|
uint32_t drom_addr_aligned = drom_addr & MMU_FLASH_MASK;
|
|
|
- uint32_t drom_page_count = bootloader_cache_pages_to_map(drom_size, drom_load_addr);
|
|
|
- ESP_LOGV(TAG, "d mmu set paddr=%08x vaddr=%08x size=%d n=%d",
|
|
|
- drom_addr_aligned, drom_load_addr_aligned, drom_size, drom_page_count);
|
|
|
+ ESP_EARLY_LOGV(TAG, "rodata starts from paddr=0x%08x, vaddr=0x%08x, size=0x%x", drom_addr, drom_load_addr, drom_size);
|
|
|
+ //The addr is aligned, so we add the mask off length to the size, to make sure the corresponding buses are enabled.
|
|
|
+ drom_size = (drom_load_addr - drom_load_addr_aligned) + drom_size;
|
|
|
#if CONFIG_IDF_TARGET_ESP32
|
|
|
+ uint32_t drom_page_count = (drom_size + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE;
|
|
|
rc = cache_flash_mmu_set(0, 0, drom_load_addr_aligned, drom_addr_aligned, 64, drom_page_count);
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S2
|
|
|
- rc = Cache_Ibus_MMU_Set(MMU_ACCESS_FLASH, drom_load_addr_aligned, drom_addr_aligned, 64, drom_page_count, 0);
|
|
|
-#else // map rodata with DBUS
|
|
|
- rc = Cache_Dbus_MMU_Set(MMU_ACCESS_FLASH, drom_load_addr_aligned, drom_addr_aligned, 64, drom_page_count, 0);
|
|
|
-#endif
|
|
|
- ESP_LOGV(TAG, "rc=%d", rc);
|
|
|
-#if CONFIG_IDF_TARGET_ESP32
|
|
|
+ ESP_EARLY_LOGV(TAG, "rc=%d", rc);
|
|
|
rc = cache_flash_mmu_set(1, 0, drom_load_addr_aligned, drom_addr_aligned, 64, drom_page_count);
|
|
|
- ESP_LOGV(TAG, "rc=%d", rc);
|
|
|
+ ESP_EARLY_LOGV(TAG, "rc=%d", rc);
|
|
|
+ ESP_EARLY_LOGV(TAG, "after mapping rodata, starting from paddr=0x%08x and vaddr=0x%08x, 0x%x bytes are mapped", drom_addr_aligned, drom_load_addr_aligned, drom_page_count * MMU_PAGE_SIZE);
|
|
|
+#else
|
|
|
+ uint32_t actual_mapped_len = 0;
|
|
|
+ mmu_hal_map_region(0, MMU_TARGET_FLASH0, drom_load_addr_aligned, drom_addr_aligned, drom_size, &actual_mapped_len);
|
|
|
+ ESP_EARLY_LOGV(TAG, "after mapping rodata, starting from paddr=0x%08x and vaddr=0x%08x, 0x%x bytes are mapped", drom_addr_aligned, drom_load_addr_aligned, actual_mapped_len);
|
|
|
#endif
|
|
|
+
|
|
|
+ //-----------------------MAP IROM--------------------------
|
|
|
uint32_t irom_load_addr_aligned = irom_load_addr & MMU_FLASH_MASK;
|
|
|
uint32_t irom_addr_aligned = irom_addr & MMU_FLASH_MASK;
|
|
|
- uint32_t irom_page_count = bootloader_cache_pages_to_map(irom_size, irom_load_addr);
|
|
|
- ESP_LOGV(TAG, "i mmu set paddr=%08x vaddr=%08x size=%d n=%d",
|
|
|
- irom_addr_aligned, irom_load_addr_aligned, irom_size, irom_page_count);
|
|
|
+ ESP_EARLY_LOGV(TAG, "text starts from paddr=0x%08x, vaddr=0x%08x, size=0x%x", irom_addr, irom_load_addr, irom_size);
|
|
|
+ //The addr is aligned, so we add the mask off length to the size, to make sure the corresponding buses are enabled.
|
|
|
+ irom_size = (irom_load_addr - irom_load_addr_aligned) + irom_size;
|
|
|
#if CONFIG_IDF_TARGET_ESP32
|
|
|
+ uint32_t irom_page_count = (irom_size + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE;
|
|
|
rc = cache_flash_mmu_set(0, 0, irom_load_addr_aligned, irom_addr_aligned, 64, irom_page_count);
|
|
|
-#else // access text with IBUS
|
|
|
-#if CONFIG_IDF_TARGET_ESP32S2
|
|
|
- uint32_t iram1_used = 0;
|
|
|
- if (irom_load_addr + irom_size > IRAM1_ADDRESS_LOW) {
|
|
|
- iram1_used = 1;
|
|
|
- }
|
|
|
- if (iram1_used) {
|
|
|
- rc = Cache_Ibus_MMU_Set(MMU_ACCESS_FLASH, IRAM0_ADDRESS_LOW, 0, 64, 64, 1);
|
|
|
- rc = Cache_Ibus_MMU_Set(MMU_ACCESS_FLASH, IRAM1_ADDRESS_LOW, 0, 64, 64, 1);
|
|
|
- REG_CLR_BIT(EXTMEM_PRO_ICACHE_CTRL1_REG, EXTMEM_PRO_ICACHE_MASK_IRAM1);
|
|
|
- }
|
|
|
-#endif
|
|
|
- rc = Cache_Ibus_MMU_Set(MMU_ACCESS_FLASH, irom_load_addr_aligned, irom_addr_aligned, 64, irom_page_count, 0);
|
|
|
-#endif
|
|
|
- ESP_LOGV(TAG, "rc=%d", rc);
|
|
|
-#if CONFIG_IDF_TARGET_ESP32
|
|
|
+ ESP_EARLY_LOGV(TAG, "rc=%d", rc);
|
|
|
rc = cache_flash_mmu_set(1, 0, irom_load_addr_aligned, irom_addr_aligned, 64, irom_page_count);
|
|
|
ESP_LOGV(TAG, "rc=%d", rc);
|
|
|
- DPORT_REG_CLR_BIT( DPORT_PRO_CACHE_CTRL1_REG,
|
|
|
- (DPORT_PRO_CACHE_MASK_IRAM0) | (DPORT_PRO_CACHE_MASK_IRAM1 & 0) |
|
|
|
- (DPORT_PRO_CACHE_MASK_IROM0 & 0) | DPORT_PRO_CACHE_MASK_DROM0 |
|
|
|
- DPORT_PRO_CACHE_MASK_DRAM1 );
|
|
|
- DPORT_REG_CLR_BIT( DPORT_APP_CACHE_CTRL1_REG,
|
|
|
- (DPORT_APP_CACHE_MASK_IRAM0) | (DPORT_APP_CACHE_MASK_IRAM1 & 0) |
|
|
|
- (DPORT_APP_CACHE_MASK_IROM0 & 0) | DPORT_APP_CACHE_MASK_DROM0 |
|
|
|
- DPORT_APP_CACHE_MASK_DRAM1 );
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S2
|
|
|
- REG_CLR_BIT( EXTMEM_PRO_ICACHE_CTRL1_REG, (EXTMEM_PRO_ICACHE_MASK_IRAM0) | (EXTMEM_PRO_ICACHE_MASK_IRAM1 & 0) | EXTMEM_PRO_ICACHE_MASK_DROM0 );
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S3
|
|
|
- REG_CLR_BIT(EXTMEM_DCACHE_CTRL1_REG, EXTMEM_DCACHE_SHUT_CORE0_BUS);
|
|
|
-#if !CONFIG_FREERTOS_UNICORE
|
|
|
- REG_CLR_BIT(EXTMEM_DCACHE_CTRL1_REG, EXTMEM_DCACHE_SHUT_CORE1_BUS);
|
|
|
+ ESP_EARLY_LOGV(TAG, "after mapping text, starting from paddr=0x%08x and vaddr=0x%08x, 0x%x bytes are mapped", irom_addr_aligned, irom_load_addr_aligned, irom_page_count * MMU_PAGE_SIZE);
|
|
|
+#else
|
|
|
+ mmu_hal_map_region(0, MMU_TARGET_FLASH0, irom_load_addr_aligned, irom_addr_aligned, irom_size, &actual_mapped_len);
|
|
|
+ ESP_EARLY_LOGV(TAG, "after mapping text, starting from paddr=0x%08x and vaddr=0x%08x, 0x%x bytes are mapped", irom_addr_aligned, irom_load_addr_aligned, actual_mapped_len);
|
|
|
#endif
|
|
|
-#else // ESP32C3, ESP32H2
|
|
|
- REG_CLR_BIT(EXTMEM_ICACHE_CTRL1_REG, EXTMEM_ICACHE_SHUT_IBUS);
|
|
|
- REG_CLR_BIT(EXTMEM_ICACHE_CTRL1_REG, EXTMEM_ICACHE_SHUT_DBUS);
|
|
|
+
|
|
|
+ //----------------------Enable corresponding buses----------------
|
|
|
+ cache_bus_mask_t bus_mask = cache_ll_l1_get_bus(0, drom_load_addr_aligned, drom_size);
|
|
|
+ cache_ll_l1_enable_bus(0, bus_mask);
|
|
|
+ bus_mask = cache_ll_l1_get_bus(0, irom_load_addr_aligned, irom_size);
|
|
|
+ cache_ll_l1_enable_bus(0, bus_mask);
|
|
|
+
|
|
|
+#if !CONFIG_FREERTOS_UNICORE
|
|
|
+ bus_mask = cache_ll_l1_get_bus(1, drom_load_addr_aligned, drom_size);
|
|
|
+ cache_ll_l1_enable_bus(1, bus_mask);
|
|
|
+ bus_mask = cache_ll_l1_get_bus(1, irom_load_addr_aligned, irom_size);
|
|
|
+ cache_ll_l1_enable_bus(1, bus_mask);
|
|
|
#endif
|
|
|
+
|
|
|
+ //----------------------Enable Cache----------------
|
|
|
#if CONFIG_IDF_TARGET_ESP32
|
|
|
+ // Application will need to do Cache_Flush(1) and Cache_Read_Enable(1)
|
|
|
Cache_Read_Enable(0);
|
|
|
-#elif SOC_ICACHE_ACCESS_RODATA_SUPPORTED
|
|
|
- Cache_Resume_ICache(autoload);
|
|
|
-#else // access rodata with DCache
|
|
|
- Cache_Resume_DCache(autoload);
|
|
|
+#else
|
|
|
+ cache_hal_enable(CACHE_TYPE_ALL);
|
|
|
#endif
|
|
|
- // Application will need to do Cache_Flush(1) and Cache_Read_Enable(1)
|
|
|
|
|
|
ESP_LOGD(TAG, "start: 0x%08x", entry_addr);
|
|
|
bootloader_atexit();
|