2024-08-14 19:03:56 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd.
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include <zephyr/kernel.h>
|
|
|
|
#include <rom/ets_sys.h>
|
|
|
|
#include <esp_psram.h>
|
|
|
|
#include <esp_private/esp_psram_extram.h>
|
|
|
|
#include <zephyr/multi_heap/shared_multi_heap.h>
|
|
|
|
|
|
|
|
#define PSRAM_ADDR (DT_REG_ADDR(DT_NODELABEL(psram0)))
|
|
|
|
|
|
|
|
extern int _spiram_heap_start;
|
|
|
|
extern int _ext_ram_bss_start;
|
|
|
|
extern int _ext_ram_bss_end;
|
|
|
|
|
|
|
|
struct shared_multi_heap_region smh_psram = {
|
|
|
|
.addr = (uintptr_t)&_spiram_heap_start,
|
|
|
|
.size = CONFIG_ESP_SPIRAM_SIZE,
|
|
|
|
.attr = SMH_REG_ATTR_EXTERNAL,
|
|
|
|
};
|
|
|
|
|
|
|
|
int esp_psram_smh_init(void)
|
|
|
|
{
|
|
|
|
shared_multi_heap_pool_init();
|
|
|
|
smh_psram.size = CONFIG_ESP_SPIRAM_SIZE - ((int)&_spiram_heap_start - PSRAM_ADDR);
|
|
|
|
return shared_multi_heap_add(&smh_psram, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void esp_init_psram(void)
|
|
|
|
{
|
|
|
|
if (esp_psram_init()) {
|
|
|
|
ets_printf("Failed to Initialize external RAM, aborting.\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (esp_psram_get_size() < CONFIG_ESP_SPIRAM_SIZE) {
|
|
|
|
ets_printf("External RAM size is less than configured.\n");
|
|
|
|
}
|
|
|
|
|
2024-09-26 00:44:30 +08:00
|
|
|
if (IS_ENABLED(CONFIG_ESP_SPIRAM_MEMTEST)) {
|
|
|
|
if (esp_psram_is_initialized()) {
|
|
|
|
if (!esp_psram_extram_test()) {
|
|
|
|
ets_printf("External RAM failed memory test!");
|
|
|
|
return;
|
|
|
|
}
|
2024-08-14 19:03:56 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
memset(&_ext_ram_bss_start, 0,
|
|
|
|
(&_ext_ram_bss_end - &_ext_ram_bss_start) * sizeof(_ext_ram_bss_start));
|
|
|
|
}
|