bl616_flash.ld 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /****************************************************************************************
  2. * @file flash.ld
  3. *
  4. * @brief This file is the link script file (gnuarm or armgcc).
  5. *
  6. * Copyright (C) BouffaloLab 2021
  7. *
  8. ****************************************************************************************
  9. */
  10. /* configure the CPU type */
  11. OUTPUT_ARCH( "riscv" )
  12. /* link with the standard c library */
  13. INPUT(-lc)
  14. /* link with the standard GCC library */
  15. INPUT(-lgcc)
  16. /* configure the entry point */
  17. ENTRY(__start)
  18. StackSize = 0x1000; /* 4KB */
  19. HeapMinSize = 0x1000; /* 4KB */
  20. __EM_SIZE = DEFINED(btble_controller_init) ? 32K : 0K;
  21. __RFTLV_SIZE_OFFSET = 1K;
  22. __RFTLV_SIZE_HOLE = 2K;
  23. __RFTLV_HEAD1_H = (0x46524C42); /* BLRF */
  24. __RFTLV_HEAD1_L = (0x41524150); /* PAPA */
  25. MEMORY
  26. {
  27. fw_header_memory (rx) : ORIGIN = 0xA0000000 - 0x1000, LENGTH = 4K
  28. xip_memory (rx) : ORIGIN = 0xA0000000, LENGTH = 4M
  29. ram_code (wxa) : ORIGIN = 0xA8000000, LENGTH = 4M
  30. itcm_memory (rx) : ORIGIN = 0x62FC0000, LENGTH = 20K
  31. dtcm_memory (rx) : ORIGIN = 0x62FC5000, LENGTH = 4K
  32. nocache_ram_memory (!rx) : ORIGIN = 0x22FC6000, LENGTH = 44K+60K
  33. ram_memory (!rx) : ORIGIN = 0x62FE0000, LENGTH = 320K-20K-4K-44K-60K
  34. ram_wifi (wxa) : ORIGIN = 0x23010000, LENGTH = 160K - __EM_SIZE
  35. }
  36. SECTIONS
  37. {
  38. BOOT2_PT_ADDR = 0x63027c00;
  39. .fw_header :
  40. {
  41. KEEP(*(.fw_header))
  42. } > fw_header_memory
  43. .init :
  44. {
  45. KEEP (*(SORT_NONE(.init)))
  46. KEEP (*(SORT_NONE(.vector)))
  47. } > xip_memory
  48. .rftlv.tool :
  49. {
  50. . = ORIGIN(xip_memory) + __RFTLV_SIZE_OFFSET;
  51. PROVIDE( _ld_symbol_rftlv_address = . );
  52. LONG(__RFTLV_HEAD1_H);
  53. LONG(__RFTLV_HEAD1_L);
  54. . = ORIGIN(xip_memory) + __RFTLV_SIZE_OFFSET + __RFTLV_SIZE_HOLE;
  55. } > xip_memory
  56. .text :
  57. {
  58. . = ALIGN(4);
  59. __text_code_start__ = .;
  60. *(.text)
  61. *(.text.*)
  62. /* section information for finsh shell */
  63. . = ALIGN(4);
  64. __fsymtab_start = .;
  65. KEEP(*(FSymTab))
  66. __fsymtab_end = .;
  67. . = ALIGN(4);
  68. __vsymtab_start = .;
  69. KEEP(*(VSymTab))
  70. __vsymtab_end = .;
  71. . = ALIGN(4);
  72. /* section information for modules */
  73. . = ALIGN(4);
  74. __rtmsymtab_start = .;
  75. KEEP(*(RTMSymTab))
  76. __rtmsymtab_end = .;
  77. /* section information for initialization */
  78. . = ALIGN(4);
  79. __rt_init_start = .;
  80. KEEP(*(SORT(.rti_fn*)))
  81. __rt_init_end = .;
  82. /* section information for usb usbh_class_info */
  83. . = ALIGN(4);
  84. __usbh_class_info_start__ = .;
  85. KEEP(*(.usbh_class_info))
  86. . = ALIGN(4);
  87. __usbh_class_info_end__ = .;
  88. /*put .rodata**/
  89. *(EXCLUDE_FILE( *bl616_glb*.o* \
  90. *bl616_pds*.o* \
  91. *bl616_common*.o* \
  92. *bl616_sf_cfg*.o* \
  93. *bl616_sf_ctrl*.o* \
  94. *bl616_sflash*.o* \
  95. *bl616_xip_sflash*.o* \
  96. *bl616_ef_ctrl*.o* \
  97. *bl616_romapi_patch*.o* ).rodata*)
  98. *(.srodata)
  99. *(.srodata.*)
  100. . = ALIGN(4);
  101. __text_code_end__ = .;
  102. } > xip_memory
  103. . = ALIGN(4);
  104. __itcm_load_addr = .;
  105. .itcm_region : AT (__itcm_load_addr)
  106. {
  107. . = ALIGN(4);
  108. __tcm_code_start__ = .;
  109. *(.tcm_code.*)
  110. *(.tcm_const.*)
  111. *(.sclock_rlt_code.*)
  112. *(.sclock_rlt_const.*)
  113. *bl616_glb*.o*(.rodata*)
  114. *bl616_pds*.o*(.rodata*)
  115. *bl616_common*.o*(.rodata*)
  116. *bl616_sf_cfg*.o*(.rodata*)
  117. *bl616_sf_ctrl*.o*(.rodata*)
  118. *bl616_sflash*.o*(.rodata*)
  119. *bl616_xip_sflash*.o*(.rodata*)
  120. *bl616_ef_ctrl*.o*(.rodata*)
  121. *bl616_romapi_patch*.o*(.rodata*)
  122. . = ALIGN(4);
  123. __tcm_code_end__ = .;
  124. } > itcm_memory
  125. __dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region);
  126. .dtcm_region : AT (__dtcm_load_addr)
  127. {
  128. . = ALIGN(4);
  129. __tcm_data_start__ = .;
  130. *(.tcm_data)
  131. /* *finger_print.o(.data*) */
  132. . = ALIGN(4);
  133. __tcm_data_end__ = .;
  134. } > dtcm_memory
  135. /*************************************************************************/
  136. /* .stack_dummy section doesn't contains any symbols. It is only
  137. * used for linker to calculate size of stack sections, and assign
  138. * values to stack symbols later */
  139. .stack_dummy (NOLOAD):
  140. {
  141. . = ALIGN(0x4);
  142. . = . + StackSize;
  143. . = ALIGN(0x4);
  144. } > dtcm_memory
  145. /* Set stack top to end of RAM, and stack limit move down by
  146. * size of stack_dummy section */
  147. __StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory);
  148. PROVIDE( __freertos_irq_stack_top = __StackTop);
  149. PROVIDE( __rt_rvstack = . );
  150. __StackLimit = __StackTop - SIZEOF(.stack_dummy);
  151. /* Check if data + heap + stack exceeds RAM limit */
  152. ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack")
  153. /*************************************************************************/
  154. __nocache_ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region);
  155. .nocache_ram_region : AT (__nocache_ram_load_addr)
  156. {
  157. . = ALIGN(4);
  158. __nocache_ram_data_start__ = .;
  159. *(.nocache_ram)
  160. . = ALIGN(4);
  161. __nocache_ram_data_end__ = .;
  162. } > nocache_ram_memory
  163. __ram_load_addr = __nocache_ram_load_addr + SIZEOF(.nocache_ram_region);
  164. /* Data section */
  165. RAM_DATA : AT (__ram_load_addr)
  166. {
  167. . = ALIGN(4);
  168. __ram_data_start__ = .;
  169. PROVIDE( __global_pointer$ = . + 0x800 );
  170. *(.data)
  171. *(.data.*)
  172. *(.sdata)
  173. *(.sdata.*)
  174. *(.sdata2)
  175. *(.sdata2.*)
  176. . = ALIGN(4);
  177. __bflog_tags_start__ = .;
  178. *(.bflog_tags_array)
  179. . = ALIGN(4);
  180. __bflog_tags_end__ = .;
  181. __ram_data_end__ = .;
  182. } > ram_memory
  183. __etext_final = (__ram_load_addr + SIZEOF (RAM_DATA));
  184. ASSERT(__etext_final <= ORIGIN(xip_memory) + LENGTH(xip_memory), "code memory overflow")
  185. .bss (NOLOAD) :
  186. {
  187. . = ALIGN(4);
  188. __bss_start__ = .;
  189. *(.bss*)
  190. *(.sbss*)
  191. *(COMMON)
  192. . = ALIGN(4);
  193. __bss_end__ = .;
  194. } > ram_memory
  195. .noinit_data (NOLOAD) :
  196. {
  197. . = ALIGN(4);
  198. __noinit_data_start__ = .;
  199. *(.noinit_data*)
  200. . = ALIGN(4);
  201. __noinit_data_end__ = .;
  202. } > ram_memory
  203. .nocache_noinit_ram_region (NOLOAD) :
  204. {
  205. . = ALIGN(4);
  206. __nocache_noinit_ram_data_start__ = .;
  207. *(.nocache_noinit_ram)
  208. *(.noncacheable)
  209. . = ALIGN(4);
  210. __nocache_noinit_ram_data_end__ = .;
  211. } > nocache_ram_memory
  212. .heap (NOLOAD):
  213. {
  214. . = ALIGN(4);
  215. __HeapBase = .;
  216. /*__end__ = .;*/
  217. /*end = __end__;*/
  218. KEEP(*(.heap*))
  219. . = ALIGN(4);
  220. __HeapLimit = .;
  221. } > ram_memory
  222. __HeapLimit = ORIGIN(ram_memory) + LENGTH(ram_memory);
  223. ASSERT(__HeapLimit - __HeapBase >= HeapMinSize, "heap region overflow")
  224. .psmram_data (NOLOAD):
  225. {
  226. . = ALIGN(4);
  227. __psram_data_start__ = .;
  228. /*__end__ = .;*/
  229. /*end = __end__;*/
  230. KEEP(*(.psram_data*))
  231. KEEP(*(.img_buf*))
  232. . = ALIGN(4);
  233. __psram_data_end__ = .;
  234. } > ram_code
  235. .wifibss (NOLOAD) :
  236. {
  237. PROVIDE( __wifi_bss_start = ADDR(.wifibss) );
  238. PROVIDE( __wifi_bss_end = ADDR(.wifibss) + SIZEOF(.wifibss) );
  239. _sshram = . ;
  240. *(SHAREDRAMIPC)
  241. *(SHAREDRAM)
  242. _eshram = . ;
  243. *ipc_shared.o(COMMON)
  244. *sdu_shared.o(COMMON)
  245. *hal_desc.o(COMMON)
  246. *txl_buffer_shared.o(COMMON)
  247. *txl_frame_shared.o(COMMON)
  248. *scan_shared.o(COMMON)
  249. *scanu_shared.o(COMMON)
  250. *mfp_bip.o(COMMON)
  251. *me_mic.o(COMMON)
  252. *(.wifi_ram*)
  253. . = ALIGN(16);
  254. } > ram_wifi
  255. PROVIDE( _heap_wifi_start = . );
  256. PROVIDE( _heap_wifi_size = ORIGIN(ram_wifi) + LENGTH(ram_wifi) - _heap_wifi_start );
  257. }