|
|
@@ -0,0 +1,312 @@
|
|
|
+/*
|
|
|
+ * Copyright (c) 2009-2021 Arm Limited. All rights reserved.
|
|
|
+ *
|
|
|
+ * SPDX-License-Identifier: Apache-2.0
|
|
|
+ *
|
|
|
+ * Licensed under the Apache License, Version 2.0 (the License); you may
|
|
|
+ * not use this file except in compliance with the License.
|
|
|
+ * You may obtain a copy of the License at
|
|
|
+ *
|
|
|
+ * www.apache.org/licenses/LICENSE-2.0
|
|
|
+ *
|
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
|
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
|
|
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+ * See the License for the specific language governing permissions and
|
|
|
+ * limitations under the License.
|
|
|
+ */
|
|
|
+
|
|
|
+/*
|
|
|
+ *-------- <<< Use Configuration Wizard in Context Menu >>> -------------------
|
|
|
+ */
|
|
|
+
|
|
|
+/*---------------------- ITCM Configuration ----------------------------------
|
|
|
+ <h> Flash Configuration
|
|
|
+ <o0> Flash Base Address <0x0-0xFFFFFFFF:8>
|
|
|
+ <o1> Flash Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
|
+ </h>
|
|
|
+ -----------------------------------------------------------------------------*/
|
|
|
+__ROM_BASE = 0x00000000;
|
|
|
+__ROM_SIZE = 0x00080000;
|
|
|
+
|
|
|
+/*--------------------- DTCM RAM Configuration ----------------------------
|
|
|
+ <h> RAM Configuration
|
|
|
+ <o0> RAM Base Address <0x0-0xFFFFFFFF:8>
|
|
|
+ <o1> RAM Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
|
+ </h>
|
|
|
+ -----------------------------------------------------------------------------*/
|
|
|
+__RAM_BASE = 0x20000000;
|
|
|
+__RAM_SIZE = 0x00080000;
|
|
|
+
|
|
|
+/*--------------------- Embedded SRAM Configuration ----------------------------
|
|
|
+ <h> SRAM Configuration
|
|
|
+ <o0> SRAM Base Address <0x0-0xFFFFFFFF:8>
|
|
|
+ <o1> SRAM Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
|
+ </h>
|
|
|
+ -----------------------------------------------------------------------------*/
|
|
|
+__SRAM_BASE = 0x21000000;
|
|
|
+__SRAM_SIZE = 0x00200000;
|
|
|
+
|
|
|
+/*--------------------- Stack / Heap Configuration ----------------------------
|
|
|
+ <h> Stack / Heap Configuration
|
|
|
+ <o0> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
|
+ <o1> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
|
+ </h>
|
|
|
+ -----------------------------------------------------------------------------*/
|
|
|
+__STACK_SIZE = 0x00008000;
|
|
|
+__HEAP_SIZE = 0x00008000;
|
|
|
+
|
|
|
+/*--------------------- Embedded RAM Configuration ----------------------------
|
|
|
+ <h> DDR Configuration
|
|
|
+ <o0> DDR Base Address <0x0-0xFFFFFFFF:8>
|
|
|
+ <o1> DDR Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
|
|
+ </h>
|
|
|
+ -----------------------------------------------------------------------------*/
|
|
|
+__DDR_BASE = 0x60000000;
|
|
|
+__DDR_SIZE = 0x02000000;
|
|
|
+
|
|
|
+/*
|
|
|
+ *-------------------- <<< end of configuration section >>> -------------------
|
|
|
+ */
|
|
|
+
|
|
|
+MEMORY
|
|
|
+{
|
|
|
+ ITCM (rx) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE
|
|
|
+ DTCM (rwx) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE
|
|
|
+ SRAM (rwx) : ORIGIN = __SRAM_BASE, LENGTH = __SRAM_SIZE
|
|
|
+ DDR (rwx) : ORIGIN = __DDR_BASE, LENGTH = __DDR_SIZE
|
|
|
+}
|
|
|
+
|
|
|
+/* Linker script to place sections and symbol values. Should be used together
|
|
|
+ * with other linker script that defines memory regions ITCM and RAM.
|
|
|
+ * It references following symbols, which must be defined in code:
|
|
|
+ * Reset_Handler : Entry of reset handler
|
|
|
+ *
|
|
|
+ * It defines following symbols, which code can use without definition:
|
|
|
+ * __exidx_start
|
|
|
+ * __exidx_end
|
|
|
+ * __copy_table_start__
|
|
|
+ * __copy_table_end__
|
|
|
+ * __zero_table_start__
|
|
|
+ * __zero_table_end__
|
|
|
+ * __etext
|
|
|
+ * __data_start__
|
|
|
+ * __preinit_array_start
|
|
|
+ * __preinit_array_end
|
|
|
+ * __init_array_start
|
|
|
+ * __init_array_end
|
|
|
+ * __fini_array_start
|
|
|
+ * __fini_array_end
|
|
|
+ * __data_end__
|
|
|
+ * __bss_start__
|
|
|
+ * __bss_end__
|
|
|
+ * __end__
|
|
|
+ * end
|
|
|
+ * __HeapLimit
|
|
|
+ * __StackLimit
|
|
|
+ * __StackTop
|
|
|
+ * __stack
|
|
|
+ */
|
|
|
+ENTRY(Reset_Handler)
|
|
|
+
|
|
|
+SECTIONS
|
|
|
+{
|
|
|
+ .text :
|
|
|
+ {
|
|
|
+ KEEP(*(.vectors))
|
|
|
+ *(.text*)
|
|
|
+
|
|
|
+ KEEP(*(.init))
|
|
|
+ KEEP(*(.fini))
|
|
|
+
|
|
|
+ /* .ctors */
|
|
|
+ *crtbegin.o(.ctors)
|
|
|
+ *crtbegin?.o(.ctors)
|
|
|
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
|
|
|
+ *(SORT(.ctors.*))
|
|
|
+ *(.ctors)
|
|
|
+
|
|
|
+ /* .dtors */
|
|
|
+ *crtbegin.o(.dtors)
|
|
|
+ *crtbegin?.o(.dtors)
|
|
|
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
|
|
|
+ *(SORT(.dtors.*))
|
|
|
+ *(.dtors)
|
|
|
+
|
|
|
+ *(.rodata*)
|
|
|
+
|
|
|
+ KEEP(*(.eh_frame*))
|
|
|
+ } > ITCM
|
|
|
+
|
|
|
+ /*
|
|
|
+ * SG veneers:
|
|
|
+ * All SG veneers are placed in the special output section .gnu.sgstubs. Its start address
|
|
|
+ * must be set, either with the command line option �--section-start� or in a linker script,
|
|
|
+ * to indicate where to place these veneers in memory.
|
|
|
+ */
|
|
|
+/*
|
|
|
+ .gnu.sgstubs :
|
|
|
+ {
|
|
|
+ . = ALIGN(32);
|
|
|
+ } > ITCM
|
|
|
+*/
|
|
|
+ .ARM.extab :
|
|
|
+ {
|
|
|
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
|
|
|
+ } > ITCM
|
|
|
+
|
|
|
+ __exidx_start = .;
|
|
|
+ .ARM.exidx :
|
|
|
+ {
|
|
|
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
|
|
+ } > ITCM
|
|
|
+ __exidx_end = .;
|
|
|
+
|
|
|
+ .copy.table :
|
|
|
+ {
|
|
|
+ . = ALIGN(4);
|
|
|
+ __copy_table_start__ = .;
|
|
|
+ LONG (__etext)
|
|
|
+ LONG (__data_start__)
|
|
|
+ LONG (__data_end__ - __data_start__)
|
|
|
+ /* Add each additional data section here */
|
|
|
+ __copy_table_end__ = .;
|
|
|
+ } > ITCM
|
|
|
+
|
|
|
+ .zero.table :
|
|
|
+ {
|
|
|
+ . = ALIGN(4);
|
|
|
+ __zero_table_start__ = .;
|
|
|
+ /* Add each additional bss section here */
|
|
|
+/*
|
|
|
+ LONG (__bss2_start__)
|
|
|
+ LONG (__bss2_end__ - __bss2_start__)
|
|
|
+*/
|
|
|
+ __zero_table_end__ = .;
|
|
|
+ } > ITCM
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Location counter can end up 2byte aligned with narrow Thumb code but
|
|
|
+ * __etext is assumed by startup code to be the LMA of a section in DTCM
|
|
|
+ * which must be 4byte aligned
|
|
|
+ */
|
|
|
+ __etext = ALIGN (4);
|
|
|
+
|
|
|
+ .data : AT (__etext)
|
|
|
+ {
|
|
|
+ __data_start__ = .;
|
|
|
+ *(vtable)
|
|
|
+ *(.data)
|
|
|
+ *(.data.*)
|
|
|
+
|
|
|
+ . = ALIGN(4);
|
|
|
+ /* preinit data */
|
|
|
+ PROVIDE_HIDDEN (__preinit_array_start = .);
|
|
|
+ KEEP(*(.preinit_array))
|
|
|
+ PROVIDE_HIDDEN (__preinit_array_end = .);
|
|
|
+
|
|
|
+ . = ALIGN(4);
|
|
|
+ /* init data */
|
|
|
+ PROVIDE_HIDDEN (__init_array_start = .);
|
|
|
+ KEEP(*(SORT(.init_array.*)))
|
|
|
+ KEEP(*(.init_array))
|
|
|
+ PROVIDE_HIDDEN (__init_array_end = .);
|
|
|
+
|
|
|
+
|
|
|
+ . = ALIGN(4);
|
|
|
+ /* finit data */
|
|
|
+ PROVIDE_HIDDEN (__fini_array_start = .);
|
|
|
+ KEEP(*(SORT(.fini_array.*)))
|
|
|
+ KEEP(*(.fini_array))
|
|
|
+ PROVIDE_HIDDEN (__fini_array_end = .);
|
|
|
+
|
|
|
+ KEEP(*(.jcr*))
|
|
|
+ . = ALIGN(4);
|
|
|
+ /* All data end */
|
|
|
+ __data_end__ = .;
|
|
|
+
|
|
|
+ } > DTCM
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Secondary data section, optional
|
|
|
+ *
|
|
|
+ * Remember to add each additional data section
|
|
|
+ * to the .copy.table above to asure proper
|
|
|
+ * initialization during startup.
|
|
|
+ */
|
|
|
+/*
|
|
|
+ __etext2 = ALIGN (4);
|
|
|
+
|
|
|
+ .data2 : AT (__etext2)
|
|
|
+ {
|
|
|
+ . = ALIGN(4);
|
|
|
+ __data2_start__ = .;
|
|
|
+ *(.data2)
|
|
|
+ *(.data2.*)
|
|
|
+ . = ALIGN(4);
|
|
|
+ __data2_end__ = .;
|
|
|
+
|
|
|
+ } > RAM2
|
|
|
+*/
|
|
|
+
|
|
|
+ .sram :
|
|
|
+ {
|
|
|
+ . = ALIGN(16);
|
|
|
+ *(.bss.NoInit)
|
|
|
+ . = ALIGN(16);
|
|
|
+ } > SRAM AT > SRAM
|
|
|
+
|
|
|
+ .bss :
|
|
|
+ {
|
|
|
+ . = ALIGN(4);
|
|
|
+ __bss_start__ = .;
|
|
|
+ *(.bss)
|
|
|
+ *(.bss.*)
|
|
|
+ *(COMMON)
|
|
|
+ . = ALIGN(4);
|
|
|
+ __bss_end__ = .;
|
|
|
+ } > DTCM AT > DTCM
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Secondary bss section, optional
|
|
|
+ *
|
|
|
+ * Remember to add each additional bss section
|
|
|
+ * to the .zero.table above to asure proper
|
|
|
+ * initialization during startup.
|
|
|
+ */
|
|
|
+/*
|
|
|
+ .bss2 :
|
|
|
+ {
|
|
|
+ . = ALIGN(4);
|
|
|
+ __bss2_start__ = .;
|
|
|
+ *(.bss2)
|
|
|
+ *(.bss2.*)
|
|
|
+ . = ALIGN(4);
|
|
|
+ __bss2_end__ = .;
|
|
|
+ } > RAM2 AT > RAM2
|
|
|
+*/
|
|
|
+
|
|
|
+ .heap (COPY) :
|
|
|
+ {
|
|
|
+ . = ALIGN(8);
|
|
|
+ __end__ = .;
|
|
|
+ PROVIDE(end = .);
|
|
|
+ . = . + __HEAP_SIZE;
|
|
|
+ . = ALIGN(8);
|
|
|
+ __HeapLimit = .;
|
|
|
+ } > DTCM
|
|
|
+
|
|
|
+ .stack (ORIGIN(DTCM) + LENGTH(DTCM) - __STACK_SIZE) (COPY) :
|
|
|
+ {
|
|
|
+ . = ALIGN(8);
|
|
|
+ __StackLimit = .;
|
|
|
+ . = . + __STACK_SIZE;
|
|
|
+ . = ALIGN(8);
|
|
|
+ __StackTop = .;
|
|
|
+ } > DTCM
|
|
|
+ PROVIDE(__stack = __StackTop);
|
|
|
+
|
|
|
+ /* Check if data + heap + stack exceeds DTCM limit */
|
|
|
+ ASSERT(__StackLimit >= __HeapLimit, "region DTCM overflowed with stack")
|
|
|
+}
|