diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/nds/coproc')
-rw-r--r-- | c/src/lib/libbsp/arm/nds/coproc/coproc.S | 112 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/nds/coproc/coproc.c | 207 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/nds/coproc/coproc.ld | 195 |
3 files changed, 0 insertions, 514 deletions
diff --git a/c/src/lib/libbsp/arm/nds/coproc/coproc.S b/c/src/lib/libbsp/arm/nds/coproc/coproc.S deleted file mode 100644 index f1bc2bac61..0000000000 --- a/c/src/lib/libbsp/arm/nds/coproc/coproc.S +++ /dev/null @@ -1,112 +0,0 @@ -@--------------------------------------------------------------------------------- - .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 deleted file mode 100644 index 611bd31971..0000000000 --- a/c/src/lib/libbsp/arm/nds/coproc/coproc.c +++ /dev/null @@ -1,207 +0,0 @@ -/*--------------------------------------------------------------------------------- - - 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((u8 *)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 deleted file mode 100644 index deb2fe4343..0000000000 --- a/c/src/lib/libbsp/arm/nds/coproc/coproc.ld +++ /dev/null @@ -1,195 +0,0 @@ -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 . */ -} |