Use the correct physical addresses in the memory map, and instead translate the addresses during postprocessing with objcopy
+INCLUDE ../common/ldscript.common\r
+\r
ENTRY(Vector)\r
SECTIONS\r
{\r
- . = 0x00010000;\r
- .start : { obj/start.o(.text) }\r
- .text : { *(.text) }\r
- .rodata : { *(.rodata) }\r
- . = 0x00200000;\r
- .data : { *(.data) }\r
+ .start : { obj/start.o(.text) } >osimage\r
+ .text : { \r
+ *(.text)\r
+ *(.text.*)\r
+ *(.glue_7)\r
+ *(.glue_7t)\r
+ } >osimage\r
+ .rodata : { \r
+ *(.rodata) \r
+ *(.rodata*) \r
+ } >osimage\r
+ .data : { *(.data) } >ram\r
__bss_start__ = .;\r
- .bss : { *(.bss) }\r
+ .bss : { *(.bss) } >ram\r
__bss_end__ = .;\r
}\r
+INCLUDE ../common/ldscript.common\r
+\r
SECTIONS\r
{\r
- . = 0x00002000;\r
- .text : { obj/fpgaimg.o(.text) *(.text) }\r
- .rodata : { *(.rodata) }\r
- . = 0x00200000;\r
- .data : { *(.data) }\r
+ fpgaimage : { \r
+ obj/fpgaimg.o(.text) *(.text) \r
+ *(.rodata) \r
+ } >fpgaimage\r
+ .data : { *(.data) } >ram\r
__bss_start__ = .;\r
- .bss : { *(.bss) }\r
+ .bss : { *(.bss) } >ram\r
__bss_end__ = .;\r
}\r
-MEMORY \r
-{\r
- /* AT91SAM7S256 has 256k Flash and 64k RAM */\r
- /* Important note: the correct ORIGIN for bootphase1 is 0x00100000 and for bootphase2 is 0x00100200\r
- However, this will confuse the currently deployed flash code which expects logical and and not\r
- physical addresses and performs no sanity checks at all. If confronted with physical addresses, \r
- it will happily erase everything and brick the device. So for the time being pretend these addresses\r
- to start at 0x0 while updating all the flash code with proper sanity checks, then come back later and\r
- fix the addresses. -- Henryk Plötz <henryk@ploetzli.ch> 2009-08-27 */\r
- bootphase1 : ORIGIN = 0x00000000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */\r
- bootphase2 : ORIGIN = 0x00000200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */\r
- ram : ORIGIN = 0x00200000, LENGTH = 64K\r
-}\r
-\r
+INCLUDE ../common/ldscript.common\r
\r
+ENTRY(flashstart)\r
SECTIONS\r
{\r
. = 0;\r
$(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 <henryk@ploetzli.ch> 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))) \
--- /dev/null
+/* 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 <henryk@ploetzli.ch> 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
+}
+