mirror of
https://github.com/espressif/esp-idf.git
synced 2026-05-19 23:45:28 +02:00
esp_psram: new psram component
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "esp_err.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Get the psram mapped vaddr range
|
||||
*
|
||||
* @param[out] out_vstart PSRAM virtual address start
|
||||
* @param[out] out_vend PSRAM virtual address end
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - ESP_ERR_INVALID_STATE PSRAM is not initialized successfully
|
||||
*/
|
||||
esp_err_t esp_psram_extram_get_mapped_range(intptr_t *out_vstart, intptr_t *out_vend);
|
||||
|
||||
/**
|
||||
* @brief Get the psram alloced vaddr range
|
||||
*
|
||||
* @param[out] out_vstart PSRAM virtual address start
|
||||
* @param[out] out_vend PSRAM virtual address end
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - ESP_ERR_INVALID_STATE PSRAM is not initialized successfully
|
||||
*/
|
||||
esp_err_t esp_psram_extram_get_alloced_range(intptr_t *out_vstart, intptr_t *out_vend);
|
||||
|
||||
/**
|
||||
* @brief Add the initialized PSRAM to the heap allocator.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: On success
|
||||
* Other error type, see `heap_caps_add_region`.
|
||||
*/
|
||||
esp_err_t esp_psram_extram_add_to_heap_allocator(void);
|
||||
|
||||
/**
|
||||
* @brief Reserve a pool of internal memory for specific DMA/internal allocations
|
||||
*
|
||||
* @param size Size of reserved pool in bytes
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: On success
|
||||
* - ESP_ERR_NO_MEM: When no memory available for pool
|
||||
*/
|
||||
esp_err_t esp_psram_extram_reserve_dma_pool(size_t size);
|
||||
|
||||
/**
|
||||
* @brief Memory test for PSRAM. Should be called after PSRAM is initialized and
|
||||
* (in case of a dual-core system) the app CPU is online. This test overwrites the
|
||||
* memory with crap, so do not call after e.g. the heap allocator has stored important
|
||||
* stuff in PSRAM.
|
||||
*
|
||||
* @return true on success, false on failed memory test
|
||||
*/
|
||||
bool esp_psram_extram_test(void);
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
/**
|
||||
* @brief Force a writeback of the data in the PSRAM cache. This is to be called whenever
|
||||
* cache is disabled, because disabling cache on the ESP32 discards the data in the PSRAM
|
||||
* cache.
|
||||
*
|
||||
* This is meant for use from within the SPI flash code.
|
||||
*/
|
||||
void esp_psram_extram_writeback_cache(void);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "esp_err.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @brief get psram CS IO
|
||||
*
|
||||
* This interface should be called after PSRAM is enabled, otherwise it will
|
||||
* return an invalid value -1/0xff.
|
||||
*
|
||||
* @return psram CS IO or -1/0xff if psram not enabled
|
||||
*/
|
||||
uint8_t esp_psram_io_get_cs_io(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file will be redesigned into MMU driver, to maintain all the external
|
||||
* memory contexts including:
|
||||
* - Flash
|
||||
* - PSRAM
|
||||
* - DDR
|
||||
*
|
||||
* Now only MMU-PSRAM related private APIs
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <sys/param.h>
|
||||
#include "esp_err.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
#define MMU_PAGE_SIZE 0x8000
|
||||
#else
|
||||
#define MMU_PAGE_SIZE 0x10000
|
||||
#define MMU_PAGE_TO_BYTES(page_id) ((page_id) * MMU_PAGE_SIZE)
|
||||
#define BYTES_TO_MMU_PAGE(bytes) ((bytes) / MMU_PAGE_SIZE)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Get the vaddr start for PSRAM
|
||||
*
|
||||
* @return PSRAM vaddr start address
|
||||
*/
|
||||
intptr_t mmu_get_psram_vaddr_start(void);
|
||||
|
||||
/**
|
||||
* @brief Get the vaddr end for PSRAM
|
||||
*
|
||||
* @return PSRAM vaddr end address
|
||||
*/
|
||||
intptr_t mmu_get_psram_vaddr_end(void);
|
||||
|
||||
|
||||
#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS
|
||||
/**
|
||||
* @brief Copy Flash texts to PSRAM
|
||||
*
|
||||
* @param[in] start_page PSRAM physical start page
|
||||
* @param[in] psram_size PSRAM available size
|
||||
* @param[out] out_page Used pages
|
||||
*/
|
||||
esp_err_t mmu_config_psram_text_segment(uint32_t start_page, uint32_t psram_size, uint32_t *out_page);
|
||||
|
||||
/**
|
||||
* @brief Init other file requested MMU variables
|
||||
*
|
||||
* - These logics are abstracted from the PSRAM driver
|
||||
* - These functions are only required by `flash_mmap.c` for converting paddr to vaddr, and vice versa
|
||||
* - The `flash_mmpa.c` will be rewritten into MMU driver
|
||||
*
|
||||
* Therefore, keep the APIs here for now
|
||||
*/
|
||||
void instruction_flash_page_info_init(uint32_t psram_start_physical_page);
|
||||
|
||||
/**
|
||||
* @brief Get the start page number of the instruction in SPI flash
|
||||
*
|
||||
* @return start page number
|
||||
*/
|
||||
uint32_t instruction_flash_start_page_get(void);
|
||||
|
||||
/**
|
||||
* @brief Get the end page number of the instruction in SPI flash
|
||||
*
|
||||
* @return end page number
|
||||
*/
|
||||
uint32_t instruction_flash_end_page_get(void);
|
||||
|
||||
/**
|
||||
* @brief Get the offset of instruction from SPI flash to SPI RAM
|
||||
*
|
||||
* @return instruction offset
|
||||
*/
|
||||
int instruction_flash2spiram_offset(void);
|
||||
#endif // #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS
|
||||
|
||||
|
||||
#if CONFIG_SPIRAM_RODATA
|
||||
/**
|
||||
* @brief Copy Flash rodata to PSRAM
|
||||
*
|
||||
* @param[in] start_page PSRAM physical start page
|
||||
* @param[in] psram_size PSRAM available size
|
||||
* @param[out] out_page Used pages
|
||||
*/
|
||||
esp_err_t mmu_config_psram_rodata_segment(uint32_t start_page, uint32_t psram_size, uint32_t *out_page);
|
||||
|
||||
/**
|
||||
* @brief Init other file requested MMU variables
|
||||
*
|
||||
* - These logics are abstracted from the PSRAM driver
|
||||
* - These functions are only required by `flash_mmap.c` for converting paddr to vaddr, and vice versa
|
||||
* - The `flash_mmpa.c` will be rewritten into MMU driver
|
||||
*
|
||||
* Therefore, keep the APIs here for now
|
||||
*/
|
||||
void rodata_flash_page_info_init(uint32_t psram_start_physical_page);
|
||||
|
||||
/**
|
||||
* @brief Get the start page number of the rodata in SPI flash
|
||||
*
|
||||
* @return start page number
|
||||
*/
|
||||
uint32_t rodata_flash_start_page_get(void);
|
||||
|
||||
/**
|
||||
* @brief Get the end page number of the rodata in SPI flash
|
||||
*
|
||||
* @return end page number
|
||||
*/
|
||||
uint32_t rodata_flash_end_page_get(void);
|
||||
|
||||
/**
|
||||
* @brief Get the offset number of rodata from SPI flash to SPI RAM
|
||||
*
|
||||
* @return rodata offset
|
||||
*/
|
||||
int rodata_flash2spiram_offset(void);
|
||||
#endif // #if CONFIG_SPIRAM_RODATA
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user