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