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 = 0x0400; /* 1KB */ 21HeapMinSize = 0x1000; /* 4KB */ 22 23MEMORY 24{ 25 fw_header_memory (rx) : ORIGIN = 0x58000000 - 0x1000, LENGTH = 4K 26 xip_memory (rx) : ORIGIN = 0x58000000, LENGTH = 32M 27 itcm_memory (rx) : ORIGIN = 0x62020000, LENGTH = 20K 28 dtcm_memory (rx) : ORIGIN = 0x62025000, LENGTH = 4K 29 nocache_ram_memory (!rx) : ORIGIN = 0x22026000, LENGTH = 0K 30 ram_memory (!rx) : ORIGIN = 0x22026000, LENGTH = 40K 31 ram_wifi (!rx) : ORIGIN = 0x22030000, LENGTH = 96K 32 ram_dram (wxa) : ORIGIN = 0x3EF80000, LENGTH = 512K 33 xram_memory (!rx) : ORIGIN = 0x40000000, LENGTH = 16K 34 ram_psram (!rx) : ORIGIN = 0x50000000, LENGTH = 1M 35} 36 37SECTIONS 38{ 39 .fw_header : 40 { 41 KEEP(*(.fw_header)) 42 } > fw_header_memory 43 44 .text : 45 { 46 . = ALIGN(4); 47 __text_code_start__ = .; 48 49 KEEP (*(SORT_NONE(.init))) 50 KEEP (*(SORT_NONE(.vector))) 51 52 *(.text) 53 *(.text.*) 54 55 /* section information for finsh shell */ 56 . = ALIGN(4); 57 __fsymtab_start = .; 58 KEEP(*(FSymTab)) 59 __fsymtab_end = .; 60 . = ALIGN(4); 61 __vsymtab_start = .; 62 KEEP(*(VSymTab)) 63 __vsymtab_end = .; 64 . = ALIGN(4); 65 66 /* section information for modules */ 67 . = ALIGN(4); 68 __rtmsymtab_start = .; 69 KEEP(*(RTMSymTab)) 70 __rtmsymtab_end = .; 71 72 /* section information for initialization */ 73 . = ALIGN(4); 74 __rt_init_start = .; 75 KEEP(*(SORT(.rti_fn*))) 76 __rt_init_end = .; 77 78 /* section information for usb usbh_class_info */ 79 . = ALIGN(4); 80 __usbh_class_info_start__ = .; 81 KEEP(*(.usbh_class_info)) 82 . = ALIGN(4); 83 __usbh_class_info_end__ = .; 84 85 /*put .rodata**/ 86 *(EXCLUDE_FILE( *bl808_glb*.o* \ 87 *bl808_glb_gpio*.o* \ 88 *bl808_pds*.o* \ 89 *bl808_aon*.o* \ 90 *bl808_hbn*.o* \ 91 *bl808_l1c*.o* \ 92 *bl808_common*.o* \ 93 *bl808_clock*.o* \ 94 *bl808_ef_ctrl*.o* \ 95 *bl808_sf_cfg*.o* \ 96 *bl808_sf_ctrl*.o* \ 97 *bl808_sflash*.o* \ 98 *bl808_xip_sflash*.o* \ 99 *bl808_romapi_patch*.o* ) .rodata*) 100 *(.srodata) 101 *(.srodata.*) 102 103 /* static fw attribute entry */ 104 . = ALIGN(4); 105 _bl_static_fw_cfg_entry_start = .; 106 KEEP(*(.wifi.cfg.entry)) 107 _bl_static_fw_cfg_entry_end = .; 108 109 . = ALIGN(4); 110 __text_code_end__ = .; 111 } > xip_memory 112 113 . = ALIGN(4); 114 __itcm_load_addr = .; 115 116 .itcm_region : AT (__itcm_load_addr) 117 { 118 . = ALIGN(4); 119 __tcm_code_start__ = .; 120 121 *(.tcm_code.*) 122 *(.tcm_const.*) 123 *(.sclock_rlt_code.*) 124 *(.sclock_rlt_const.*) 125 126 *bl808_glb*.o*(.rodata*) 127 *bl808_glb_gpio*.o*(.rodata*) 128 *bl808_pds*.o*(.rodata*) 129 *bl808_aon*.o*(.rodata*) 130 *bl808_hbn*.o*(.rodata*) 131 *bl808_l1c*.o*(.rodata*) 132 *bl808_common*.o*(.rodata*) 133 *bl808_clock*.o*(.rodata*) 134 *bl808_ef_ctrl*.o*(.rodata*) 135 *bl808_sf_cfg*.o*(.rodata*) 136 *bl808_sf_ctrl*.o*(.rodata*) 137 *bl808_sflash*.o*(.rodata*) 138 *bl808_xip_sflash*.o*(.rodata*) 139 *bl808_romapi_patch*.o*(.rodata*) 140 141 . = ALIGN(4); 142 __tcm_code_end__ = .; 143 } > itcm_memory 144 145 __dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region); 146 147 .dtcm_region : AT (__dtcm_load_addr) 148 { 149 . = ALIGN(4); 150 __tcm_data_start__ = .; 151 152 *(.tcm_data) 153 /* *finger_print.o(.data*) */ 154 155 . = ALIGN(4); 156 __tcm_data_end__ = .; 157 } > dtcm_memory 158 159 /*************************************************************************/ 160 /* .stack_dummy section doesn't contains any symbols. It is only 161 * used for linker to calculate size of stack sections, and assign 162 * values to stack symbols later */ 163 .stack_dummy (NOLOAD): 164 { 165 . = ALIGN(0x4); 166 . = . + StackSize; 167 . = ALIGN(0x4); 168 } > dtcm_memory 169 170 /* Set stack top to end of RAM, and stack limit move down by 171 * size of stack_dummy section */ 172 __StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory); 173 PROVIDE( __freertos_irq_stack_top = __StackTop); 174 PROVIDE( __rt_rvstack = . ); 175 __StackLimit = __StackTop - SIZEOF(.stack_dummy); 176 177 /* Check if data + heap + stack exceeds RAM limit */ 178 ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack") 179 /*************************************************************************/ 180 __nocache_ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region); 181 182 .nocache_ram_region : AT (__nocache_ram_load_addr) 183 { 184 . = ALIGN(4); 185 __nocache_ram_data_start__ = .; 186 187 *(.nocache_ram) 188 189 . = ALIGN(4); 190 __nocache_ram_data_end__ = .; 191 } > nocache_ram_memory 192 193 __ram_load_addr = __nocache_ram_load_addr + SIZEOF(.nocache_ram_region); 194 195 /* Data section */ 196 RAM_DATA : AT (__ram_load_addr) 197 { 198 . = ALIGN(4); 199 __ram_data_start__ = .; 200 201 PROVIDE( __global_pointer$ = . + 0x800 ); 202 203 *(.data) 204 *(.data.*) 205 *(.sdata) 206 *(.sdata.*) 207 *(.sdata2) 208 *(.sdata2.*) 209 210 . = ALIGN(4); 211 __bflog_tags_start__ = .; 212 *(.bflog_tags_array) 213 . = ALIGN(4); 214 __bflog_tags_end__ = .; 215 __ram_data_end__ = .; 216 } > ram_memory 217 218 __etext_final = (__ram_load_addr + SIZEOF (RAM_DATA)); 219 ASSERT(__etext_final <= ORIGIN(xip_memory) + LENGTH(xip_memory), "code memory overflow") 220 221 .wifibss (NOLOAD) : 222 { 223 PROVIDE( __wifi_bss_start = ADDR(.wifibss) ); 224 PROVIDE( __wifi_bss_end = ADDR(.wifibss) + SIZEOF(.wifibss) ); 225 *ipc_shared.o(COMMON) 226 *sdu_shared.o(COMMON) 227 *hal_desc.o(COMMON) 228 *txl_buffer_shared.o(COMMON) 229 *txl_frame_shared.o(COMMON) 230 *scan_shared.o(COMMON) 231 *scanu_shared.o(COMMON) 232 *mfp_bip.o(COMMON) 233 *me_mic.o(COMMON) 234 *bl_sta_mgmt_others.o(COMMON) 235 *bl_pmk_mgmt.o(COMMON) 236 *bl_pmk_mgmt_internal.o(COMMON) 237 *libwifi_drv.a:bl_utils.o(COMMON) 238 *libwifi_drv.a:bl_utils.o(.bss*) 239 *(.wifi_ram*) 240 . = ALIGN(16); 241 } > ram_wifi 242 243 .bss (NOLOAD) : 244 { 245 . = ALIGN(4); 246 __bss_start__ = .; 247 248 *interrupt*.o*(.bss*) 249 *riscv_fpu*.o*(.bss*) 250 *start*.o*(.bss*) 251 *system_bl808*.o*(.bss*) 252 *vector*.o*(.bss*) 253 *bl808_*.o*(.bss*) 254 *bflb_*.o*(.bss*) 255 256 *(.sbss*) 257 258 . = ALIGN(4); 259 __bss_end__ = .; 260 } > ram_memory 261 262 .drambss (NOLOAD) : 263 { 264 . = ALIGN(4); 265 __drambss_start__ = .; 266 267 . = ALIGN(4); 268 __drambss_end__ = .; 269 } > ram_dram 270 271 .psrambss (NOLOAD) : 272 { 273 . = ALIGN(4); 274 __psrambss_start__ = .; 275 276 *(EXCLUDE_FILE( *interrupt*.o* \ 277 *riscv_fpu*.o* \ 278 *start*.o* \ 279 *system_bl808*.o* \ 280 *vector*.o* \ 281 *bl808_*.o* \ 282 *bflb_*.o* ) .bss*) 283 *(COMMON) 284 285 . = ALIGN(4); 286 __psrambss_end__ = .; 287 } > ram_psram 288 289 .noinit_data (NOLOAD) : 290 { 291 . = ALIGN(4); 292 __noinit_data_start__ = .; 293 294 *(.noinit_data*) 295 296 . = ALIGN(4); 297 __noinit_data_end__ = .; 298 } > ram_memory 299 300 .nocache_noinit_ram_region (NOLOAD) : 301 { 302 . = ALIGN(4); 303 __nocache_noinit_ram_data_start__ = .; 304 305 *(.nocache_noinit_ram) 306 *(.noncacheable) 307 308 . = ALIGN(4); 309 __nocache_noinit_ram_data_end__ = .; 310 } > nocache_ram_memory 311 312 .heap (NOLOAD): 313 { 314 . = ALIGN(4); 315 __HeapBase = .; 316 317 /*__end__ = .;*/ 318 /*end = __end__;*/ 319 KEEP(*(.heap*)) 320 321 . = ALIGN(4); 322 __HeapLimit = .; 323 } > ram_psram 324 325 __HeapLimit = ORIGIN(ram_psram) + LENGTH(ram_psram); 326 ASSERT(__HeapLimit - __HeapBase >= HeapMinSize, "heap region overflow") 327 328 PROVIDE( _ld_ram_size2 = LENGTH(ram_wifi) ); 329 PROVIDE( _ld_ram_addr2 = ORIGIN(ram_wifi) ); 330 331 PROVIDE( _ld_bl_static_cfg_entry_start = _bl_static_fw_cfg_entry_start ); 332 PROVIDE( _ld_bl_static_cfg_entry_end = _bl_static_fw_cfg_entry_end ); 333} 334 335