drv_heap.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /**
  2. * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. ******************************************************************************
  6. * @file drv_heap.c
  7. * @version V0.2
  8. * @brief heap interface
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2019-03-26 Cliff.Chen first implementation
  13. * 2019-05-15 Cliff.Chen Add large heap
  14. *
  15. ******************************************************************************
  16. */
  17. #include <rtthread.h>
  18. #include "drv_heap.h"
  19. #ifdef RT_USING_UNCACHE_HEAP
  20. static struct rt_memheap _uncache_heap;
  21. rt_err_t rt_uncache_heap_init(void *begin_addr, void *end_addr)
  22. {
  23. /* initialize a default heap in the system */
  24. return rt_memheap_init(&_uncache_heap,
  25. "ucheap",
  26. begin_addr,
  27. (rt_uint32_t)end_addr - (rt_uint32_t)begin_addr);
  28. }
  29. void *rt_malloc_uncache(rt_size_t size)
  30. {
  31. return rt_memheap_alloc(&_uncache_heap, size);
  32. }
  33. void rt_free_uncache(void *ptr)
  34. {
  35. rt_memheap_free(ptr);
  36. }
  37. #endif
  38. #ifdef RT_USING_LARGE_HEAP
  39. #include "hal_base.h"
  40. static struct rt_memheap _large_heap;
  41. rt_err_t rt_large_heap_init(void *begin_addr, void *end_addr)
  42. {
  43. /* initialize a default heap in the system */
  44. return rt_memheap_init(&_large_heap,
  45. "large",
  46. begin_addr,
  47. (rt_uint32_t)end_addr - (rt_uint32_t)begin_addr);
  48. }
  49. void *rt_malloc_large(rt_size_t size)
  50. {
  51. if (size < RT_LARGE_MALLOC_THRRESH)
  52. return NULL;
  53. return rt_memheap_alloc(&_large_heap, size);
  54. }
  55. RTM_EXPORT(rt_malloc_large);
  56. void rt_free_large(void *ptr)
  57. {
  58. rt_memheap_free(ptr);
  59. }
  60. RTM_EXPORT(rt_free_large);
  61. void *rt_dma_malloc_large(rt_size_t size)
  62. {
  63. void *align_ptr;
  64. void *ptr;
  65. rt_size_t align, align_size;
  66. if (size < RT_LARGE_MALLOC_THRRESH)
  67. return NULL;
  68. align = 4;
  69. align_size = 0;
  70. #ifdef CACHE_LINE_SIZE
  71. align = CACHE_LINE_SIZE;
  72. #endif
  73. #ifdef DMA_ALIGN_SIZE
  74. align = align > DMA_ALIGN_SIZE ? align : DMA_ALIGN_SIZE;
  75. #endif
  76. align_size = RT_ALIGN(size, align) + align;
  77. ptr = rt_memheap_alloc(&_large_heap, align_size);
  78. if (ptr != RT_NULL)
  79. {
  80. /* the allocated memory block is aligned */
  81. if (((rt_uint32_t)ptr & (align - 1)) == 0)
  82. {
  83. align_ptr = (void *)((rt_uint32_t)ptr + align);
  84. }
  85. else
  86. {
  87. align_ptr = (void *)(((rt_uint32_t)ptr + (align - 1)) & ~(align - 1));
  88. }
  89. /* set the pointer before alignment pointer to the real pointer */
  90. *((rt_uint32_t *)((rt_uint32_t)align_ptr - sizeof(void *))) = (rt_uint32_t)ptr;
  91. ptr = align_ptr;
  92. }
  93. return ptr;
  94. }
  95. RTM_EXPORT(rt_dma_malloc_large);
  96. void rt_dma_free_large(void *ptr)
  97. {
  98. void *real_ptr;
  99. real_ptr = (void *) * (rt_uint32_t *)((rt_uint32_t)ptr - sizeof(void *));
  100. rt_memheap_free(real_ptr);
  101. }
  102. RTM_EXPORT(rt_dma_free_large);
  103. #endif
  104. #ifdef RT_USING_DTCM_HEAP
  105. #include "hal_base.h"
  106. static struct rt_memheap _dtcm_heap;
  107. extern int __dtcm_start__, __dtcm_end__;
  108. #define RK_DTCM_BEGIN (&__dtcm_start__)
  109. #define RK_DTCM_END (&__dtcm_end__)
  110. int rt_dtcm_heap_init(void)
  111. {
  112. rt_err_t ret;
  113. rt_device_t dsp;
  114. dsp = rt_device_find("dsp0");
  115. RT_ASSERT(dsp != RT_NULL);
  116. ret = rt_device_open(dsp, RT_DEVICE_FLAG_RDWR);
  117. RT_ASSERT(ret == RT_EOK);
  118. return rt_memheap_init(&_dtcm_heap,
  119. "dtcmheap",
  120. RK_DTCM_BEGIN,
  121. (rt_uint32_t)RK_DTCM_END - (rt_uint32_t)RK_DTCM_BEGIN);
  122. return RT_EOK;
  123. }
  124. INIT_COMPONENT_EXPORT(rt_dtcm_heap_init);
  125. void *rt_malloc_dtcm(rt_size_t size)
  126. {
  127. //rt_kprintf("rt_malloc_dtcm: size = %d\n", size);
  128. if (size < RT_DTCM_MALLOC_THRRESH)
  129. return NULL;
  130. return rt_memheap_alloc(&_dtcm_heap, size);
  131. }
  132. RTM_EXPORT(rt_malloc_dtcm);
  133. void rt_free_dtcm(void *ptr)
  134. {
  135. rt_memheap_free(ptr);
  136. }
  137. RTM_EXPORT(rt_free_dtcm);
  138. void *rt_dma_malloc_dtcm(rt_size_t size)
  139. {
  140. void *align_ptr;
  141. void *ptr;
  142. rt_size_t align, align_size;
  143. //rt_kprintf("rt_dma_malloc_dtcm: size = %d\n", size);
  144. if (size < RT_DTCM_MALLOC_THRRESH)
  145. return NULL;
  146. align = 4;
  147. align_size = 0;
  148. #ifdef CACHE_LINE_SIZE
  149. align = CACHE_LINE_SIZE;
  150. #endif
  151. #ifdef DMA_ALIGN_SIZE
  152. align = align > DMA_ALIGN_SIZE ? align : DMA_ALIGN_SIZE;
  153. #endif
  154. align_size = RT_ALIGN(size, align) + align;
  155. ptr = rt_memheap_alloc(&_dtcm_heap, align_size);
  156. if (ptr != RT_NULL)
  157. {
  158. /* the allocated memory block is aligned */
  159. if (((rt_uint32_t)ptr & (align - 1)) == 0)
  160. {
  161. align_ptr = (void *)((rt_uint32_t)ptr + align);
  162. }
  163. else
  164. {
  165. align_ptr = (void *)(((rt_uint32_t)ptr + (align - 1)) & ~(align - 1));
  166. }
  167. /* set the pointer before alignment pointer to the real pointer */
  168. *((rt_uint32_t *)((rt_uint32_t)align_ptr - sizeof(void *))) = (rt_uint32_t)ptr;
  169. ptr = align_ptr;
  170. }
  171. return ptr;
  172. }
  173. RTM_EXPORT(rt_dma_malloc_dtcm);
  174. void rt_dma_free_dtcm(void *ptr)
  175. {
  176. void *real_ptr;
  177. real_ptr = (void *) * (rt_uint32_t *)((rt_uint32_t)ptr - sizeof(void *));
  178. rt_memheap_free(real_ptr);
  179. }
  180. RTM_EXPORT(rt_dma_free_dtcm);
  181. #endif
  182. #ifdef RT_USING_PSRAM_HEAP
  183. #include "hal_base.h"
  184. static struct rt_memheap _psram_heap;
  185. extern int __psramheap_start__, __psramheap_end__;
  186. #define RK_PSRAMHEAP_BEGIN (&__psramheap_start__)
  187. #define RK_PSRAMHEAP_END (&__psramheap_end__)
  188. int rt_psram_heap_init(void)
  189. {
  190. return rt_memheap_init(&_psram_heap,
  191. "psramheap",
  192. RK_PSRAMHEAP_BEGIN,
  193. (rt_uint32_t)RK_PSRAMHEAP_END - (rt_uint32_t)RK_PSRAMHEAP_BEGIN);
  194. }
  195. INIT_COMPONENT_EXPORT(rt_psram_heap_init);
  196. void *rt_malloc_psram(rt_size_t size)
  197. {
  198. //rt_kprintf("rt_malloc_dtcm: size = %d\n", size);
  199. if (size < RT_PSRAM_MALLOC_THRRESH)
  200. return NULL;
  201. return rt_memheap_alloc(&_psram_heap, size);
  202. }
  203. RTM_EXPORT(rt_malloc_psram);
  204. void rt_free_psram(void *ptr)
  205. {
  206. rt_memheap_free(ptr);
  207. }
  208. RTM_EXPORT(rt_free_psram);
  209. void *rt_dma_malloc_psram(rt_size_t size)
  210. {
  211. void *align_ptr;
  212. void *ptr;
  213. rt_size_t align, align_size;
  214. //rt_kprintf("rt_dma_malloc_dtcm: size = %d\n", size);
  215. if (size < RT_PSRAM_MALLOC_THRRESH)
  216. return NULL;
  217. align = 4;
  218. align_size = 0;
  219. #ifdef CACHE_LINE_SIZE
  220. align = CACHE_LINE_SIZE;
  221. #endif
  222. #ifdef DMA_ALIGN_SIZE
  223. align = align > DMA_ALIGN_SIZE ? align : DMA_ALIGN_SIZE;
  224. #endif
  225. align_size = RT_ALIGN(size, align) + align;
  226. ptr = rt_memheap_alloc(&_psram_heap, align_size);
  227. if (ptr != RT_NULL)
  228. {
  229. /* the allocated memory block is aligned */
  230. if (((rt_uint32_t)ptr & (align - 1)) == 0)
  231. {
  232. align_ptr = (void *)((rt_uint32_t)ptr + align);
  233. }
  234. else
  235. {
  236. align_ptr = (void *)(((rt_uint32_t)ptr + (align - 1)) & ~(align - 1));
  237. }
  238. /* set the pointer before alignment pointer to the real pointer */
  239. *((rt_uint32_t *)((rt_uint32_t)align_ptr - sizeof(void *))) = (rt_uint32_t)ptr;
  240. ptr = align_ptr;
  241. }
  242. return ptr;
  243. }
  244. RTM_EXPORT(rt_dma_malloc_psram);
  245. void rt_dma_free_psram(void *ptr)
  246. {
  247. void *real_ptr;
  248. real_ptr = (void *) * (rt_uint32_t *)((rt_uint32_t)ptr - sizeof(void *));
  249. rt_memheap_free(real_ptr);
  250. }
  251. RTM_EXPORT(rt_dma_free_psram);
  252. #endif