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