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 = 0x580C0000 - 0x1000, LENGTH = 4K 26 xip_memory (rx) : ORIGIN = 0x580C0000, LENGTH = 1M 27 itcm_memory (rx) : ORIGIN = 0x2202C000, LENGTH = 16K 28 dtcm_memory (rx) : ORIGIN = 0x22030000, LENGTH = 16K 29 nocache_ram_memory (!rx) : ORIGIN = 0x22030000, LENGTH = 0K 30 ram_memory (!rx) : ORIGIN = 0x22034000, LENGTH = 16K 31 xram_memory (!rx) : ORIGIN = 0x40000000, LENGTH = 16K 32} 33 34SECTIONS 35{ 36 .fw_header : 37 { 38 KEEP(*(.fw_header)) 39 } > fw_header_memory 40 41 .text : 42 { 43 . = ALIGN(4); 44 __text_code_start__ = .; 45 46 KEEP (*(SORT_NONE(.init))) 47 KEEP (*(SORT_NONE(.vector))) 48 49 *(.text) 50 *(.text.*) 51 52 /* section information for finsh shell */ 53 . = ALIGN(4); 54 __fsymtab_start = .; 55 KEEP(*(FSymTab)) 56 __fsymtab_end = .; 57 . = ALIGN(4); 58 __vsymtab_start = .; 59 KEEP(*(VSymTab)) 60 __vsymtab_end = .; 61 . = ALIGN(4); 62 63 /* section information for modules */ 64 . = ALIGN(4); 65 __rtmsymtab_start = .; 66 KEEP(*(RTMSymTab)) 67 __rtmsymtab_end = .; 68 69 /* section information for initialization */ 70 . = ALIGN(4); 71 __rt_init_start = .; 72 KEEP(*(SORT(.rti_fn*))) 73 __rt_init_end = .; 74 75 /* section information for usb usbh_class_info */ 76 . = ALIGN(4); 77 __usbh_class_info_start__ = .; 78 KEEP(*(.usbh_class_info)) 79 . = ALIGN(4); 80 __usbh_class_info_end__ = .; 81 82 /*put .rodata**/ 83 *(EXCLUDE_FILE( *bl808_glb*.o* \ 84 *bl808_glb_gpio*.o* \ 85 *bl808_pds*.o* \ 86 *bl808_aon*.o* \ 87 *bl808_hbn*.o* \ 88 *bl808_l1c*.o* \ 89 *bl808_common*.o* \ 90 *bl808_clock*.o* \ 91 *bl808_ef_ctrl*.o* \ 92 *bl808_sf_cfg*.o* \ 93 *bl808_sf_ctrl*.o* \ 94 *bl808_sflash*.o* \ 95 *bl808_xip_sflash*.o* \ 96 *bl808_romapi_patch*.o* ) .rodata*) 97 *(.srodata) 98 *(.srodata.*) 99 100 . = ALIGN(4); 101 __text_code_end__ = .; 102 } > xip_memory 103 104 . = ALIGN(4); 105 __itcm_load_addr = .; 106 107 .itcm_region : AT (__itcm_load_addr) 108 { 109 . = ALIGN(4); 110 __tcm_code_start__ = .; 111 112 *(.tcm_code.*) 113 *(.tcm_const.*) 114 *(.sclock_rlt_code.*) 115 *(.sclock_rlt_const.*) 116 117 *bl808_glb*.o*(.rodata*) 118 *bl808_glb_gpio*.o*(.rodata*) 119 *bl808_pds*.o*(.rodata*) 120 *bl808_aon*.o*(.rodata*) 121 *bl808_hbn*.o*(.rodata*) 122 *bl808_l1c*.o*(.rodata*) 123 *bl808_common*.o*(.rodata*) 124 *bl808_clock*.o*(.rodata*) 125 *bl808_ef_ctrl*.o*(.rodata*) 126 *bl808_sf_cfg*.o*(.rodata*) 127 *bl808_sf_ctrl*.o*(.rodata*) 128 *bl808_sflash*.o*(.rodata*) 129 *bl808_xip_sflash*.o*(.rodata*) 130 *bl808_romapi_patch*.o*(.rodata*) 131 132 . = ALIGN(4); 133 __tcm_code_end__ = .; 134 } > itcm_memory 135 136 __dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region); 137 138 .dtcm_region : AT (__dtcm_load_addr) 139 { 140 . = ALIGN(4); 141 __tcm_data_start__ = .; 142 143 *(.tcm_data) 144 /* *finger_print.o(.data*) */ 145 146 . = ALIGN(4); 147 __tcm_data_end__ = .; 148 } > dtcm_memory 149 150 /*************************************************************************/ 151 /* .stack_dummy section doesn't contains any symbols. It is only 152 * used for linker to calculate size of stack sections, and assign 153 * values to stack symbols later */ 154 .stack_dummy (NOLOAD): 155 { 156 . = ALIGN(0x4); 157 . = . + StackSize; 158 . = ALIGN(0x4); 159 } > dtcm_memory 160 161 /* Set stack top to end of RAM, and stack limit move down by 162 * size of stack_dummy section */ 163 __StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory); 164 PROVIDE( __freertos_irq_stack_top = __StackTop); 165 PROVIDE( __rt_rvstack = . ); 166 __StackLimit = __StackTop - SIZEOF(.stack_dummy); 167 168 /* Check if data + heap + stack exceeds RAM limit */ 169 ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack") 170 171 /*************************************************************************/ 172 173 __nocache_ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region); 174 175 .nocache_ram_region : AT (__nocache_ram_load_addr) 176 { 177 . = ALIGN(4); 178 __nocache_ram_data_start__ = .; 179 180 *(.nocache_ram) 181 182 . = ALIGN(4); 183 __nocache_ram_data_end__ = .; 184 } > nocache_ram_memory 185 186 __ram_load_addr = __nocache_ram_load_addr + SIZEOF(.nocache_ram_region); 187 188 /* Data section */ 189 RAM_DATA : AT (__ram_load_addr) 190 { 191 . = ALIGN(4); 192 __ram_data_start__ = .; 193 194 PROVIDE( __global_pointer$ = . + 0x800 ); 195 196 *(.data) 197 *(.data.*) 198 *(.sdata) 199 *(.sdata.*) 200 *(.sdata2) 201 *(.sdata2.*) 202 203 . = ALIGN(4); 204 __bflog_tags_start__ = .; 205 *(.bflog_tags_array) 206 . = ALIGN(4); 207 __bflog_tags_end__ = .; 208 __ram_data_end__ = .; 209 } > ram_memory 210 211 __etext_final = (__ram_load_addr + SIZEOF (RAM_DATA)); 212 ASSERT(__etext_final <= ORIGIN(xip_memory) + LENGTH(xip_memory), "code memory overflow") 213 214 .bss (NOLOAD) : 215 { 216 . = ALIGN(4); 217 __bss_start__ = .; 218 219 *(.bss*) 220 *(.sbss*) 221 *(COMMON) 222 223 . = ALIGN(4); 224 __bss_end__ = .; 225 } > ram_memory 226 227 .noinit_data (NOLOAD) : 228 { 229 . = ALIGN(4); 230 __noinit_data_start__ = .; 231 232 *(.noinit_data*) 233 234 . = ALIGN(4); 235 __noinit_data_end__ = .; 236 } > ram_memory 237 238 .nocache_noinit_ram_region (NOLOAD) : 239 { 240 . = ALIGN(4); 241 __nocache_noinit_ram_data_start__ = .; 242 243 *(.nocache_noinit_ram) 244 *(.noncacheable) 245 246 . = ALIGN(4); 247 __nocache_noinit_ram_data_end__ = .; 248 } > nocache_ram_memory 249 250 .heap (NOLOAD): 251 { 252 . = ALIGN(4); 253 __HeapBase = .; 254 255 /*__end__ = .;*/ 256 /*end = __end__;*/ 257 KEEP(*(.heap*)) 258 259 . = ALIGN(4); 260 __HeapLimit = .; 261 } > ram_memory 262 263 __HeapLimit = ORIGIN(ram_memory) + LENGTH(ram_memory); 264 ASSERT(__HeapLimit - __HeapBase >= HeapMinSize, "heap region overflow") 265 266} 267 268