xref: /btstack/port/renesas-tb-s1ja-cc256x/template/btstack_example/script/s1ja.ld (revision 3b5c872a8c45689e8cc17891f01530f5aa5e911c)
1*3b5c872aSMatthias Ringwald/*
2*3b5c872aSMatthias Ringwald                  Linker File for S1JA MCU
3*3b5c872aSMatthias Ringwald*/
4*3b5c872aSMatthias Ringwald
5*3b5c872aSMatthias Ringwald/* Linker script to configure memory regions. */
6*3b5c872aSMatthias RingwaldMEMORY
7*3b5c872aSMatthias Ringwald{
8*3b5c872aSMatthias Ringwald  FLASH (rx)         : ORIGIN = 0x00000000, LENGTH = 0x040000  /* 256K */
9*3b5c872aSMatthias Ringwald
10*3b5c872aSMatthias Ringwald
11*3b5c872aSMatthias Ringwald
12*3b5c872aSMatthias Ringwald  RAM (rwx)          : ORIGIN = 0x20000000, LENGTH = 0x008000  /* 32K  */
13*3b5c872aSMatthias Ringwald  DATA_FLASH (rx)    : ORIGIN = 0x40100000, LENGTH = 0x0002000 /*  8K  */
14*3b5c872aSMatthias Ringwald  ID_CODE_1 (rx)      : ORIGIN = 0x01010018, LENGTH = 0x04     /* 4 bytes */
15*3b5c872aSMatthias Ringwald  ID_CODE_2 (rx)      : ORIGIN = 0x01010020, LENGTH = 0x04     /* 4 bytes */
16*3b5c872aSMatthias Ringwald  ID_CODE_3 (rx)      : ORIGIN = 0x01010028, LENGTH = 0x04     /* 4 bytes */
17*3b5c872aSMatthias Ringwald  ID_CODE_4 (rx)      : ORIGIN = 0x01010030, LENGTH = 0x04     /* 4 bytes */
18*3b5c872aSMatthias Ringwald}
19*3b5c872aSMatthias Ringwald
20*3b5c872aSMatthias Ringwald/* Library configurations */
21*3b5c872aSMatthias RingwaldGROUP(libgcc.a libc.a libm.a libnosys.a)
22*3b5c872aSMatthias Ringwald
23*3b5c872aSMatthias Ringwald/* Linker script to place sections and symbol values. Should be used together
24*3b5c872aSMatthias Ringwald * with other linker script that defines memory regions FLASH and RAM.
25*3b5c872aSMatthias Ringwald * It references following symbols, which must be defined in code:
26*3b5c872aSMatthias Ringwald *   Reset_Handler : Entry of reset handler
27*3b5c872aSMatthias Ringwald *
28*3b5c872aSMatthias Ringwald * It defines following symbols, which code can use without definition:
29*3b5c872aSMatthias Ringwald *   __exidx_start
30*3b5c872aSMatthias Ringwald *   __exidx_end
31*3b5c872aSMatthias Ringwald *   __copy_table_start__
32*3b5c872aSMatthias Ringwald *   __copy_table_end__
33*3b5c872aSMatthias Ringwald *   __zero_table_start__
34*3b5c872aSMatthias Ringwald *   __zero_table_end__
35*3b5c872aSMatthias Ringwald *   __etext
36*3b5c872aSMatthias Ringwald *   __data_start__
37*3b5c872aSMatthias Ringwald *   __preinit_array_start
38*3b5c872aSMatthias Ringwald *   __preinit_array_end
39*3b5c872aSMatthias Ringwald *   __init_array_start
40*3b5c872aSMatthias Ringwald *   __init_array_end
41*3b5c872aSMatthias Ringwald *   __fini_array_start
42*3b5c872aSMatthias Ringwald *   __fini_array_end
43*3b5c872aSMatthias Ringwald *   __data_end__
44*3b5c872aSMatthias Ringwald *   __bss_start__
45*3b5c872aSMatthias Ringwald *   __bss_end__
46*3b5c872aSMatthias Ringwald *   __end__
47*3b5c872aSMatthias Ringwald *   end
48*3b5c872aSMatthias Ringwald *   __HeapLimit
49*3b5c872aSMatthias Ringwald *   __StackLimit
50*3b5c872aSMatthias Ringwald *   __StackTop
51*3b5c872aSMatthias Ringwald *   __stack
52*3b5c872aSMatthias Ringwald *   __Vectors_End
53*3b5c872aSMatthias Ringwald *   __Vectors_Size
54*3b5c872aSMatthias Ringwald */
55*3b5c872aSMatthias RingwaldENTRY(Reset_Handler)
56*3b5c872aSMatthias Ringwald
57*3b5c872aSMatthias RingwaldSECTIONS
58*3b5c872aSMatthias Ringwald{
59*3b5c872aSMatthias Ringwald    .text :
60*3b5c872aSMatthias Ringwald    {
61*3b5c872aSMatthias Ringwald        __ROM_Start = .;
62*3b5c872aSMatthias Ringwald
63*3b5c872aSMatthias Ringwald        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much
64*3b5c872aSMatthias Ringwald         * space because ROM registers are at address 0x400 and there is very little space
65*3b5c872aSMatthias Ringwald         * in between. */
66*3b5c872aSMatthias Ringwald        KEEP(*(.vectors))
67*3b5c872aSMatthias Ringwald        KEEP(*(SORT_BY_NAME(.vector.*)))
68*3b5c872aSMatthias Ringwald        __Vectors_End = .;
69*3b5c872aSMatthias Ringwald        __end__ = .;
70*3b5c872aSMatthias Ringwald
71*3b5c872aSMatthias Ringwald        /* ROM Registers start at address 0x00000400 */
72*3b5c872aSMatthias Ringwald        . = __ROM_Start + 0x400;
73*3b5c872aSMatthias Ringwald        KEEP(*(.rom_registers*))
74*3b5c872aSMatthias Ringwald
75*3b5c872aSMatthias Ringwald        /* Reserving 0x100 bytes of space for ROM registers. */
76*3b5c872aSMatthias Ringwald        . = __ROM_Start + 0x500;
77*3b5c872aSMatthias Ringwald
78*3b5c872aSMatthias Ringwald        /* Vector information array. */
79*3b5c872aSMatthias Ringwald        __Vector_Info_Start = .;
80*3b5c872aSMatthias Ringwald        KEEP(*(SORT_BY_NAME(.vector_info.*)))
81*3b5c872aSMatthias Ringwald        __Vector_Info_End = .;
82*3b5c872aSMatthias Ringwald
83*3b5c872aSMatthias Ringwald        /* Hardware lock lookup array. */
84*3b5c872aSMatthias Ringwald        __Lock_Lookup_Start = .;
85*3b5c872aSMatthias Ringwald        KEEP(*(SORT_BY_NAME(.hw_lock_lookup.*)))
86*3b5c872aSMatthias Ringwald        __Lock_Lookup_End = .;
87*3b5c872aSMatthias Ringwald
88*3b5c872aSMatthias Ringwald        *(.text*)
89*3b5c872aSMatthias Ringwald
90*3b5c872aSMatthias Ringwald        KEEP(*(.init))
91*3b5c872aSMatthias Ringwald        KEEP(*(.fini))
92*3b5c872aSMatthias Ringwald
93*3b5c872aSMatthias Ringwald        /* .ctors */
94*3b5c872aSMatthias Ringwald        *crtbegin.o(.ctors)
95*3b5c872aSMatthias Ringwald        *crtbegin?.o(.ctors)
96*3b5c872aSMatthias Ringwald        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
97*3b5c872aSMatthias Ringwald        *(SORT(.ctors.*))
98*3b5c872aSMatthias Ringwald        *(.ctors)
99*3b5c872aSMatthias Ringwald
100*3b5c872aSMatthias Ringwald        /* .dtors */
101*3b5c872aSMatthias Ringwald        *crtbegin.o(.dtors)
102*3b5c872aSMatthias Ringwald        *crtbegin?.o(.dtors)
103*3b5c872aSMatthias Ringwald        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
104*3b5c872aSMatthias Ringwald        *(SORT(.dtors.*))
105*3b5c872aSMatthias Ringwald        *(.dtors)
106*3b5c872aSMatthias Ringwald
107*3b5c872aSMatthias Ringwald        *(.rodata*)
108*3b5c872aSMatthias Ringwald        __usb_dev_descriptor_start_fs = .;
109*3b5c872aSMatthias Ringwald        KEEP(*(.usb_device_desc_fs*))
110*3b5c872aSMatthias Ringwald        __usb_cfg_descriptor_start_fs = .;
111*3b5c872aSMatthias Ringwald        KEEP(*(.usb_config_desc_fs*))
112*3b5c872aSMatthias Ringwald        __usb_interface_descriptor_start_fs = .;
113*3b5c872aSMatthias Ringwald        KEEP(*(.usb_interface_desc_fs*))
114*3b5c872aSMatthias Ringwald        __usb_descriptor_end_fs = .;
115*3b5c872aSMatthias Ringwald
116*3b5c872aSMatthias Ringwald        KEEP(*(.eh_frame*))
117*3b5c872aSMatthias Ringwald
118*3b5c872aSMatthias Ringwald        __ROM_End = .;
119*3b5c872aSMatthias Ringwald    } > FLASH = 0xFF
120*3b5c872aSMatthias Ringwald
121*3b5c872aSMatthias Ringwald    __Vectors_Size = __Vectors_End - __Vectors;
122*3b5c872aSMatthias Ringwald    __Vector_Info_Size = __Vector_Info_End - __Vector_Info_Start;
123*3b5c872aSMatthias Ringwald    __Lock_Lookup_Size = __Lock_Lookup_End - __Lock_Lookup_Start;
124*3b5c872aSMatthias Ringwald
125*3b5c872aSMatthias Ringwald    .ARM.extab :
126*3b5c872aSMatthias Ringwald    {
127*3b5c872aSMatthias Ringwald        *(.ARM.extab* .gnu.linkonce.armextab.*)
128*3b5c872aSMatthias Ringwald    } > FLASH
129*3b5c872aSMatthias Ringwald
130*3b5c872aSMatthias Ringwald    __exidx_start = .;
131*3b5c872aSMatthias Ringwald    .ARM.exidx :
132*3b5c872aSMatthias Ringwald    {
133*3b5c872aSMatthias Ringwald        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
134*3b5c872aSMatthias Ringwald    } > FLASH
135*3b5c872aSMatthias Ringwald    __exidx_end = .;
136*3b5c872aSMatthias Ringwald
137*3b5c872aSMatthias Ringwald    /* To copy multiple ROM to RAM sections,
138*3b5c872aSMatthias Ringwald     * uncomment .copy.table section and,
139*3b5c872aSMatthias Ringwald     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */
140*3b5c872aSMatthias Ringwald    /*
141*3b5c872aSMatthias Ringwald    .copy.table :
142*3b5c872aSMatthias Ringwald    {
143*3b5c872aSMatthias Ringwald        . = ALIGN(4);
144*3b5c872aSMatthias Ringwald        __copy_table_start__ = .;
145*3b5c872aSMatthias Ringwald        LONG (__etext)
146*3b5c872aSMatthias Ringwald        LONG (__data_start__)
147*3b5c872aSMatthias Ringwald        LONG (__data_end__ - __data_start__)
148*3b5c872aSMatthias Ringwald        LONG (__etext2)
149*3b5c872aSMatthias Ringwald        LONG (__data2_start__)
150*3b5c872aSMatthias Ringwald        LONG (__data2_end__ - __data2_start__)
151*3b5c872aSMatthias Ringwald        __copy_table_end__ = .;
152*3b5c872aSMatthias Ringwald    } > FLASH
153*3b5c872aSMatthias Ringwald    */
154*3b5c872aSMatthias Ringwald
155*3b5c872aSMatthias Ringwald    /* To clear multiple BSS sections,
156*3b5c872aSMatthias Ringwald     * uncomment .zero.table section and,
157*3b5c872aSMatthias Ringwald     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */
158*3b5c872aSMatthias Ringwald    /*
159*3b5c872aSMatthias Ringwald    .zero.table :
160*3b5c872aSMatthias Ringwald    {
161*3b5c872aSMatthias Ringwald        . = ALIGN(4);
162*3b5c872aSMatthias Ringwald        __zero_table_start__ = .;
163*3b5c872aSMatthias Ringwald        LONG (__bss_start__)
164*3b5c872aSMatthias Ringwald        LONG (__bss_end__ - __bss_start__)
165*3b5c872aSMatthias Ringwald        LONG (__bss2_start__)
166*3b5c872aSMatthias Ringwald        LONG (__bss2_end__ - __bss2_start__)
167*3b5c872aSMatthias Ringwald        __zero_table_end__ = .;
168*3b5c872aSMatthias Ringwald    } > FLASH
169*3b5c872aSMatthias Ringwald    */
170*3b5c872aSMatthias Ringwald
171*3b5c872aSMatthias Ringwald    __etext = .;
172*3b5c872aSMatthias Ringwald
173*3b5c872aSMatthias Ringwald    /* If DTC is used, put the DTC vector table at the start of SRAM.
174*3b5c872aSMatthias Ringwald       This avoids memory holes due to 1K alignment required by it. */
175*3b5c872aSMatthias Ringwald    .ssp_dtc_vector_table (NOLOAD) :
176*3b5c872aSMatthias Ringwald    {
177*3b5c872aSMatthias Ringwald        . = ORIGIN(RAM);
178*3b5c872aSMatthias Ringwald        *(.ssp_dtc_vector_table)
179*3b5c872aSMatthias Ringwald    } > RAM
180*3b5c872aSMatthias Ringwald
181*3b5c872aSMatthias Ringwald    /* Initialized data section. */
182*3b5c872aSMatthias Ringwald    .data :
183*3b5c872aSMatthias Ringwald    {
184*3b5c872aSMatthias Ringwald        __data_start__ = .;
185*3b5c872aSMatthias Ringwald        *(vtable)
186*3b5c872aSMatthias Ringwald        *(.data.*)
187*3b5c872aSMatthias Ringwald
188*3b5c872aSMatthias Ringwald        . = ALIGN(4);
189*3b5c872aSMatthias Ringwald        /* preinit data */
190*3b5c872aSMatthias Ringwald        PROVIDE_HIDDEN (__preinit_array_start = .);
191*3b5c872aSMatthias Ringwald        KEEP(*(.preinit_array))
192*3b5c872aSMatthias Ringwald        PROVIDE_HIDDEN (__preinit_array_end = .);
193*3b5c872aSMatthias Ringwald
194*3b5c872aSMatthias Ringwald        . = ALIGN(4);
195*3b5c872aSMatthias Ringwald        /* init data */
196*3b5c872aSMatthias Ringwald        PROVIDE_HIDDEN (__init_array_start = .);
197*3b5c872aSMatthias Ringwald        KEEP(*(SORT(.init_array.*)))
198*3b5c872aSMatthias Ringwald        KEEP(*(.init_array))
199*3b5c872aSMatthias Ringwald        PROVIDE_HIDDEN (__init_array_end = .);
200*3b5c872aSMatthias Ringwald
201*3b5c872aSMatthias Ringwald
202*3b5c872aSMatthias Ringwald        . = ALIGN(4);
203*3b5c872aSMatthias Ringwald        /* finit data */
204*3b5c872aSMatthias Ringwald        PROVIDE_HIDDEN (__fini_array_start = .);
205*3b5c872aSMatthias Ringwald        KEEP(*(SORT(.fini_array.*)))
206*3b5c872aSMatthias Ringwald        KEEP(*(.fini_array))
207*3b5c872aSMatthias Ringwald        PROVIDE_HIDDEN (__fini_array_end = .);
208*3b5c872aSMatthias Ringwald
209*3b5c872aSMatthias Ringwald        KEEP(*(.jcr*))
210*3b5c872aSMatthias Ringwald        . = ALIGN(4);
211*3b5c872aSMatthias Ringwald
212*3b5c872aSMatthias Ringwald        __Code_In_RAM_Start = .;
213*3b5c872aSMatthias Ringwald
214*3b5c872aSMatthias Ringwald        KEEP(*(.code_in_ram*))
215*3b5c872aSMatthias Ringwald        __Code_In_RAM_End = .;
216*3b5c872aSMatthias Ringwald
217*3b5c872aSMatthias Ringwald        /* Hardware look array. */
218*3b5c872aSMatthias Ringwald        __Lock_Start = .;
219*3b5c872aSMatthias Ringwald        KEEP(*(SORT_BY_NAME(.hw_lock*)))
220*3b5c872aSMatthias Ringwald        __Lock_End = .;
221*3b5c872aSMatthias Ringwald
222*3b5c872aSMatthias Ringwald        /* All data end */
223*3b5c872aSMatthias Ringwald        __data_end__ = .;
224*3b5c872aSMatthias Ringwald
225*3b5c872aSMatthias Ringwald    } > RAM AT > FLASH
226*3b5c872aSMatthias Ringwald
227*3b5c872aSMatthias Ringwald    __Lock_Size = __Lock_End - __Lock_Start;
228*3b5c872aSMatthias Ringwald
229*3b5c872aSMatthias Ringwald    .noinit (NOLOAD):
230*3b5c872aSMatthias Ringwald    {
231*3b5c872aSMatthias Ringwald        . = ALIGN(4);
232*3b5c872aSMatthias Ringwald        __noinit_start = .;
233*3b5c872aSMatthias Ringwald        KEEP(*(.noinit*))
234*3b5c872aSMatthias Ringwald        __noinit_end = .;
235*3b5c872aSMatthias Ringwald    } > RAM
236*3b5c872aSMatthias Ringwald
237*3b5c872aSMatthias Ringwald    .bss :
238*3b5c872aSMatthias Ringwald    {
239*3b5c872aSMatthias Ringwald        . = ALIGN(4);
240*3b5c872aSMatthias Ringwald        __bss_start__ = .;
241*3b5c872aSMatthias Ringwald        *(.bss*)
242*3b5c872aSMatthias Ringwald        *(COMMON)
243*3b5c872aSMatthias Ringwald        . = ALIGN(4);
244*3b5c872aSMatthias Ringwald        __bss_end__ = .;
245*3b5c872aSMatthias Ringwald    } > RAM
246*3b5c872aSMatthias Ringwald
247*3b5c872aSMatthias Ringwald    .heap (NOLOAD):
248*3b5c872aSMatthias Ringwald    {
249*3b5c872aSMatthias Ringwald        . = ALIGN(8);
250*3b5c872aSMatthias Ringwald        __HeapBase = .;
251*3b5c872aSMatthias Ringwald        __end__ = .;
252*3b5c872aSMatthias Ringwald        end = __end__;
253*3b5c872aSMatthias Ringwald        KEEP(*(.heap*))
254*3b5c872aSMatthias Ringwald        __HeapLimit = .;
255*3b5c872aSMatthias Ringwald    } > RAM
256*3b5c872aSMatthias Ringwald
257*3b5c872aSMatthias Ringwald    /* Stacks are stored in this section. */
258*3b5c872aSMatthias Ringwald    .stack_dummy (NOLOAD):
259*3b5c872aSMatthias Ringwald    {
260*3b5c872aSMatthias Ringwald        . = ALIGN(8);
261*3b5c872aSMatthias Ringwald        __StackLimit = .;
262*3b5c872aSMatthias Ringwald        /* Main stack */
263*3b5c872aSMatthias Ringwald        KEEP(*(.stack))
264*3b5c872aSMatthias Ringwald        __StackTop = .;
265*3b5c872aSMatthias Ringwald        /* Thread stacks */
266*3b5c872aSMatthias Ringwald        KEEP(*(.stack*))
267*3b5c872aSMatthias Ringwald        __StackTopAll = .;
268*3b5c872aSMatthias Ringwald    } > RAM
269*3b5c872aSMatthias Ringwald
270*3b5c872aSMatthias Ringwald    PROVIDE(__stack = __StackTopAll);
271*3b5c872aSMatthias Ringwald
272*3b5c872aSMatthias Ringwald    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used
273*3b5c872aSMatthias Ringwald       at run time for things such as ThreadX memory pool allocations. */
274*3b5c872aSMatthias Ringwald    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);
275*3b5c872aSMatthias Ringwald
276*3b5c872aSMatthias Ringwald    /* Data flash. */
277*3b5c872aSMatthias Ringwald    .data_flash :
278*3b5c872aSMatthias Ringwald    {
279*3b5c872aSMatthias Ringwald        __Data_Flash_Start = .;
280*3b5c872aSMatthias Ringwald        KEEP(*(.data_flash*))
281*3b5c872aSMatthias Ringwald        __Data_Flash_End = .;
282*3b5c872aSMatthias Ringwald    } > DATA_FLASH
283*3b5c872aSMatthias Ringwald
284*3b5c872aSMatthias Ringwald    .id_code_1 :
285*3b5c872aSMatthias Ringwald    {
286*3b5c872aSMatthias Ringwald        __ID_Code_1_Start = .;
287*3b5c872aSMatthias Ringwald        KEEP(*(.id_code_1*))
288*3b5c872aSMatthias Ringwald        __ID_Code_1_End = .;
289*3b5c872aSMatthias Ringwald    } > ID_CODE_1
290*3b5c872aSMatthias Ringwald
291*3b5c872aSMatthias Ringwald    .id_code_2 :
292*3b5c872aSMatthias Ringwald    {
293*3b5c872aSMatthias Ringwald        __ID_Code_2_Start = .;
294*3b5c872aSMatthias Ringwald        KEEP(*(.id_code_2*))
295*3b5c872aSMatthias Ringwald        __ID_Code_2_End = .;
296*3b5c872aSMatthias Ringwald    } > ID_CODE_2
297*3b5c872aSMatthias Ringwald
298*3b5c872aSMatthias Ringwald    .id_code_3 :
299*3b5c872aSMatthias Ringwald    {
300*3b5c872aSMatthias Ringwald        __ID_Code_3_Start = .;
301*3b5c872aSMatthias Ringwald        KEEP(*(.id_code_3*))
302*3b5c872aSMatthias Ringwald        __ID_Code_3_End = .;
303*3b5c872aSMatthias Ringwald    } > ID_CODE_3
304*3b5c872aSMatthias Ringwald
305*3b5c872aSMatthias Ringwald    .id_code_4 :
306*3b5c872aSMatthias Ringwald    {
307*3b5c872aSMatthias Ringwald        __ID_Code_4_Start = .;
308*3b5c872aSMatthias Ringwald        KEEP(*(.id_code_4*))
309*3b5c872aSMatthias Ringwald        __ID_Code_4_End = .;
310*3b5c872aSMatthias Ringwald    } > ID_CODE_4
311*3b5c872aSMatthias Ringwald}
312