-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
\r
- bootphase1 : {\r
+ .bootphase1 : {\r
*(.startup) \r
*(.bootphase1)\r
+ \r
+ /* It seems to be impossible to flush align a section at the\r
+ end of a memory segment. Instead, we'll put the version_information\r
+ wherever the linker wants it, and then put a pointer to the start\r
+ of the version information at the end of the section.\r
+ -- Henryk Plötz <henryk@ploetzli.ch> 2009-08-28 */\r
+ \r
+ _version_information_start = ABSOLUTE(.);\r
+ *(.version_information);\r
+ \r
+ /* Why doesn't this work even though _bootphase1_version_pointer = 0x1001fc?
+ . = _bootphase1_version_pointer - ORIGIN(bootphase1); */\r
+ /* This works, apparently it fools the linker into accepting an absolute address */\r
+ . = _bootphase1_version_pointer - ORIGIN(bootphase1) + ORIGIN(bootphase1);\r
+ LONG(_version_information_start)\r
} >bootphase1\r
\r
- bootphase2 : {\r
+ .bootphase2 : {\r
__bootphase2_start__ = .;\r
*(.startphase2)\r
*(.text)\r