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