From 2bfed17db25367442c6ad57a76a3c998ec84889c Mon Sep 17 00:00:00 2001 From: "henryk@ploetzli.ch" Date: Thu, 27 Aug 2009 16:07:35 +0000 Subject: [PATCH] Add a common linker script with the memory map for the complete project Use the correct physical addresses in the memory map, and instead translate the addresses during postprocessing with objcopy --- armsrc/ldscript | 22 +++++++++++++++------- armsrc/ldscript-fpga | 14 ++++++++------ bootrom/ldscript-flash | 16 ++-------------- common/Makefile.common | 10 +++++++++- common/ldscript.common | 16 ++++++++++++++++ 5 files changed, 50 insertions(+), 28 deletions(-) create mode 100644 common/ldscript.common diff --git a/armsrc/ldscript b/armsrc/ldscript index 0489cfe4..81ed4edf 100644 --- a/armsrc/ldscript +++ b/armsrc/ldscript @@ -1,13 +1,21 @@ +INCLUDE ../common/ldscript.common + ENTRY(Vector) SECTIONS { - . = 0x00010000; - .start : { obj/start.o(.text) } - .text : { *(.text) } - .rodata : { *(.rodata) } - . = 0x00200000; - .data : { *(.data) } + .start : { obj/start.o(.text) } >osimage + .text : { + *(.text) + *(.text.*) + *(.glue_7) + *(.glue_7t) + } >osimage + .rodata : { + *(.rodata) + *(.rodata*) + } >osimage + .data : { *(.data) } >ram __bss_start__ = .; - .bss : { *(.bss) } + .bss : { *(.bss) } >ram __bss_end__ = .; } diff --git a/armsrc/ldscript-fpga b/armsrc/ldscript-fpga index da8b1a21..4c926bf8 100644 --- a/armsrc/ldscript-fpga +++ b/armsrc/ldscript-fpga @@ -1,11 +1,13 @@ +INCLUDE ../common/ldscript.common + SECTIONS { - . = 0x00002000; - .text : { obj/fpgaimg.o(.text) *(.text) } - .rodata : { *(.rodata) } - . = 0x00200000; - .data : { *(.data) } + fpgaimage : { + obj/fpgaimg.o(.text) *(.text) + *(.rodata) + } >fpgaimage + .data : { *(.data) } >ram __bss_start__ = .; - .bss : { *(.bss) } + .bss : { *(.bss) } >ram __bss_end__ = .; } diff --git a/bootrom/ldscript-flash b/bootrom/ldscript-flash index 55078012..50218d68 100644 --- a/bootrom/ldscript-flash +++ b/bootrom/ldscript-flash @@ -1,18 +1,6 @@ -MEMORY -{ - /* AT91SAM7S256 has 256k Flash and 64k RAM */ - /* Important note: the correct ORIGIN for bootphase1 is 0x00100000 and for bootphase2 is 0x00100200 - However, this will confuse the currently deployed flash code which expects logical and and not - physical addresses and performs no sanity checks at all. If confronted with physical addresses, - it will happily erase everything and brick the device. So for the time being pretend these addresses - to start at 0x0 while updating all the flash code with proper sanity checks, then come back later and - fix the addresses. -- Henryk Plötz 2009-08-27 */ - bootphase1 : ORIGIN = 0x00000000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */ - bootphase2 : ORIGIN = 0x00000200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */ - ram : ORIGIN = 0x00200000, LENGTH = 64K -} - +INCLUDE ../common/ldscript.common +ENTRY(flashstart) SECTIONS { . = 0; diff --git a/common/Makefile.common b/common/Makefile.common index eab96080..1c4738a1 100644 --- a/common/Makefile.common +++ b/common/Makefile.common @@ -66,8 +66,16 @@ $(ARMOBJ): $(OBJDIR)/%.o: %.c $(INCLUDES) $(ASMOBJ): $(OBJDIR)/%.o: %.s $(CC) $(CFLAGS) -mthumb-interwork -o $@ $< +# This objcopy call translates physical flash addresses to logical addresses +# See ldscript.common. -- Henryk Plötz 2009-08-27 $(OBJDIR)/%.s19: $(OBJDIR)/%.elf - $(OBJCOPY) -Osrec --srec-forceS3 $^ $@ + $(OBJCOPY) -Osrec --srec-forceS3 --no-change-warnings \ + --change-section-address bootphase1-0x100000 \ + --change-section-address bootphase2-0x100000 \ + --change-section-address fpgaimage-0x100000 \ + --change-section-address .start-0x100000 \ + --change-section-address .text-0x100000 \ + --change-section-address .rodata-0x100000 $^ $@ # Automatic dependency generation DEPENDENCY_FILES = $(patsubst %.c,$(OBJDIR)/%.d,$(notdir $(THUMBSRC))) \ diff --git a/common/ldscript.common b/common/ldscript.common new file mode 100644 index 00000000..4c4bd390 --- /dev/null +++ b/common/ldscript.common @@ -0,0 +1,16 @@ +/* AT91SAM7S256 has 256k Flash and 64k RAM */ +MEMORY +{ + /* Important note: this memory map has the correct origins for all the flash sections. + However, this will confuse the currently deployed flash code which expects logical and and not + physical addresses and performs no sanity checks at all. If confronted with physical addresses, + it will happily erase everything and brick the device. So for the time being translate these addresses + down in the objcopy call while updating all the flash code with proper sanity checks, then come + back later and fix the addresses. -- Henryk Plötz 2009-08-27 */ + bootphase1 : ORIGIN = 0x00100000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */ + bootphase2 : ORIGIN = 0x00100200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */ + fpgaimage : ORIGIN = 0x00102000, LENGTH = 64k - 0x2000 /* Place where the FPGA image will end up */ + osimage : ORIGIN = 0x00110000, LENGTH = 256K - 64k /* Place where the main OS will end up */ + ram : ORIGIN = 0x00200000, LENGTH = 64K +} + -- 2.39.2