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