#include "config.h" ENTRY(start) #ifdef CPU_COLDFIRE OUTPUT_FORMAT(elf32-m68k) STARTUP(target/coldfire/crt0.o) #elif defined(CPU_PP) OUTPUT_FORMAT(elf32-littlearm) STARTUP(target/arm/pp/crt0-pp.o) #elif defined(CPU_ARM) OUTPUT_FORMAT(elf32-littlearm) STARTUP(target/arm/crt0.o) #else #error "Unknown CPU" #endif #if MEMORYSIZE >= 32 #define PLUGINSIZE PLUGIN_BUFFER_SIZE #else #define PLUGINSIZE 0x8000 #endif #ifdef IRIVER_H100_SERIES #define CODECSIZE CODEC_SIZE #define DRAMORIG 0x31000000 #define IRAMORIG 0x10000000 #define IRAMSIZE 0xc000 #define FLASHORIG 0x00100028 #define FLASHSIZE 0x000eff80 #else #define DRAMORIG 0x09000000 #define IRAMORIG 0x0f000000 #define IRAMSIZE 0x1000 #define FLASHORIG 0x02000000 + ROM_START #define FLASHSIZE 256K - ROM_START #endif #ifdef CODECSIZE #define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - CODECSIZE /* Where the codec buffer ends, and the plugin buffer starts */ #define ENDADDR (ENDAUDIOADDR + CODECSIZE) #else #define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE /* Where the audio buffer ends, and the plugin buffer starts */ #define ENDADDR ENDAUDIOADDR #endif /* End of the audio buffer, where the codec/plugin buffer starts */ #define ENDAUDIOADDR (DRAMORIG + DRAMSIZE) #define CODECORIG ENDAUDIOADDR MEMORY { DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE FLASH : ORIGIN = FLASHORIG, LENGTH = FLASHSIZE } SECTIONS { .flashheader : { /* place flash link address first, so the plugin can check */ LONG(FLASHORIG); /* followed by the start address, the first vector takes care of this. */ /* If we ever place the table elsewhere, put a constant here. */ } > FLASH .vectors : { _datacopy = .; } > FLASH .data : AT ( _datacopy ) { loadaddress = .; _loadaddress = .; _datastart = .; KEEP(*(.resetvectors)); KEEP(*(.vectors)); . = ALIGN(0x200); #ifdef HAVE_INIT_ATTR *(.initdata*) #endif *(.data*) . = ALIGN(0x4); _dataend = .; . = ALIGN(0x10); /* Maintain proper alignment for .text section */ } > DRAM /DISCARD/ : { *(.eh_frame) } /* TRICK ALERT! Newer versions of the linker don't allow output sections to overlap even if one of them is empty, so advance the location pointer "by hand" */ .text LOADADDR(.data) + SIZEOF(.data) : { *(.init.text) KEEP(*(.startup*)); #ifdef HAVE_INIT_ATTR /* all this symbols are set to the same address so .init copy loop will be skiped in crt0.S */ _initstart = .; _initend = .; _initcopy = .; *(.init*) #endif *(.text*) . = ALIGN(0x4); } > FLASH .rodata : { *(.rodata*) *(.rodata.str1.1) *(.rodata.str1.4) . = ALIGN(0x4); _iramcopy = .; } > FLASH .iram IRAMORIG : AT ( _iramcopy ) { _iramstart = .; *(.icode) *(.irodata) *(.idata) _iramend = .; } > IRAM .ibss (NOLOAD) : { _iedata = .; *(.ibss) . = ALIGN(0x4); _iend = .; } > IRAM .stack : { *(.stack) _stackbegin = .; stackbegin = .; . += 0x2000; _stackend = .; stackend = .; #if IRAMSIZE > 0x1000 } > IRAM #else } > DRAM #endif #ifdef CPU_COLDFIRE .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram): #else .bss : #endif { _edata = .; *(.bss*) *(COMMON) . = ALIGN(0x4); _end = .; } > DRAM .audiobuf ALIGN(4): { _audiobuffer = .; audiobuffer = .; } > DRAM #ifdef CODECSIZE .audiobufend ENDAUDIOADDR: #else .audiobufend ENDADDR: #endif { _audiobufend = .; audiobufend = .; } > DRAM #ifdef CODECSIZE .codec ENDAUDIOADDR: { codecbuf = .; _codecbuf = .; } #endif .plugin ENDADDR: { _pluginbuf = .; pluginbuf = .; } }