Select one of the symbols to view example projects that use it.
 
Outline
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include "soc/soc.h"
#include "soc/ext_mem_defs.h"
#include "soc/soc_caps.h"
#include "sdkconfig.h"
#include "esp_attr.h"
esp_dram_match_iram()
esp_ptr_in_iram(const void *)
esp_ptr_in_dram(const void *)
esp_ptr_in_diram_dram(const void *)
esp_ptr_in_diram_iram(const void *)
esp_ptr_in_rtc_iram_fast(const void *)
esp_ptr_in_rtc_dram_fast(const void *)
esp_ptr_in_rtc_slow(const void *)
esp_ptr_diram_dram_to_iram(const void *)
esp_ptr_rtc_dram_to_iram(const void *)
esp_ptr_diram_iram_to_dram(const void *)
esp_ptr_in_extram(const void *)
Files
loading...
SourceVuESP-IDF Framework and ExamplesESP-IDFcomponents/bootloader_support/include/bootloader_memory_utils.h
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/* * SPDX-FileCopyrightText: 2010-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 *//* ... */ #pragma once #include <stdlib.h> #include <stdint.h> #include <stdbool.h> #include "soc/soc.h" #include "soc/ext_mem_defs.h" #include "soc/soc_caps.h" #include "sdkconfig.h" #include "esp_attr.h"8 includes #ifdef __cplusplus extern "C" { #endif /** The content of this file is to be kept in sync with the common section of esp_memory_utils.h **/ /** * @brief Check if the IRAM and DRAM are separate or using the same memory space * * @return true if the DRAM and IRAM are sharing the same memory space, false otherwise *//* ... */ __attribute__((always_inline)) inline static bool esp_dram_match_iram(void) { bool dram_match_iram = (SOC_DRAM_LOW == SOC_IRAM_LOW) && (SOC_DRAM_HIGH == SOC_IRAM_HIGH); #if SOC_RTC_FAST_MEM_SUPPORTED dram_match_iram &= (SOC_RTC_IRAM_LOW == SOC_RTC_DRAM_LOW); #endif return dram_match_iram; }{ ... } /** * @brief Check if the pointer is in iram * * @param p pointer * * @return true: is in iram; false: not in iram *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_iram(const void *p) { #if CONFIG_IDF_TARGET_ESP32 && CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE return ((intptr_t)p >= SOC_CACHE_APP_LOW && (intptr_t)p < SOC_IRAM_HIGH); #else return ((intptr_t)p >= SOC_IRAM_LOW && (intptr_t)p < SOC_IRAM_HIGH); #endif }{ ... } /** * @brief Check if the pointer is in dram * * @param p pointer * * @return true: is in dram; false: not in dram *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_dram(const void *p) { return ((intptr_t)p >= SOC_DRAM_LOW && (intptr_t)p < SOC_DRAM_HIGH); }{ ... } /** * @brief Check if the pointer is in diram_dram * * @param p pointer * * @return true: is in diram_dram; false: not in diram_dram *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_diram_dram(const void *p) { return ((intptr_t)p >= SOC_DIRAM_DRAM_LOW && (intptr_t)p < SOC_DIRAM_DRAM_HIGH); }{ ... } /** * @brief Check if the pointer is in diram_iram * * @param p pointer * * @return true: is in diram_iram; false: not in diram_iram *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_diram_iram(const void *p) { // TODO: IDF-5980 esp32c6 D/I RAM share the same address #if SOC_DIRAM_IRAM_LOW == SOC_DIRAM_DRAM_LOW return false; #else return ((intptr_t)p >= SOC_DIRAM_IRAM_LOW && (intptr_t)p < SOC_DIRAM_IRAM_HIGH); #endif }{ ... } /** * @brief Check if the pointer is in rtc_iram_fast * * @param p pointer * * @return true: is in rtc_iram_fast; false: not in rtc_iram_fast *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_rtc_iram_fast(const void *p) { #if SOC_RTC_FAST_MEM_SUPPORTED && (SOC_RTC_IRAM_LOW != SOC_RTC_DRAM_LOW) return ((intptr_t)p >= SOC_RTC_IRAM_LOW && (intptr_t)p < SOC_RTC_IRAM_HIGH); #else return false; #endif }{ ... } /** * @brief Check if the pointer is in rtc_dram_fast * * @param p pointer * * @return true: is in rtc_dram_fast; false: not in rtc_dram_fast *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_rtc_dram_fast(const void *p) { #if SOC_RTC_FAST_MEM_SUPPORTED return ((intptr_t)p >= SOC_RTC_DRAM_LOW && (intptr_t)p < SOC_RTC_DRAM_HIGH); #else return false; #endif }{ ... } /** * @brief Check if the pointer is in rtc_slow * * @param p pointer * * @return true: is in rtc_slow; false: not in rtc_slow *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_rtc_slow(const void *p) { #if SOC_RTC_SLOW_MEM_SUPPORTED return ((intptr_t)p >= SOC_RTC_DATA_LOW && (intptr_t)p < SOC_RTC_DATA_HIGH); #else return false; #endif }{ ... } /* Convert a D/IRAM DRAM pointer to equivalent word address in IRAM - Address must be word aligned - Address must pass esp_ptr_in_diram_dram() test, or result will be invalid pointer *//* ... */ __attribute__((always_inline)) inline static void * esp_ptr_diram_dram_to_iram(const void *p) { #if SOC_DIRAM_INVERTED return (void *) ( SOC_DIRAM_IRAM_LOW + (SOC_DIRAM_DRAM_HIGH - (intptr_t)p) - 4); #else return (void *) ( SOC_DIRAM_IRAM_LOW + ((intptr_t)p - SOC_DIRAM_DRAM_LOW) ); #endif }{ ... } /* Convert a RTC DRAM pointer to equivalent word address in RTC IRAM - Address must be word aligned - Address must pass esp_ptr_in_rtc_dram_fast() test, or result will be invalid pointer *//* ... */ __attribute__((always_inline)) inline static void * esp_ptr_rtc_dram_to_iram(const void *p) { intptr_t ptr = (intptr_t)p; #if SOC_RTC_FAST_MEM_SUPPORTED && (SOC_RTC_IRAM_LOW != SOC_RTC_DRAM_LOW) return (void *) ( SOC_RTC_IRAM_LOW + (ptr - SOC_RTC_DRAM_LOW) ); #else return (void *) ptr; #endif }{ ... } /* Convert a D/IRAM IRAM pointer to equivalent word address in DRAM - Address must be word aligned - Address must pass esp_ptr_in_diram_iram() test, or result will be invalid pointer *//* ... */ __attribute__((always_inline)) inline static void * esp_ptr_diram_iram_to_dram(const void *p) { #if SOC_DIRAM_INVERTED return (void *) ( SOC_DIRAM_DRAM_LOW + (SOC_DIRAM_IRAM_HIGH - (intptr_t)p) - 4); #else return (void *) ( SOC_DIRAM_DRAM_LOW + ((intptr_t)p - SOC_DIRAM_IRAM_LOW) ); #endif }{ ... } #if SOC_MEM_TCM_SUPPORTED /** * @brief Check if the pointer is in TCM * * @param p pointer * * @return true: is in TCM; false: not in TCM *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_tcm(const void *p) { return ((intptr_t)p >= SOC_TCM_LOW && (intptr_t)p < SOC_TCM_HIGH); }{...} /* ... */#endif //#if SOC_MEM_TCM_SUPPORTED /** End of the common section that has to be in sync with esp_memory_utils.h **/ /** * @brief Check if the pointer is in PSRAM vaddr space * * @note This function is only used when in bootloader, where the PSRAM isn't initialised. * This function simply check if the pointer is the in the PSRAM vaddr space. * The PSRAM vaddr space is not always the same as the actual PSRAM vaddr range used in APP * * @param p pointer * * @return true: is in PSRAM; false: not in PSRAM *//* ... */ __attribute__((always_inline)) inline static bool esp_ptr_in_extram(const void *p) { bool valid = false; #if SOC_IRAM_PSRAM_ADDRESS_LOW valid |= ((intptr_t)p >= SOC_IRAM_PSRAM_ADDRESS_LOW && (intptr_t)p < SOC_IRAM_PSRAM_ADDRESS_HIGH); #endif #if SOC_DRAM_PSRAM_ADDRESS_LOW valid |= ((intptr_t)p >= SOC_DRAM_PSRAM_ADDRESS_LOW && (intptr_t)p < SOC_DRAM_PSRAM_ADDRESS_HIGH); #endif return valid; }{ ... } /** Don't add new functions below **/ #ifdef __cplusplus }{...} #endif
Details