mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 00:51:42 +01:00 
			
		
		
		
	
		
			
	
	
		
			114 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			114 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Licensed under the Apache License, Version 2.0 (the "License");
							 | 
						||
| 
								 | 
							
								// you may not use this file except in compliance with the License.
							 | 
						||
| 
								 | 
							
								// You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//     http://www.apache.org/licenses/LICENSE-2.0
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Unless required by applicable law or agreed to in writing, software
							 | 
						||
| 
								 | 
							
								// distributed under the License is distributed on an "AS IS" BASIS,
							 | 
						||
| 
								 | 
							
								// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
							 | 
						||
| 
								 | 
							
								// See the License for the specific language governing permissions and
							 | 
						||
| 
								 | 
							
								// limitations under the License.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <stdint.h>
							 | 
						||
| 
								 | 
							
								#include <stdbool.h>
							 | 
						||
| 
								 | 
							
								#include "sdkconfig.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define SOC_MEMORY_TYPE_NO_PRIOS 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Type descriptor holds a description for a particular type of memory on a particular SoC.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    const char *name;  ///< Name of this memory type
							 | 
						||
| 
								 | 
							
								    uint32_t caps[SOC_MEMORY_TYPE_NO_PRIOS]; ///< Capabilities for this memory type (as a prioritised set)
							 | 
						||
| 
								 | 
							
								    bool aliased_iram;   ///< If true, this is data memory that is is also mapped in IRAM
							 | 
						||
| 
								 | 
							
								    bool startup_stack; ///< If true, memory of this type is used for ROM stack during startup
							 | 
						||
| 
								 | 
							
								} soc_memory_type_desc_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Constant table of tag descriptors for all this SoC's tags */
							 | 
						||
| 
								 | 
							
								extern const soc_memory_type_desc_t soc_memory_types[];
							 | 
						||
| 
								 | 
							
								extern const size_t soc_memory_type_count;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Region descriptor holds a description for a particular region of memory on a particular SoC.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    intptr_t start;  ///< Start address of the region
							 | 
						||
| 
								 | 
							
								    size_t size;            ///< Size of the region in bytes
							 | 
						||
| 
								 | 
							
								    size_t type;             ///< Type of the region (index into soc_memory_types array)
							 | 
						||
| 
								 | 
							
								    intptr_t iram_address; ///< If non-zero, is equivalent address in IRAM
							 | 
						||
| 
								 | 
							
								} soc_memory_region_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern const soc_memory_region_t soc_memory_regions[];
							 | 
						||
| 
								 | 
							
								extern const size_t soc_memory_region_count;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Region descriptor holds a description for a particular region of
							 | 
						||
| 
								 | 
							
								   memory reserved on this SoC for a particular use (ie not available
							 | 
						||
| 
								 | 
							
								   for stack/heap usage.) */
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    intptr_t start;
							 | 
						||
| 
								 | 
							
								    intptr_t end;
							 | 
						||
| 
								 | 
							
								} soc_reserved_region_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Use this macro to reserved a fixed region of RAM (hardcoded addresses)
							 | 
						||
| 
								 | 
							
								 * for a particular purpose.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Usually used to mark out memory addresses needed for hardware or ROM code
							 | 
						||
| 
								 | 
							
								 * purposes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Don't call this macro from user code which can use normal C static allocation
							 | 
						||
| 
								 | 
							
								 * instead.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param START Start address to be reserved.
							 | 
						||
| 
								 | 
							
								 * @param END One after the address of the last byte to be reserved. (ie length of
							 | 
						||
| 
								 | 
							
								 * the reserved region is (END - START) in bytes.
							 | 
						||
| 
								 | 
							
								 * @param NAME Name for the reserved region. Must be a valid variable name,
							 | 
						||
| 
								 | 
							
								 * unique to this source file.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define SOC_RESERVE_MEMORY_REGION(START, END, NAME)     \
							 | 
						||
| 
								 | 
							
								    __attribute__((section(".reserved_memory_address"))) __attribute__((used)) \
							 | 
						||
| 
								 | 
							
								    static soc_reserved_region_t reserved_region_##NAME = { START, END };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Return available memory regions for this SoC. Each available memory
							 | 
						||
| 
								 | 
							
								 * region is a contiguous piece of memory which is not being used by
							 | 
						||
| 
								 | 
							
								 * static data, used by ROM code, or reserved by a component using
							 | 
						||
| 
								 | 
							
								 * the SOC_RESERVE_MEMORY_REGION() macro.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This result is soc_memory_regions[] minus all regions reserved
							 | 
						||
| 
								 | 
							
								 * via the SOC_RESERVE_MEMORY_REGION() macro (which may also split
							 | 
						||
| 
								 | 
							
								 * some regions up.)
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * At startup, all available memory returned by this function is
							 | 
						||
| 
								 | 
							
								 * registered as heap space.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @note OS-level startup function only, not recommended to call from
							 | 
						||
| 
								 | 
							
								 * app code.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param regions Pointer to an array for reading available regions into.
							 | 
						||
| 
								 | 
							
								 * Size of the array should be at least the result of
							 | 
						||
| 
								 | 
							
								 * soc_get_available_memory_region_max_count(). Entries in the array
							 | 
						||
| 
								 | 
							
								 * will be ordered by memory address.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @return Number of entries copied to 'regions'. Will be no greater than
							 | 
						||
| 
								 | 
							
								 * the result of soc_get_available_memory_region_max_count().
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								size_t soc_get_available_memory_regions(soc_memory_region_t *regions);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Return the maximum number of available memory regions which could be
							 | 
						||
| 
								 | 
							
								 * returned by soc_get_available_memory_regions(). Used to size the
							 | 
						||
| 
								 | 
							
								 * array passed to that function.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								size_t soc_get_available_memory_region_max_count(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 |