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