summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/nds/coproc
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-04-16 18:37:33 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-04-16 18:37:33 +0000
commit311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a (patch)
tree47eaf22ca7bb8cc68486ffe964abd54b535902ad /c/src/lib/libbsp/arm/nds/coproc
parent2008-04-16 Matthieu Bucchianeri <mbucchia@gmail.com> (diff)
downloadrtems-311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a.tar.bz2
2008-04-16 Matthieu Bucchianeri <mbucchia@gmail.com>
* ChangeLog, Makefile.am, README, bsp_specs, configure.ac, mk_libnds.sh, patch.libnds, preinstall.am, block/block.c, clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c, coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile, dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c, dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile, dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h, dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h, dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c, dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c, dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c, dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c, dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c, dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c, dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c, dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c, dswifi/arm9/source/sgIP_memblock.h, dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h, dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h, dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h, dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h, dswifi/include/dswifi7.h, dswifi/include/dswifi9.h, dswifi/include/dswifi_version.h, dswifi/include/netdb.h, dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c, fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h, include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h, libfat/gba/include/fat.h, libfat/include/fat.h, libfat/nds/include/fat.h, libfat/source/bit_ops.h, libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h, libfat/source/directory.c, libfat/source/directory.h, libfat/source/fatdir.c, libfat/source/fatdir.h, libfat/source/fatfile.c, libfat/source/fatfile.h, libfat/source/file_allocation_table.c, libfat/source/file_allocation_table.h, libfat/source/filetime.c, libfat/source/filetime.h, libfat/source/libfat.c, libfat/source/mem_allocate.h, libfat/source/partition.c, libfat/source/partition.h, libfat/source/disc_io/disc.c, libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h, libfat/source/disc_io/io_cf_common.c, libfat/source/disc_io/io_cf_common.h, libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s, libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h, libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h, libfat/source/disc_io/io_m3_common.c, libfat/source/disc_io/io_m3_common.h, libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h, libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h, libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h, libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h, libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h, libfat/source/disc_io/io_sc_common.c, libfat/source/disc_io/io_sc_common.h, libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h, libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h, libfat/source/disc_io/io_scsd_s.s, libfat/source/disc_io/io_sd_common.c, libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7, libnds/Makefile.arm9, libnds/libnds_license.txt, libnds/basicARM7/source/defaultARM7.c, libnds/include/default_font_bin.h, libnds/include/gbfs.h, libnds/include/nds.h, libnds/include/nds/bios.h, libnds/include/nds/card.h, libnds/include/nds/dma.h, libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h, libnds/include/nds/jtypes.h, libnds/include/nds/memory.h, libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h, libnds/include/nds/system.h, libnds/include/nds/timers.h, libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h, libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h, libnds/include/nds/arm9/background.h, libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h, libnds/include/nds/arm9/console.h, libnds/include/nds/arm9/exceptions.h, libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h, libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h, libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h, libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h, libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h, libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h, libnds/source/arm7/audio.c, libnds/source/arm7/clock.c, libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c, libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c, libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s, libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s, libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s, libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c, libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin, libnds/source/arm9/default_font.s, libnds/source/arm9/exceptionHandler.S, libnds/source/arm9/exceptionHandler.s, libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c, libnds/source/arm9/icache.s, libnds/source/arm9/image.c, libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c, libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c, libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c, libnds/source/arm9/system.c, libnds/source/arm9/touch.c, libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c, libnds/source/common/biosCalls.s, libnds/source/common/card.c, libnds/source/common/gbfs.c, libnds/source/common/interruptDispatcher.s, libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c, sound/sound.h, start/start.S, startup/linkcmds, startup/start.c, timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c, tools/configure.ac, tools/runtest, tools/ndstool/include/arm7_sha1_homebrew.h, tools/ndstool/include/arm7_sha1_nintendo.h, tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h, tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h, tools/ndstool/include/encryption.h, tools/ndstool/include/header.h, tools/ndstool/include/hook.h, tools/ndstool/include/little.h, tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h, tools/ndstool/include/ndscreate.h, tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h, tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h, tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h, tools/ndstool/include/passme_vhd1.h, tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h, tools/ndstool/include/sha1.h, tools/ndstool/include/types.h, tools/ndstool/source/arm7_sha1_homebrew.c, tools/ndstool/source/arm7_sha1_nintendo.c, tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp, tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp, tools/ndstool/source/default_icon.c, tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp, tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c, tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp, tools/ndstool/source/ndscreate.cpp, tools/ndstool/source/ndsextract.cpp, tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp, tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c, tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp, touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c, touchscreen/reco.h, touchscreen/touchscreen.c, touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c: New files.
Diffstat (limited to 'c/src/lib/libbsp/arm/nds/coproc')
-rw-r--r--c/src/lib/libbsp/arm/nds/coproc/coproc.S112
-rw-r--r--c/src/lib/libbsp/arm/nds/coproc/coproc.c207
-rw-r--r--c/src/lib/libbsp/arm/nds/coproc/coproc.ld195
3 files changed, 514 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/nds/coproc/coproc.S b/c/src/lib/libbsp/arm/nds/coproc/coproc.S
new file mode 100644
index 0000000000..f1bc2bac61
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/coproc/coproc.S
@@ -0,0 +1,112 @@
+@---------------------------------------------------------------------------------
+ .section ".init"
+ .global _start
+ .global _init
+@---------------------------------------------------------------------------------
+ .align 4
+ .arm
+@---------------------------------------------------------------------------------
+_start:
+@---------------------------------------------------------------------------------
+ mov r0, #0x04000000 @ IME = 0;
+ str r0, [r0, #0x208]
+
+ mov r0, #0x12 @ Switch to IRQ Mode
+ msr cpsr, r0
+ ldr sp, =__sp_irq @ Set IRQ stack
+
+ mov r0, #0x13 @ Switch to SVC Mode
+ msr cpsr, r0
+ ldr sp, =__sp_svc @ Set SVC stack
+
+ mov r0, #0x1F @ Switch to System Mode
+ msr cpsr, r0
+ ldr sp, =__sp_usr @ Set user stack
+
+ ldr r0, =__bss_start @ Clear BSS section to 0x00
+ ldr r1, =__bss_end
+ sub r1, r1, r0
+ bl ClearMem
+
+ ldr r3, =__libc_init_array @ global constructors
+ bl _call_via_r3
+
+ mov r0, #0 @ int argc
+ mov r1, #0 @ char *argv[]
+ ldr r3, =main
+ bl _call_via_r3 @ jump to user code
+
+ @ If the user ever returns, return to flash cartridge
+ mov r0, #0x08000000
+ bx r0
+
+@---------------------------------------------------------------------------------
+@ Clear memory to 0x00 if length != 0
+@ r0 = Start Address
+@ r1 = Length
+@---------------------------------------------------------------------------------
+ClearMem:
+@---------------------------------------------------------------------------------
+ mov r2, #3 @ Round down to nearest word boundary
+ add r1, r1, r2 @ Shouldn't be needed
+ bics r1, r1, r2 @ Clear 2 LSB (and set Z)
+ bxeq lr @ Quit if copy size is 0
+
+ mov r2, #0
+ClrLoop:
+ stmia r0!, {r2}
+ subs r1, r1, #4
+ bne ClrLoop
+ bx lr
+
+@---------------------------------------------------------------------------------
+@ Copy memory if length != 0
+@ r1 = Source Address
+@ r2 = Dest Address
+@ r4 = Dest Address + Length
+@---------------------------------------------------------------------------------
+CopyMemCheck:
+@---------------------------------------------------------------------------------
+ sub r3, r4, r2 @ Is there any data to copy?
+@---------------------------------------------------------------------------------
+@ Copy memory
+@ r1 = Source Address
+@ r2 = Dest Address
+@ r3 = Length
+@---------------------------------------------------------------------------------
+CopyMem:
+@---------------------------------------------------------------------------------
+ mov r0, #3 @ These commands are used in cases where
+ add r3, r3, r0 @ the length is not a multiple of 4,
+ bics r3, r3, r0 @ even though it should be.
+ bxeq lr @ Length is zero, so exit
+CIDLoop:
+ ldmia r1!, {r0}
+ stmia r2!, {r0}
+ subs r3, r3, #4
+ bne CIDLoop
+ bx lr
+
+_init:
+ bx lr
+
+@---------------------------------------------------------------------------------
+ .align
+@ .pool
+@ .end
+@---------------------------------------------------------------------------------
+
+@---------------------------------------------------------------------------------
+ .section ".fini"
+ .global _fini
+@---------------------------------------------------------------------------------
+ .align 4
+ .arm
+@---------------------------------------------------------------------------------
+_fini:
+ bx lr
+@---------------------------------------------------------------------------------
+ .align
+ .pool
+ .end
+@---------------------------------------------------------------------------------
diff --git a/c/src/lib/libbsp/arm/nds/coproc/coproc.c b/c/src/lib/libbsp/arm/nds/coproc/coproc.c
new file mode 100644
index 0000000000..a2456be156
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/coproc/coproc.c
@@ -0,0 +1,207 @@
+/*---------------------------------------------------------------------------------
+
+ default ARM7 core
+
+ Copyright (C) 2005
+ Michael Noland (joat)
+ Jason Rogers (dovoto)
+ Dave Murphy (WinterMute)
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+ must not claim that you wrote the original software. If you use
+ this software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+---------------------------------------------------------------------------------*/
+#include <nds.h>
+#include "../include/my_ipc.h"
+
+#ifdef ENABLE_WIFI
+#include <dswifi7.h>
+#endif
+
+//---------------------------------------------------------------------------------
+void startSound(int sampleRate, const void* data, u32 bytes, u8 channel, u8 vol, u8 pan, u8 format) {
+//---------------------------------------------------------------------------------
+ SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate);
+ SCHANNEL_SOURCE(channel) = (u32)data;
+ SCHANNEL_LENGTH(channel) = bytes >> 2 ;
+ SCHANNEL_CR(channel) = SCHANNEL_ENABLE | SOUND_ONE_SHOT | SOUND_VOL(vol) | SOUND_PAN(pan) | (format==1?SOUND_8BIT:SOUND_16BIT);
+}
+
+//---------------------------------------------------------------------------------
+s32 getFreeSoundChannel() {
+//---------------------------------------------------------------------------------
+ int i;
+ for (i=0; i<16; i++) {
+ if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 ) return i;
+ }
+ return -1;
+}
+
+
+touchPosition first,tempPos;
+
+//---------------------------------------------------------------------------------
+void VcountHandler() {
+//---------------------------------------------------------------------------------
+ static int lastbut = -1;
+
+ uint16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0;
+
+ but = REG_KEYXY;
+
+ if (!( (but ^ lastbut) & (1<<6))) {
+
+ tempPos = touchReadXY();
+
+ if ( tempPos.x == 0 || tempPos.y == 0 ) {
+ but |= (1 <<6);
+ lastbut = but;
+ } else {
+ x = tempPos.x;
+ y = tempPos.y;
+ xpx = tempPos.px;
+ ypx = tempPos.py;
+ z1 = tempPos.z1;
+ z2 = tempPos.z2;
+ }
+
+ } else {
+ lastbut = but;
+ but |= (1 <<6);
+ }
+ IPC->touchX = x;
+ IPC->touchY = y;
+ IPC->touchXpx = xpx;
+ IPC->touchYpx = ypx;
+ IPC->touchZ1 = z1;
+ IPC->touchZ2 = z2;
+ IPC->buttons = but;
+
+}
+
+//---------------------------------------------------------------------------------
+void VblankHandler(void) {
+//---------------------------------------------------------------------------------
+ static u8 is_recording = 0;
+ u32 i;
+
+ //sound code :)
+ TransferSound *snd = IPC->soundData;
+ IPC->soundData = 0;
+
+ if (0 != snd) {
+
+ for (i=0; i<snd->count; i++) {
+ s32 chan = getFreeSoundChannel();
+
+ if (chan >= 0) {
+ startSound(snd->data[i].rate, snd->data[i].data, snd->data[i].len, chan, snd->data[i].vol, snd->data[i].pan, snd->data[i].format);
+ }
+ }
+ }
+
+ // microphone code
+ if (!is_recording && my_IPC->record)
+ {
+ StartRecording(my_IPC->record_buffer, my_IPC->record_length_max);
+ is_recording = 1;
+ }
+
+ if (is_recording && !my_IPC->record)
+ {
+ my_IPC->recorded_length = 1 + StopRecording();
+ is_recording = 0;
+ }
+
+#ifdef ENABLE_WIFI
+ Wifi_Update(); // update wireless in vblank
+#endif
+}
+
+#ifdef ENABLE_WIFI
+// callback to allow wifi library to notify arm9
+void arm7_synctoarm9() { // send fifo message
+ REG_IPC_FIFO_TX = 0x87654321;
+}
+// interrupt handler to allow incoming notifications from arm9
+void arm7_fifo() { // check incoming fifo messages
+ u32 msg = REG_IPC_FIFO_RX;
+ if(msg==0x87654321) Wifi_Sync();
+}
+#endif
+
+//---------------------------------------------------------------------------------
+int main(int argc, char ** argv) {
+//---------------------------------------------------------------------------------
+#ifdef ENABLE_WIFI
+ REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; // enable & prepare
+ // fifo asap
+#endif
+
+ // read User Settings from firmware
+ readUserSettings();
+
+ //enable sound
+ powerON(POWER_SOUND);
+ writePowerManagement(PM_CONTROL_REG, ( readPowerManagement(PM_CONTROL_REG) & ~PM_SOUND_MUTE ) | PM_SOUND_AMP );
+ SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F);
+
+ irqInit();
+
+ // Start the RTC tracking IRQ
+ initClockIRQ();
+
+ SetYtrigger(80);
+ irqSet(IRQ_VCOUNT, VcountHandler);
+ irqSet(IRQ_VBLANK, VblankHandler);
+ irqSet(IRQ_TIMER0, ProcessMicrophoneTimerIRQ);
+
+ irqEnable(IRQ_VBLANK | IRQ_VCOUNT | IRQ_TIMER0);
+
+#ifdef ENABLE_WIFI
+ irqSet(IRQ_WIFI, Wifi_Interrupt); // set up wifi interrupt
+ irqEnable(IRQ_WIFI);
+
+ // sync with arm9 and init wifi
+ u32 fifo_temp;
+
+ while (1)
+ { // wait for magic number
+ while (REG_IPC_FIFO_CR & IPC_FIFO_RECV_EMPTY)
+ swiWaitForVBlank();
+ fifo_temp = REG_IPC_FIFO_RX;
+ if (fifo_temp == 0x12345678)
+ break;
+ }
+ while (REG_IPC_FIFO_CR & IPC_FIFO_RECV_EMPTY)
+ swiWaitForVBlank();
+ fifo_temp = REG_IPC_FIFO_RX;
+ Wifi_Init(fifo_temp);
+
+ irqSet(IRQ_FIFO_NOT_EMPTY,arm7_fifo); // set up fifo irq
+ irqEnable(IRQ_FIFO_NOT_EMPTY);
+ REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ;
+
+ Wifi_SetSyncHandler(arm7_synctoarm9); // allow wifi lib to notify arm9
+#endif
+ // Keep the ARM7 mostly idle
+ while (1) {
+ swiWaitForVBlank();
+ }
+}
+
+
diff --git a/c/src/lib/libbsp/arm/nds/coproc/coproc.ld b/c/src/lib/libbsp/arm/nds/coproc/coproc.ld
new file mode 100644
index 0000000000..deb2fe4343
--- /dev/null
+++ b/c/src/lib/libbsp/arm/nds/coproc/coproc.ld
@@ -0,0 +1,195 @@
+OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+
+MEMORY {
+
+ rom : ORIGIN = 0x08000000, LENGTH = 32M
+ iwram : ORIGIN = 0x037f8000, LENGTH = 96K
+}
+
+__iwram_start = ORIGIN(iwram);
+__iwram_top = ORIGIN(iwram)+ LENGTH(iwram);
+__sp_irq = __iwram_top - 0x60;
+__sp_svc = __sp_irq - 0x100;
+__sp_usr = __sp_svc - 0x100;
+
+__irq_flags = __iwram_top - 8;
+__irq_vector = __iwram_top - 4;
+
+SECTIONS
+{
+ .init :
+ {
+ __text_start = . ;
+ KEEP (*(.init))
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram = 0xff
+ .plt : { *(.plt) } >iwram = 0xff
+
+ .text : /* ALIGN (4): */
+ {
+
+ *(.text*)
+ *(.stub)
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.gnu.linkonce.t*)
+ *(.glue_7)
+ *(.glue_7t)
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram = 0xff
+
+ .fini :
+ {
+ KEEP (*(.fini))
+ } >iwram =0xff
+
+ __text_end = . ;
+
+ .rodata :
+ {
+ *(.rodata)
+ *all.rodata*(*)
+ *(.roda)
+ *(.rodata.*)
+ *(.gnu.linkonce.r*)
+ SORT(CONSTRUCTORS)
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram = 0xff
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >iwram
+ __exidx_start = .;
+ .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >iwram
+ __exidx_end = .;
+
+/* Ensure the __preinit_array_start label is properly aligned. We
+ could instead move the label definition inside the section, but
+ the linker would then create the section even if it turns out to
+ be empty, which isn't pretty. */
+ . = ALIGN(32 / 8);
+ PROVIDE (__preinit_array_start = .);
+ .preinit_array : { KEEP (*(.preinit_array)) } >iwram = 0xff
+ PROVIDE (__preinit_array_end = .);
+ PROVIDE (__init_array_start = .);
+ .init_array : { KEEP (*(.init_array)) } >iwram = 0xff
+ PROVIDE (__init_array_end = .);
+ PROVIDE (__fini_array_start = .);
+ .fini_array : { KEEP (*(.fini_array)) } >iwram = 0xff
+ PROVIDE (__fini_array_end = .);
+
+ .ctors :
+ {
+ /* gcc uses crtbegin.o to find the start of the constructors, so
+ we make sure it is first. Because this is a wildcard, it
+ doesn't matter if the user does not actually link against
+ crtbegin.o; the linker won't look for a file to match a
+ wildcard. The wildcard also means that it doesn't matter which
+ directory crtbegin.o is in. */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram = 0xff
+
+ .dtors :
+ {
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram = 0xff
+
+ .eh_frame :
+ {
+ KEEP (*(.eh_frame))
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram = 0xff
+
+ .gcc_except_table :
+ {
+ *(.gcc_except_table)
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram = 0xff
+ .jcr : { KEEP (*(.jcr)) } >iwram = 0
+ .got : { *(.got.plt) *(.got) } >iwram = 0
+
+
+ .iwram ALIGN(4) :
+ {
+ __iwram_start = ABSOLUTE(.) ;
+ *(.iwram)
+ *iwram.*(.text)
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ __iwram_end = ABSOLUTE(.) ;
+ } >iwram = 0xff
+
+
+ .data ALIGN(4) : {
+ __data_start = ABSOLUTE(.);
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d*)
+ CONSTRUCTORS
+ . = ALIGN(4);
+ __data_end = ABSOLUTE(.) ;
+ } >iwram = 0xff
+
+
+
+ .bss ALIGN(4) :
+ {
+ __bss_start = ABSOLUTE(.);
+ __bss_start__ = ABSOLUTE(.);
+ *(.dynbss)
+ *(.gnu.linkonce.b*)
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
+ } >iwram
+
+ __bss_end = . ;
+ __bss_end__ = . ;
+
+ _end = . ;
+ __end__ = . ;
+ PROVIDE (end = _end);
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ .stack 0x80000 : { _stack = .; *(.stack) }
+ /* These must appear regardless of . */
+}