/* * Copyright (c) 2022, ArtInChip Technology Co., Ltd * * SPDX-License-Identifier: Apache-2.0 * * Authors: weilin.peng@artinchip.com */ #include #include "board.h" extern void aic_board_pinmux_init(void); extern void aic_board_sysclk_init(void); #if defined(KERNEL_RTTHREAD) #include #include #include extern size_t __heap_start; extern size_t __heap_end; #ifdef RT_USING_MEMHEAP extern size_t __dram_cma_heap_start; extern size_t __dram_cma_heap_end; struct aic_memheap { aic_mem_region_t type; char * name; void * begin_addr; void * end_addr; struct rt_memheap heap; struct rt_mutex lock; }; struct aic_memheap aic_memheaps[] = { #ifdef AIC_DRAM_CMA_EN {MEM_DRAM_CMA, "heap_cma", (void *)&__dram_cma_heap_start, (void *)&__dram_cma_heap_end}, #endif }; void aic_memheap_init(void) { rt_ubase_t begin_align; rt_ubase_t end_align; int i = 0; for (i=0; i begin_align); rt_memheap_init(&aic_memheaps[i].heap, aic_memheaps[i].name, (void *)begin_align, end_align - begin_align); rt_mutex_init(&aic_memheaps[i].lock, aic_memheaps[i].name, RT_IPC_FLAG_PRIO); } } void *aic_memheap_malloc(int type, size_t size) { void *ptr; int i = 0; for (i=0; i= sizeof(aic_memheaps)/sizeof(struct aic_memheap)) return NULL; /* Enter critical zone */ rt_mutex_take(&aic_memheaps[i].lock, RT_WAITING_FOREVER); /* allocate memory block from system heap */ ptr = rt_memheap_alloc(&aic_memheaps[i].heap, size); /* Exit critical zone */ rt_mutex_release(&aic_memheaps[i].lock); return ptr; } void aic_memheap_free(int type, void *rmem) { int i = 0; if (rmem == RT_NULL) return; for (i=0; i= sizeof(aic_memheaps)/sizeof(struct aic_memheap)) return; /* Enter critical zone */ rt_mutex_take(&aic_memheaps[i].lock, RT_WAITING_FOREVER); rt_memheap_free(rmem); /* Exit critical zone */ rt_mutex_release(&aic_memheaps[i].lock); } #endif /** * This function will initial smart-evb board. */ void rt_hw_board_init(void) { #ifdef RT_USING_HEAP rt_system_heap_init((void *)&__heap_start, (void *)&__heap_end); #if (!defined(QEMU_RUN) && defined(RT_USING_MEMHEAP)) aic_memheap_init(); #endif #endif aic_board_sysclk_init(); aic_board_pinmux_init(); #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif } #elif defined(KERNEL_FREERTOS) #elif defined(KERNEL_BAREMETAL) #include void aic_hw_board_init(void) { #ifdef TLSF_MEM_HEAP aic_tlsf_heap_init(); #endif aic_board_sysclk_init(); aic_board_pinmux_init(); } #endif /*@}*/