From 1da3204a7caff9e4e98d14c705dfe83c4696f44b Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 18 Sep 2017 23:02:33 +0800 Subject: [PATCH] spiram: expose function to initialize SPI RAM cache Some frameworks based on ESP-IDF need to be able to decide whether to initialize SPI RAM after the application has started. This change splits out part of esp_spiram_init which manipulate cache MMU into a separate function. Applications can disable cache, call esp_spiram_init_cache, re-enable cache, and then call esp_spiram_init. Disabling and re-enabling the cache can be achieved using functions provided in esp_spi_flash.h. --- components/esp32/cpu_start.c | 1 + components/esp32/include/esp_spiram.h | 13 ++++++++++++- components/esp32/spiram.c | 10 ++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/components/esp32/cpu_start.c b/components/esp32/cpu_start.c index f9c921b871..3aefdce0a4 100644 --- a/components/esp32/cpu_start.c +++ b/components/esp32/cpu_start.c @@ -150,6 +150,7 @@ void IRAM_ATTR call_start_cpu0() } #if CONFIG_SPIRAM_BOOT_INIT + esp_spiram_init_cache(); if (esp_spiram_init() != ESP_OK) { ESP_EARLY_LOGE(TAG, "Failed to init external RAM!"); abort(); diff --git a/components/esp32/include/esp_spiram.h b/components/esp32/include/esp_spiram.h index 2dbff1afc2..9663dcddcb 100644 --- a/components/esp32/include/esp_spiram.h +++ b/components/esp32/include/esp_spiram.h @@ -27,6 +27,17 @@ */ esp_err_t esp_spiram_init(); +/** + * @brief Configure Cache/MMU for access to external SPI RAM. + * + * Normally this function is called from cpu_start, if CONFIG_SPIRAM_BOOT_INIT + * option is enabled. Applications which need to enable SPI RAM at run time + * can disable CONFIG_SPIRAM_BOOT_INIT, and call this function later. + * + * @attention this function must be called with flash cache disabled. + */ +void esp_spiram_init_cache(); + /** * @brief Memory test for SPI RAM. Should be called after SPI RAM is initialized and @@ -76,4 +87,4 @@ void esp_spiram_writeback_cache(); esp_err_t esp_spiram_reserve_dma_pool(size_t size); -#endif \ No newline at end of file +#endif diff --git a/components/esp32/spiram.c b/components/esp32/spiram.c index 6eae6c98e7..55e97859fc 100644 --- a/components/esp32/spiram.c +++ b/components/esp32/spiram.c @@ -91,9 +91,7 @@ bool esp_spiram_test() } } - - -esp_err_t esp_spiram_init() +void IRAM_ATTR esp_spiram_init_cache() { //Enable external RAM in MMU cache_sram_mmu_set( 0, 0, SOC_EXTRAM_DATA_LOW, 0, 32, 128 ); @@ -102,7 +100,11 @@ esp_err_t esp_spiram_init() DPORT_CLEAR_PERI_REG_MASK(DPORT_APP_CACHE_CTRL1_REG, DPORT_APP_CACHE_MASK_DRAM1); cache_sram_mmu_set( 1, 0, SOC_EXTRAM_DATA_LOW, 0, 32, 128 ); #endif +} + +esp_err_t esp_spiram_init() +{ esp_err_t r; r = psram_enable(PSRAM_SPEED, PSRAM_MODE); if (r != ESP_OK) { @@ -202,4 +204,4 @@ void IRAM_ATTR esp_spiram_writeback_cache() -#endif \ No newline at end of file +#endif