diff --git a/components/esp32/Kconfig b/components/esp32/Kconfig index afa3e5618..4ac1685d0 100644 --- a/components/esp32/Kconfig +++ b/components/esp32/Kconfig @@ -45,6 +45,15 @@ config SPIRAM_BOOT_INIT have specific requirements, you'll want to leave this enabled so memory allocated during boot-up can also be placed in SPI RAM. +config SPIRAM_IGNORE_NOTFOUND + bool "Ignore PSRAM when not found" + default "n" + depends on SPIRAM_BOOT_INIT + help + Normally, if psram initialization is enabled during compile time but not found at runtime, it + is seen as an error making the ESP32 panic. If this is enabled, the ESP32 will keep on + running but will not add the (non-existing) RAM to any allocator. + choice SPIRAM_USE prompt "SPI RAM access method" default SPIRAM_USE_MALLOC diff --git a/components/esp32/cpu_start.c b/components/esp32/cpu_start.c index b66201c4f..7f0e1573d 100644 --- a/components/esp32/cpu_start.c +++ b/components/esp32/cpu_start.c @@ -102,6 +102,9 @@ struct object { long placeholder[ 10 ]; }; void __register_frame_info (const void *begin, struct object *ob); extern char __eh_frame[]; +//If CONFIG_SPIRAM_IGNORE_NOTFOUND is set and external RAM is not found or errors out on testing, this is set to false. +static bool s_spiram_okay=true; + /* * We arrive here after the bootloader finished loading the program from flash. The hardware is mostly uninitialized, * and the app CPU is in reset. We do have a stack, so we can do the initialization in C. @@ -147,8 +150,13 @@ void IRAM_ATTR call_start_cpu0() #if CONFIG_SPIRAM_BOOT_INIT esp_spiram_init_cache(); if (esp_spiram_init() != ESP_OK) { +#if CONFIG_SPIRAM_IGNORE_NOTFOUND + ESP_EARLY_LOGI(TAG, "Failed to init external RAM; continuing without it."); + s_spiram_okay = false; +#else ESP_EARLY_LOGE(TAG, "Failed to init external RAM!"); abort(); +#endif } #endif @@ -182,10 +190,12 @@ void IRAM_ATTR call_start_cpu0() #if CONFIG_SPIRAM_MEMTEST - bool ext_ram_ok=esp_spiram_test(); - if (!ext_ram_ok) { - ESP_EARLY_LOGE(TAG, "External RAM failed memory test!"); - abort(); + if (s_spiram_okay) { + bool ext_ram_ok=esp_spiram_test(); + if (!ext_ram_ok) { + ESP_EARLY_LOGE(TAG, "External RAM failed memory test!"); + abort(); + } } #endif @@ -252,23 +262,25 @@ void start_cpu0_default(void) esp_err_t err; esp_setup_syscall_table(); + if (s_spiram_okay) { #if CONFIG_SPIRAM_BOOT_INIT && (CONFIG_SPIRAM_USE_CAPS_ALLOC || CONFIG_SPIRAM_USE_MALLOC) - esp_err_t r=esp_spiram_add_to_heapalloc(); - if (r != ESP_OK) { - ESP_EARLY_LOGE(TAG, "External RAM could not be added to heap!"); - abort(); - } + esp_err_t r=esp_spiram_add_to_heapalloc(); + if (r != ESP_OK) { + ESP_EARLY_LOGE(TAG, "External RAM could not be added to heap!"); + abort(); + } #if CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL - r=esp_spiram_reserve_dma_pool(CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL); - if (r != ESP_OK) { - ESP_EARLY_LOGE(TAG, "Could not reserve internal/DMA pool!"); - abort(); - } + r=esp_spiram_reserve_dma_pool(CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL); + if (r != ESP_OK) { + ESP_EARLY_LOGE(TAG, "Could not reserve internal/DMA pool!"); + abort(); + } #endif #if CONFIG_SPIRAM_USE_MALLOC - heap_caps_malloc_extmem_enable(CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL); + heap_caps_malloc_extmem_enable(CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL); #endif #endif + } //Enable trace memory and immediately start trace. #if CONFIG_ESP32_TRAX diff --git a/components/esp32/spiram.c b/components/esp32/spiram.c index d07444a92..dccc3bc33 100644 --- a/components/esp32/spiram.c +++ b/components/esp32/spiram.c @@ -108,7 +108,9 @@ esp_err_t esp_spiram_init() esp_err_t r; r = psram_enable(PSRAM_SPEED, PSRAM_MODE); if (r != ESP_OK) { +#if CONFIG_SPIRAM_IGNORE_NOTFOUND ESP_EARLY_LOGE(TAG, "SPI RAM enabled but initialization failed. Bailing out."); +#endif return r; }