summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/app.lds575
-rw-r--r--firmware/target/arm/imx31/app.lds150
-rw-r--r--firmware/target/arm/ipod/app.lds160
-rw-r--r--firmware/target/arm/iriver/app.lds160
-rw-r--r--firmware/target/arm/olympus/app.lds160
-rw-r--r--firmware/target/arm/pnx0101/app.lds151
-rw-r--r--firmware/target/arm/s3c2440/app.lds147
-rw-r--r--firmware/target/arm/sandisk/app.lds160
-rw-r--r--firmware/target/arm/tcc780x/app.lds170
-rw-r--r--firmware/target/arm/tms320dm320/app.lds149
-rw-r--r--firmware/target/coldfire/iaudio/app.lds143
-rw-r--r--firmware/target/coldfire/iriver/app.lds143
-rw-r--r--firmware/target/sh/archos/app.lds145
13 files changed, 1838 insertions, 575 deletions
diff --git a/firmware/app.lds b/firmware/app.lds
deleted file mode 100644
index 5850a35fe1..0000000000
--- a/firmware/app.lds
+++ /dev/null
@@ -1,575 +0,0 @@
-#include "config.h"
-
-ENTRY(start)
-#ifdef CPU_COLDFIRE
-OUTPUT_FORMAT(elf32-m68k)
-INPUT(target/coldfire/crt0.o)
-#elif defined(CPU_ARM)
-OUTPUT_FORMAT(elf32-littlearm)
-OUTPUT_ARCH(arm)
-#ifdef CPU_PP
-INPUT(target/arm/crt0-pp.o)
-#elif CONFIG_CPU==DM320
-INPUT(target/arm/tms320dm320/crt0.o)
-#elif CONFIG_CPU==S3C2440
-INPUT(target/arm/s3c2440/crt0.o)
-#elif defined(CPU_TCC780X)
-INPUT(target/arm/tcc780x/crt0.o)
-#elif CONFIG_CPU == PNX0101
-INPUT(target/arm/pnx0101/crt0-pnx0101.o)
-#elif CONFIG_CPU == IMX31L
-INPUT(target/arm/imx31/crt0.o)
-#elif defined(CPU_ARM)
-INPUT(target/arm/crt0.o)
-#endif
-#else
-OUTPUT_FORMAT(elf32-sh)
-INPUT(target/sh/crt0.o)
-#endif
-
-#define PLUGINSIZE PLUGIN_BUFFER_SIZE
-#define CODECSIZE CODEC_SIZE
-
-#ifdef DEBUG
-#define STUBOFFSET 0x10000
-#else
-#define STUBOFFSET 0
-#endif
-
-#if CONFIG_CPU==S3C2440
-#include "s3c2440.h"
-#define DRAMSIZE (MEMORYSIZE * 0x100000) - 0x100 - PLUGINSIZE - STUBOFFSET - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
-#elif CONFIG_CPU==IMX31L
-#include "imx31l.h"
-/* Subtract 1MB for the FRAME/TTB section */
-#define DRAMSIZE (MEMORYSIZE * 0x100000 - 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
-#elif CONFIG_CPU==DM320
-#include "dm320.h"
-#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
-#else
-#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
-#endif
-
-#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300)
-#define DRAMORIG 0x31000000 + STUBOFFSET
-#define IRAMORIG 0x10000000
-#define IRAMSIZE 0xc000
-#elif defined(IAUDIO_X5) || defined(IAUDIO_M5)
-#define DRAMORIG 0x31000000 + STUBOFFSET
-#define IRAMORIG 0x10000000
-#define IRAMSIZE 0x10000
-#elif defined(CPU_PP)
-#define DRAMORIG 0x00000000 + STUBOFFSET
-#define IRAMORIG 0x40000000
-#define IRAMSIZE 0xc000
-#elif CONFIG_CPU==PNX0101
-#define DRAMORIG 0xc00000 + STUBOFFSET
-#define IRAM0ORIG 0x000000
-#define IRAM0SIZE 0x7000
-#define IRAMORIG 0x400000
-#define IRAMSIZE 0x7000
-#elif CONFIG_CPU==S3C2440
-#define DRAMORIG 0x00000100 + STUBOFFSET
-#define IRAMORIG DRAMORIG
-#define IRAM DRAM
-#define IRAMSIZE 0x1000
-#elif CONFIG_CPU==DM320
-#define DRAMORIG 0x00900000 + STUBOFFSET
-#define IRAMORIG 0x00000000
-#define IRAMSIZE 0x4000
-#elif CONFIG_CPU==IMX31L
-#define DRAMORIG (0x0 + STUBOFFSET)
-/* #define IRAMORIG 0x1FFFC000 */
-#define IRAMORIG DRAMORIG
-#define IRAM DRAM
-#define IRAMSIZE 0x4000
-#elif defined(CPU_TCC780X)
-#define DRAMORIG 0x20000000 + STUBOFFSET
-#define ITCMORIG 0x00000000
-#define ITCMSIZE 0x1000
-#define DTCMORIG 0xA0000000
-#define DTCMSIZE 0x2000
-#define SRAMORIG 0x10000000
-#define SRAMSIZE 0xc000
-#else
-#define DRAMORIG 0x09000000 + STUBOFFSET
-#define IRAMORIG 0x0f000000
-#define IRAMSIZE 0x1000
-#endif
-
-/* End of the audio buffer, where the codec buffer starts */
-#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
-
-/* Where the codec buffer ends, and the plugin buffer starts */
-#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
-
-MEMORY
-{
- DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
-#if defined(CPU_TCC780X)
- /* Seperate data & instruction TCMs plus SRAM. */
- ITCM : ORIGIN = ITCMORIG, LENGTH = ITCMSIZE
- DTCM : ORIGIN = DTCMORIG, LENGTH = DTCMSIZE
- SRAM : ORIGIN = SRAMORIG, LENGTH = SRAMSIZE
-#elif CONFIG_CPU != S3C2440 && CONFIG_CPU != IMX31L
- IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
-#endif
-#if CONFIG_CPU==PNX0101
- IRAM0 : ORIGIN = IRAM0ORIG, LENGTH = IRAM0SIZE
-#endif
-}
-
-SECTIONS
-{
-#if (CONFIG_CPU==DM320)
- .text :
- {
- loadaddress = .;
- _loadaddress = .;
- . = ALIGN(0x200);
- *(.init.text)
- *(.text*)
- *(.glue_7)
- *(.glue_7t)
- . = ALIGN(0x4);
- } > DRAM
-
- .rodata :
- {
- *(.rodata) /* problems without this, dunno why */
- *(.rodata*)
- *(.rodata.str1.1)
- *(.rodata.str1.4)
- . = ALIGN(0x4);
-
- /* Pseudo-allocate the copies of the data sections */
- _datacopy = .;
- } > DRAM
-
- /* TRICK ALERT! For RAM execution, we put the .data section at the
- same load address as the copy. Thus, we don't waste extra RAM
- when we don't actually need the copy. */
- .data : AT ( _datacopy )
- {
- _datastart = .;
- *(.data*)
- . = ALIGN(0x4);
- _dataend = .;
- } > DRAM
-
- /DISCARD/ :
- {
- *(.eh_frame)
- }
-
- .vectors IRAMORIG :
- {
- _vectorsstart = .;
- *(.vectors);
- _vectorsend = .;
- } > IRAM AT> DRAM
-
- _vectorscopy = LOADADDR(.vectors);
-
- .iram :
- {
- _iramstart = .;
- *(.icode)
- *(.irodata)
- *(.idata)
- . = ALIGN(0x4);
- _iramend = .;
- } > IRAM AT> DRAM
-
- _iramcopy = LOADADDR(.iram);
-
- .ibss (NOLOAD) :
- {
- _iedata = .;
- *(.ibss)
- . = ALIGN(0x4);
- _iend = .;
- } > IRAM
-
- .stack :
- {
- *(.stack)
- stackbegin = .;
- . += 0x2000;
- stackend = .;
- } > IRAM
-
- .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
- {
- _edata = .;
- *(.bss*)
- *(COMMON)
- . = ALIGN(0x4);
- _end = .;
- } > DRAM
-
-#elif defined(CPU_TCC780X)
- .text :
- {
- loadaddress = .;
- _loadaddress = .;
- . = ALIGN(0x200);
- *(.init.text)
- *(.text*)
- *(.glue_7)
- *(.glue_7t)
- . = ALIGN(0x4);
- } > DRAM
-
- .rodata :
- {
- *(.rodata) /* problems without this, dunno why */
- *(.rodata*)
- *(.rodata.str1.1)
- *(.rodata.str1.4)
- . = ALIGN(0x4);
-
- /* Pseudo-allocate the copies of the data sections */
- _datacopy = .;
- } > DRAM
-
- /* TRICK ALERT! For RAM execution, we put the .data section at the
- same load address as the copy. Thus, we don't waste extra RAM
- when we don't actually need the copy. */
- .data : AT ( _datacopy )
- {
- _datastart = .;
- *(.data*)
- . = ALIGN(0x4);
- _dataend = .;
- } > DRAM
-
- /DISCARD/ :
- {
- *(.eh_frame)
- }
-
- .vectors ITCMORIG :
- {
- _vectorsstart = .;
- *(.vectors);
- _vectorsend = .;
- } > ITCM AT> DRAM
-
- _vectorscopy = LOADADDR(.vectors);
-
- .itcm :
- {
- _itcmstart = .;
- _itcmend = .;
- } > ITCM AT> DRAM
-
- _itcmcopy = LOADADDR(.itcm);
-
- .dtcm :
- {
- _dtcmstart = .;
- _dtcmend = .;
- } > DTCM AT> DRAM
-
- _dtcmcopy = LOADADDR(.dtcm);
-
- .iram :
- {
- _iramstart = .;
- *(.irodata)
- *(.idata)
- *(.icode)
- . = ALIGN(0x4);
- _iramend = .;
- } > SRAM AT> DRAM
-
- _iramcopy = LOADADDR(.iram);
-
- .ibss (NOLOAD) :
- {
- _iedata = .;
- *(.ibss)
- . = ALIGN(0x4);
- _iend = .;
- } > SRAM
-
- .stack :
- {
- *(.stack)
- stackbegin = .;
- . += 0x2000;
- stackend = .;
- } > SRAM
-
- .bss :
- {
- _edata = .;
- *(.bss*)
- *(COMMON)
- . = ALIGN(0x4);
- _end = .;
- } > DRAM
-
-#elif CONFIG_CPU==S3C2440 || CONFIG_CPU == IMX31L
- .text :
- {
- loadaddress = .;
- _loadaddress = .;
- . = ALIGN(0x200);
- *(.init.text)
- *(.text*)
- *(.glue_7)
- *(.glue_7t)
- . = ALIGN(0x4);
- } > DRAM
-
- .rodata :
- {
- *(.rodata) /* problems without this, dunno why */
- *(.rodata*)
- *(.rodata.str1.1)
- *(.rodata.str1.4)
- . = ALIGN(0x4);
-
- /* Pseudo-allocate the copies of the data sections */
- _datacopy = .;
- } > DRAM
-
- /* TRICK ALERT! For RAM execution, we put the .data section at the
- same load address as the copy. Thus, we don't waste extra RAM
- when we don't actually need the copy. */
- .data : AT ( _datacopy )
- {
- _datastart = .;
- *(.data*)
- . = ALIGN(0x4);
- _dataend = .;
- } > DRAM
-
- /DISCARD/ :
- {
- *(.eh_frame)
- }
-
- .vectors 0x0 :
- {
- _vectorsstart = .;
- *(.vectors);
- _vectorsend = .;
- } AT> DRAM
-
- _vectorscopy = LOADADDR(.vectors);
-
- .iram :
- {
- _iramstart = .;
- *(.icode)
- *(.irodata)
- *(.idata)
- _iramend = .;
- } > DRAM
-
- _iramcopy = LOADADDR(.iram);
-
- .ibss (NOLOAD) :
- {
- _iedata = .;
- *(.ibss)
- . = ALIGN(0x4);
- _iend = .;
- } > DRAM
-
- .stack :
- {
- *(.stack)
- stackbegin = .;
- . += 0x2000;
- stackend = .;
- } > DRAM
-
- .bss :
- {
- _edata = .;
- *(.bss*)
- *(COMMON)
- . = ALIGN(0x4);
- _end = .;
- } > DRAM
-
-#else /* End CONFIG_CPU */
-
-#if !defined(CPU_ARM)
- .vectors :
- {
- loadaddress = .;
- _loadaddress = .;
- KEEP(*(.resetvectors));
- *(.resetvectors);
- KEEP(*(.vectors));
- *(.vectors);
- } > DRAM
-
- .text :
- {
-#else
- .text :
- {
- loadaddress = .;
- _loadaddress = .;
-#endif
- . = ALIGN(0x200);
- *(.init.text)
- *(.text*)
-#ifdef CPU_ARM
- *(.glue_7)
- *(.glue_7t)
-#endif
- . = ALIGN(0x4);
- } > DRAM
-
- .rodata :
- {
- *(.rodata) /* problems without this, dunno why */
- *(.rodata*)
- *(.rodata.str1.1)
- *(.rodata.str1.4)
- . = ALIGN(0x4);
-
- /* Pseudo-allocate the copies of the data sections */
- _datacopy = .;
- } > DRAM
-
- /* TRICK ALERT! For RAM execution, we put the .data section at the
- same load address as the copy. Thus, we don't waste extra RAM
- when we don't actually need the copy. */
- .data : AT ( _datacopy )
- {
- _datastart = .;
- *(.data*)
- . = ALIGN(0x4);
- _dataend = .;
- } > DRAM
-
- /DISCARD/ :
- {
- *(.eh_frame)
- }
-
-#if defined(CPU_ARM)
- .vectors 0x0 :
- {
- _vectorsstart = .;
- *(.vectors);
- _vectorsend = .;
-#if CONFIG_CPU==PNX0101
- *(.dmabuf)
- } >IRAM0 AT> DRAM
-#else
- } AT> DRAM
-#endif
-
- _vectorscopy = LOADADDR(.vectors);
-#endif
-
-#if CONFIG_CPU==PNX0101
- .iram IRAMORIG + SIZEOF(.vectors) :
-#else
- .iram IRAMORIG :
-#endif
- {
- _iramstart = .;
- *(.icode)
- *(.irodata)
- *(.idata)
- _iramend = .;
- } > IRAM AT> DRAM
-
- _iramcopy = LOADADDR(.iram);
-
- .ibss (NOLOAD) :
- {
- _iedata = .;
- *(.ibss)
- . = ALIGN(0x4);
- _iend = .;
- } > IRAM
-
-#if defined(CPU_COLDFIRE) || defined(CPU_ARM)
-#ifdef CPU_PP
- .idle_stacks :
- {
- *(.idle_stacks)
-#if NUM_CORES > 1
- cpu_idlestackbegin = .;
- . += IDLE_STACK_SIZE;
- cpu_idlestackend = .;
-#endif
- cop_idlestackbegin = .;
- . += IDLE_STACK_SIZE;
- cop_idlestackend = .;
- } > IRAM
-#endif
-
- .stack :
- {
- *(.stack)
- stackbegin = .;
- . += 0x2000;
- stackend = .;
- } > IRAM
-
-#else
- /* TRICK ALERT! We want 0x2000 bytes of stack, but we set the section
- size smaller, and allow the stack to grow into the .iram copy */
- .stack ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram):
- {
- *(.stack)
- _stackbegin = . - SIZEOF(.iram);
- . += 0x2000 - SIZEOF(.iram);
- _stackend = .;
- } > DRAM
-#endif
-
-#if defined(CPU_COLDFIRE)
- .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram):
-#elif defined(CPU_ARM)
- .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
-#else
- .bss :
-#endif
- {
- _edata = .;
- *(.bss*)
- *(COMMON)
- . = ALIGN(0x4);
- _end = .;
- } > DRAM
-
-#endif
-
- .audiobuf ALIGN(4) :
- {
- _audiobuffer = .;
- audiobuffer = .;
- } > DRAM
-
- .audiobufend ENDAUDIOADDR:
- {
- audiobufend = .;
- _audiobufend = .;
- } > DRAM
-
- .codec ENDAUDIOADDR:
- {
- codecbuf = .;
- _codecbuf = .;
- }
-
- .plugin ENDADDR:
- {
- _pluginbuf = .;
- pluginbuf = .;
- }
-}
-
diff --git a/firmware/target/arm/imx31/app.lds b/firmware/target/arm/imx31/app.lds
new file mode 100644
index 0000000000..fda508dc50
--- /dev/null
+++ b/firmware/target/arm/imx31/app.lds
@@ -0,0 +1,150 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/imx31/crt0.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#include "imx31l.h"
+/* Subtract 1MB for the FRAME/TTB section */
+#define DRAMSIZE (MEMORYSIZE * 0x100000 - 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG (0x0 + STUBOFFSET)
+/* #define IRAMORIG 0x1FFFC000 */
+#define IRAMORIG DRAMORIG
+#define IRAM DRAM
+#define IRAMSIZE 0x4000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > DRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > DRAM
+
+ .bss :
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/arm/ipod/app.lds b/firmware/target/arm/ipod/app.lds
new file mode 100644
index 0000000000..765a5f0389
--- /dev/null
+++ b/firmware/target/arm/ipod/app.lds
@@ -0,0 +1,160 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/crt0-pp.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x00000000 + STUBOFFSET
+#define IRAMORIG 0x40000000
+#define IRAMSIZE 0xc000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram IRAMORIG :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .idle_stacks :
+ {
+ *(.idle_stacks)
+#if NUM_CORES > 1
+ cpu_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cpu_idlestackend = .;
+#endif
+ cop_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cop_idlestackend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/arm/iriver/app.lds b/firmware/target/arm/iriver/app.lds
new file mode 100644
index 0000000000..765a5f0389
--- /dev/null
+++ b/firmware/target/arm/iriver/app.lds
@@ -0,0 +1,160 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/crt0-pp.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x00000000 + STUBOFFSET
+#define IRAMORIG 0x40000000
+#define IRAMSIZE 0xc000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram IRAMORIG :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .idle_stacks :
+ {
+ *(.idle_stacks)
+#if NUM_CORES > 1
+ cpu_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cpu_idlestackend = .;
+#endif
+ cop_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cop_idlestackend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/arm/olympus/app.lds b/firmware/target/arm/olympus/app.lds
new file mode 100644
index 0000000000..765a5f0389
--- /dev/null
+++ b/firmware/target/arm/olympus/app.lds
@@ -0,0 +1,160 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/crt0-pp.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x00000000 + STUBOFFSET
+#define IRAMORIG 0x40000000
+#define IRAMSIZE 0xc000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram IRAMORIG :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .idle_stacks :
+ {
+ *(.idle_stacks)
+#if NUM_CORES > 1
+ cpu_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cpu_idlestackend = .;
+#endif
+ cop_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cop_idlestackend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/arm/pnx0101/app.lds b/firmware/target/arm/pnx0101/app.lds
new file mode 100644
index 0000000000..28ca53736d
--- /dev/null
+++ b/firmware/target/arm/pnx0101/app.lds
@@ -0,0 +1,151 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/pnx0101/crt0-pnx0101.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0xc00000 + STUBOFFSET
+#define IRAM0ORIG 0x000000
+#define IRAM0SIZE 0x7000
+#define IRAMORIG 0x400000
+#define IRAMSIZE 0x7000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+ IRAM0 : ORIGIN = IRAM0ORIG, LENGTH = IRAM0SIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ *(.dmabuf)
+ } >IRAM0 AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram IRAMORIG + SIZEOF(.vectors) :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/arm/s3c2440/app.lds b/firmware/target/arm/s3c2440/app.lds
new file mode 100644
index 0000000000..3528ed86bf
--- /dev/null
+++ b/firmware/target/arm/s3c2440/app.lds
@@ -0,0 +1,147 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/s3c2440/crt0.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#include "cpu.h"
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - 0x100 - STUBOFFSET - PLUGINSIZE - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
+
+#define DRAMORIG 0x00000100 + STUBOFFSET
+#define IRAMORIG DRAMORIG
+#define IRAM DRAM
+#define IRAMSIZE 0x1000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > DRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > DRAM
+
+ .bss :
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
diff --git a/firmware/target/arm/sandisk/app.lds b/firmware/target/arm/sandisk/app.lds
new file mode 100644
index 0000000000..765a5f0389
--- /dev/null
+++ b/firmware/target/arm/sandisk/app.lds
@@ -0,0 +1,160 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/crt0-pp.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x00000000 + STUBOFFSET
+#define IRAMORIG 0x40000000
+#define IRAMSIZE 0xc000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors 0x0 :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram IRAMORIG :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .idle_stacks :
+ {
+ *(.idle_stacks)
+#if NUM_CORES > 1
+ cpu_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cpu_idlestackend = .;
+#endif
+ cop_idlestackbegin = .;
+ . += IDLE_STACK_SIZE;
+ cop_idlestackend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/arm/tcc780x/app.lds b/firmware/target/arm/tcc780x/app.lds
new file mode 100644
index 0000000000..069dd24b9c
--- /dev/null
+++ b/firmware/target/arm/tcc780x/app.lds
@@ -0,0 +1,170 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/tcc780x/crt0.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x20000000 + STUBOFFSET
+#define ITCMORIG 0x00000000
+#define ITCMSIZE 0x1000
+#define DTCMORIG 0xA0000000
+#define DTCMSIZE 0x2000
+#define SRAMORIG 0x10000000
+#define SRAMSIZE 0xc000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ /* Seperate data & instruction TCMs plus SRAM. */
+ ITCM : ORIGIN = ITCMORIG, LENGTH = ITCMSIZE
+ DTCM : ORIGIN = DTCMORIG, LENGTH = DTCMSIZE
+ SRAM : ORIGIN = SRAMORIG, LENGTH = SRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors ITCMORIG :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } > ITCM AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .itcm :
+ {
+ _itcmstart = .;
+ _itcmend = .;
+ } > ITCM AT> DRAM
+
+ _itcmcopy = LOADADDR(.itcm);
+
+ .dtcm :
+ {
+ _dtcmstart = .;
+ _dtcmend = .;
+ } > DTCM AT> DRAM
+
+ _dtcmcopy = LOADADDR(.dtcm);
+
+ .iram :
+ {
+ _iramstart = .;
+ *(.irodata)
+ *(.idata)
+ *(.icode)
+ . = ALIGN(0x4);
+ _iramend = .;
+ } > SRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > SRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > SRAM
+
+ .bss :
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
diff --git a/firmware/target/arm/tms320dm320/app.lds b/firmware/target/arm/tms320dm320/app.lds
new file mode 100644
index 0000000000..289e1bb218
--- /dev/null
+++ b/firmware/target/arm/tms320dm320/app.lds
@@ -0,0 +1,149 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-littlearm)
+OUTPUT_ARCH(arm)
+INPUT(target/arm/tms320dm320/crt0.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#include "cpu.h"
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - STUBOFFSET - PLUGINSIZE - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
+
+#define DRAMORIG 0x00900000 + STUBOFFSET
+#define IRAMORIG 0x00000000
+#define IRAMSIZE 0x4000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .text :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .vectors IRAMORIG :
+ {
+ _vectorsstart = .;
+ *(.vectors);
+ _vectorsend = .;
+ } > IRAM AT> DRAM
+
+ _vectorscopy = LOADADDR(.vectors);
+
+ .iram :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ . = ALIGN(0x4);
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/coldfire/iaudio/app.lds b/firmware/target/coldfire/iaudio/app.lds
new file mode 100644
index 0000000000..f7d8e975da
--- /dev/null
+++ b/firmware/target/coldfire/iaudio/app.lds
@@ -0,0 +1,143 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-m68k)
+INPUT(target/coldfire/crt0.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x31000000 + STUBOFFSET
+#define IRAMORIG 0x10000000
+#define IRAMSIZE 0x10000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .vectors :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ KEEP(*(.resetvectors));
+ *(.resetvectors);
+ KEEP(*(.vectors));
+ *(.vectors);
+ } > DRAM
+
+ .text :
+ {
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .iram IRAMORIG :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/coldfire/iriver/app.lds b/firmware/target/coldfire/iriver/app.lds
new file mode 100644
index 0000000000..3e4c81fe51
--- /dev/null
+++ b/firmware/target/coldfire/iriver/app.lds
@@ -0,0 +1,143 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-m68k)
+INPUT(target/coldfire/crt0.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x31000000 + STUBOFFSET
+#define IRAMORIG 0x10000000
+#define IRAMSIZE 0xc000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .vectors :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ KEEP(*(.resetvectors));
+ *(.resetvectors);
+ KEEP(*(.vectors));
+ *(.vectors);
+ } > DRAM
+
+ .text :
+ {
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .iram IRAMORIG :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ .stack :
+ {
+ *(.stack)
+ stackbegin = .;
+ . += 0x2000;
+ stackend = .;
+ } > IRAM
+
+ .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram):
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+
diff --git a/firmware/target/sh/archos/app.lds b/firmware/target/sh/archos/app.lds
new file mode 100644
index 0000000000..94cb437706
--- /dev/null
+++ b/firmware/target/sh/archos/app.lds
@@ -0,0 +1,145 @@
+#include "config.h"
+
+ENTRY(start)
+
+OUTPUT_FORMAT(elf32-sh)
+INPUT(target/sh/crt0.o)
+
+#define PLUGINSIZE PLUGIN_BUFFER_SIZE
+#define CODECSIZE CODEC_SIZE
+
+#ifdef DEBUG
+#define STUBOFFSET 0x10000
+#else
+#define STUBOFFSET 0
+#endif
+
+#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
+
+#define DRAMORIG 0x09000000 + STUBOFFSET
+#define IRAMORIG 0x0f000000
+#define IRAMSIZE 0x1000
+
+/* End of the audio buffer, where the codec buffer starts */
+#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
+
+/* Where the codec buffer ends, and the plugin buffer starts */
+#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
+
+MEMORY
+{
+ DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
+ IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
+}
+
+SECTIONS
+{
+ .vectors :
+ {
+ loadaddress = .;
+ _loadaddress = .;
+ KEEP(*(.resetvectors));
+ *(.resetvectors);
+ KEEP(*(.vectors));
+ *(.vectors);
+ } > DRAM
+
+ .text :
+ {
+ . = ALIGN(0x200);
+ *(.init.text)
+ *(.text*)
+ . = ALIGN(0x4);
+ } > DRAM
+
+ .rodata :
+ {
+ *(.rodata) /* problems without this, dunno why */
+ *(.rodata*)
+ *(.rodata.str1.1)
+ *(.rodata.str1.4)
+ . = ALIGN(0x4);
+
+ /* Pseudo-allocate the copies of the data sections */
+ _datacopy = .;
+ } > DRAM
+
+ /* TRICK ALERT! For RAM execution, we put the .data section at the
+ same load address as the copy. Thus, we don't waste extra RAM
+ when we don't actually need the copy. */
+ .data : AT ( _datacopy )
+ {
+ _datastart = .;
+ *(.data*)
+ . = ALIGN(0x4);
+ _dataend = .;
+ } > DRAM
+
+ /DISCARD/ :
+ {
+ *(.eh_frame)
+ }
+
+ .iram IRAMORIG :
+ {
+ _iramstart = .;
+ *(.icode)
+ *(.irodata)
+ *(.idata)
+ _iramend = .;
+ } > IRAM AT> DRAM
+
+ _iramcopy = LOADADDR(.iram);
+
+ .ibss (NOLOAD) :
+ {
+ _iedata = .;
+ *(.ibss)
+ . = ALIGN(0x4);
+ _iend = .;
+ } > IRAM
+
+ /* TRICK ALERT! We want 0x2000 bytes of stack, but we set the section
+ size smaller, and allow the stack to grow into the .iram copy */
+ .stack ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram):
+ {
+ *(.stack)
+ _stackbegin = . - SIZEOF(.iram);
+ . += 0x2000 - SIZEOF(.iram);
+ _stackend = .;
+ } > DRAM
+
+ .bss :
+ {
+ _edata = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(0x4);
+ _end = .;
+ } > DRAM
+
+ .audiobuf ALIGN(4) :
+ {
+ _audiobuffer = .;
+ audiobuffer = .;
+ } > DRAM
+
+ .audiobufend ENDAUDIOADDR:
+ {
+ audiobufend = .;
+ _audiobufend = .;
+ } > DRAM
+
+ .codec ENDAUDIOADDR:
+ {
+ codecbuf = .;
+ _codecbuf = .;
+ }
+
+ .plugin ENDADDR:
+ {
+ _pluginbuf = .;
+ pluginbuf = .;
+ }
+}
+