4
4
//
5
5
// SPDX-License-Identifier: MIT
6
6
7
+ #include <stddef.h>
7
8
#include <string.h>
8
9
#include <stdlib.h>
9
10
@@ -89,8 +90,7 @@ extern uint32_t _ld_itcm_size;
89
90
extern uint32_t _ld_itcm_flash_copy ;
90
91
91
92
static tlsf_t _heap = NULL ;
92
- static pool_t _ram_pool = NULL ;
93
- static pool_t _psram_pool = NULL ;
93
+ static tlsf_t _psram_heap = NULL ;
94
94
static size_t _psram_size = 0 ;
95
95
96
96
#ifdef CIRCUITPY_PSRAM_CHIP_SELECT
@@ -245,10 +245,9 @@ static void _port_heap_init(void) {
245
245
uint32_t * heap_bottom = port_heap_get_bottom ();
246
246
uint32_t * heap_top = port_heap_get_top ();
247
247
size_t size = (heap_top - heap_bottom ) * sizeof (uint32_t );
248
- _heap = tlsf_create_with_pool (heap_bottom , size , 64 * 1024 * 1024 );
249
- _ram_pool = tlsf_get_pool (_heap );
248
+ _heap = tlsf_create_with_pool (heap_bottom , size , size );
250
249
if (_psram_size > 0 ) {
251
- _psram_pool = tlsf_add_pool ( _heap , (void * )0x11000000 , _psram_size );
250
+ _psram_heap = tlsf_create_with_pool ( (void * )0x11000000 , _psram_size , _psram_size );
252
251
}
253
252
}
254
253
@@ -257,15 +256,31 @@ void port_heap_init(void) {
257
256
}
258
257
259
258
void * port_malloc (size_t size , bool dma_capable ) {
259
+ if (!dma_capable && _psram_size > 0 ) {
260
+ void * block = tlsf_malloc (_psram_heap , size );
261
+ if (block ) {
262
+ return block ;
263
+ }
264
+ }
260
265
void * block = tlsf_malloc (_heap , size );
261
266
return block ;
262
267
}
263
268
264
269
void port_free (void * ptr ) {
265
- tlsf_free (_heap , ptr );
270
+ if (((size_t )ptr ) < SRAM_BASE ) {
271
+ tlsf_free (_psram_heap , ptr );
272
+ } else {
273
+ tlsf_free (_heap , ptr );
274
+ }
266
275
}
267
276
268
- void * port_realloc (void * ptr , size_t size ) {
277
+ void * port_realloc (void * ptr , size_t size , bool dma_capable ) {
278
+ if (_psram_size > 0 && ((ptr != NULL && ((size_t )ptr ) < SRAM_BASE ) || (ptr == NULL && !dma_capable ))) {
279
+ void * block = tlsf_realloc (_psram_heap , ptr , size );
280
+ if (block ) {
281
+ return block ;
282
+ }
283
+ }
269
284
return tlsf_realloc (_heap , ptr , size );
270
285
}
271
286
@@ -279,12 +294,13 @@ static bool max_size_walker(void *ptr, size_t size, int used, void *user) {
279
294
280
295
size_t port_heap_get_largest_free_size (void ) {
281
296
size_t max_size = 0 ;
282
- tlsf_walk_pool (_ram_pool , max_size_walker , & max_size );
283
- if (_psram_pool != NULL ) {
284
- tlsf_walk_pool (_psram_pool , max_size_walker , & max_size );
297
+ tlsf_walk_pool (tlsf_get_pool (_heap ), max_size_walker , & max_size );
298
+ max_size = tlsf_fit_size (_heap , max_size );
299
+ if (_psram_heap != NULL ) {
300
+ tlsf_walk_pool (tlsf_get_pool (_psram_heap ), max_size_walker , & max_size );
301
+ max_size = tlsf_fit_size (_psram_heap , max_size );
285
302
}
286
- // IDF does this. Not sure why.
287
- return tlsf_fit_size (_heap , max_size );
303
+ return max_size ;
288
304
}
289
305
290
306
safe_mode_t port_init (void ) {
0 commit comments