diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-04-16 18:37:33 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-04-16 18:37:33 +0000 |
commit | 311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a (patch) | |
tree | 47eaf22ca7bb8cc68486ffe964abd54b535902ad /c/src/lib/libbsp/arm/nds/libnds/source/common | |
parent | 2008-04-16 Matthieu Bucchianeri <mbucchia@gmail.com> (diff) | |
download | rtems-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 '')
5 files changed, 1297 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/biosCalls.s b/c/src/lib/libbsp/arm/nds/libnds/source/common/biosCalls.s new file mode 100644 index 0000000000..a59debef6c --- /dev/null +++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/biosCalls.s @@ -0,0 +1,352 @@ +/*--------------------------------------------------------------------------------- + $Id$ + + 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. + + $Log$ + Revision 1.5 2006/03/15 12:37:14 wntrmute + reformatted for legibility + grouped arm7 and arm9 specific code + + Revision 1.4 2006/03/03 07:20:14 joatski + Fixed a couple of little bugs (e.g. swiSetHaltCR using r0 instead of r2 on ARM7) + Commented out ARM7 swis in ARM9 mode, and vis versa + + Revision 1.3 2006/01/17 00:13:36 dovoto + Fixed swi 08 so lable and global matched "swiChangeSoundBias" + + Revision 1.2 2005/09/03 13:47:13 wntrmute + added logging to header + reformatted for legibility + + +---------------------------------------------------------------------------------*/ + + .text + .align 4 + + .thumb + +@--------------------------------------------------------------------------------- + .global swiSoftReset + .thumb_func +@--------------------------------------------------------------------------------- +swiSoftReset: +@--------------------------------------------------------------------------------- + swi 0x00 + bx lr + + +@--------------------------------------------------------------------------------- + .global swiDelay + .thumb_func +@--------------------------------------------------------------------------------- +swiDelay: +@--------------------------------------------------------------------------------- + swi 0x03 + bx lr + +@--------------------------------------------------------------------------------- + .global swiIntrWait + .thumb_func +@--------------------------------------------------------------------------------- +swiIntrWait: +@--------------------------------------------------------------------------------- + swi 0x04 + bx lr + + +@--------------------------------------------------------------------------------- + .global swiWaitForVBlank + .thumb_func +@--------------------------------------------------------------------------------- +swiWaitForVBlank: +@--------------------------------------------------------------------------------- + swi 0x05 + bx lr + +@--------------------------------------------------------------------------------- + .global swiSleep + .thumb_func +@--------------------------------------------------------------------------------- +swiSleep: +@--------------------------------------------------------------------------------- + swi 0x07 + bx lr + +@--------------------------------------------------------------------------------- + .global swiChangeSoundBias + .thumb_func +@--------------------------------------------------------------------------------- +swiChangeSoundBias: +@--------------------------------------------------------------------------------- + swi 0x08 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDivide + .thumb_func +@--------------------------------------------------------------------------------- +swiDivide: +@--------------------------------------------------------------------------------- + swi 0x09 + bx lr + +@--------------------------------------------------------------------------------- + .global swiRemainder + .thumb_func +@--------------------------------------------------------------------------------- +swiRemainder: +@--------------------------------------------------------------------------------- + swi 0x09 + mov r0, r1 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDivMod + .thumb_func +@--------------------------------------------------------------------------------- +swiDivMod: +@--------------------------------------------------------------------------------- + push {r2, r3} + swi 0x09 + pop {r2, r3} + str r0, [r2] + str r1, [r3] + bx lr + +@--------------------------------------------------------------------------------- + .global swiCopy + .thumb_func +@--------------------------------------------------------------------------------- +swiCopy: +@--------------------------------------------------------------------------------- + swi 0x0B + bx lr + +@--------------------------------------------------------------------------------- + .global swiFastCopy + .thumb_func +@--------------------------------------------------------------------------------- +swiFastCopy: +@--------------------------------------------------------------------------------- + swi 0x0C + bx lr + +@--------------------------------------------------------------------------------- + .global swiSqrt + .thumb_func +@--------------------------------------------------------------------------------- +swiSqrt: +@--------------------------------------------------------------------------------- + swi 0x0D + bx lr + +@--------------------------------------------------------------------------------- + .global swiCRC16 + .thumb_func +@--------------------------------------------------------------------------------- +swiCRC16: +@--------------------------------------------------------------------------------- + swi 0x0E + bx lr + +@--------------------------------------------------------------------------------- + .global swiIsDebugger + .thumb_func +@--------------------------------------------------------------------------------- +swiIsDebugger: +@--------------------------------------------------------------------------------- + swi 0x0F + bx lr + +@--------------------------------------------------------------------------------- + .global swiUnpackBits + .thumb_func +@--------------------------------------------------------------------------------- +swiUnpackBits: +@--------------------------------------------------------------------------------- + swi 0x10 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDecompressLZSSWram + .thumb_func +@--------------------------------------------------------------------------------- +swiDecompressLZSSWram: +@--------------------------------------------------------------------------------- + swi 0x11 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDecompressLZSSVram + .thumb_func +@--------------------------------------------------------------------------------- +swiDecompressLZSSVram: +@--------------------------------------------------------------------------------- + swi 0x12 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDecompressHuffman + .thumb_func +@--------------------------------------------------------------------------------- +swiDecompressHuffman: +@--------------------------------------------------------------------------------- + swi 0x13 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDecompressRLEWram + .thumb_func +@--------------------------------------------------------------------------------- +swiDecompressRLEWram: +@--------------------------------------------------------------------------------- + swi 0x14 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDecompressRLEVram + .thumb_func +@--------------------------------------------------------------------------------- +swiDecompressRLEVram: +@--------------------------------------------------------------------------------- + swi 0x15 + bx lr + +@--------------------------------------------------------------------------------- +@ ARM7 only bios calls +@--------------------------------------------------------------------------------- +#ifdef ARM7 + +@--------------------------------------------------------------------------------- + .global swiHalt + .thumb_func +@--------------------------------------------------------------------------------- +swiHalt: +@--------------------------------------------------------------------------------- + swi 0x06 + bx lr + +@--------------------------------------------------------------------------------- + .global swiGetSineTable + .thumb_func +@--------------------------------------------------------------------------------- +swiGetSineTable: +@--------------------------------------------------------------------------------- + swi 0x1A + bx lr + +@--------------------------------------------------------------------------------- + .global swiGetPitchTable + .thumb_func +@--------------------------------------------------------------------------------- +swiGetPitchTable: +@--------------------------------------------------------------------------------- + swi 0x1B + bx lr + +@--------------------------------------------------------------------------------- + .global swiGetVolumeTable + .thumb_func +@--------------------------------------------------------------------------------- +swiGetVolumeTable: +@--------------------------------------------------------------------------------- + swi 0x1C + bx lr + + +@ ARM7 function, but no real point in exposing it, at least not +@ without adding a way to get the 3 arguments back into C +@ .global swiGetFptrs +@ .thumb_func +@swiGetFptrs: +@ swi 0x1D +@ bx lr + + +@--------------------------------------------------------------------------------- + .global swiSwitchToGBAMode + .thumb_func +@--------------------------------------------------------------------------------- +swiSwitchToGBAMode: +@--------------------------------------------------------------------------------- + mov r0, #0x40 + swi 0x1F +@ does not return, of course + +@--------------------------------------------------------------------------------- + .global swiSetHaltCR + .thumb_func +@--------------------------------------------------------------------------------- +swiSetHaltCR: +@--------------------------------------------------------------------------------- + mov r2, r0 + swi 0x1F + bx lr + +#endif // ARM7 + +@--------------------------------------------------------------------------------- +@ ARM9 only bios calls +@--------------------------------------------------------------------------------- +#ifdef ARM9 + +@--------------------------------------------------------------------------------- + .global swiWaitForIRQ + .thumb_func +@--------------------------------------------------------------------------------- +swiWaitForIRQ: +@--------------------------------------------------------------------------------- + swi 0x06 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDecodeDelta8 + .thumb_func +@--------------------------------------------------------------------------------- +swiDecodeDelta8: +@--------------------------------------------------------------------------------- + swi 0x16 + bx lr + +@--------------------------------------------------------------------------------- + .global swiDecodeDelta16 + .thumb_func +@--------------------------------------------------------------------------------- +swiDecodeDelta16: +@--------------------------------------------------------------------------------- + swi 0x18 + bx lr + +@--------------------------------------------------------------------------------- + .global swiSetHaltCR + .thumb_func +@--------------------------------------------------------------------------------- +swiSetHaltCR: +@--------------------------------------------------------------------------------- + swi 0x1F + bx lr + +#endif // ARM9 + diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c b/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c new file mode 100644 index 0000000000..8aad2d93aa --- /dev/null +++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c @@ -0,0 +1,394 @@ +/*---------------------------------------------------------------------------------
+ $Id$
+
+ 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/card.h"
+#include "nds/dma.h"
+#include "nds/memory.h"
+
+
+//---------------------------------------------------------------------------------
+void cardWriteCommand(const uint8 * command) {
+//---------------------------------------------------------------------------------
+ int index;
+
+ CARD_CR1H = CARD_CR1_ENABLE | CARD_CR1_IRQ;
+
+ for (index = 0; index < 8; index++) {
+ CARD_COMMAND[7-index] = command[index];
+ }
+}
+
+
+//---------------------------------------------------------------------------------
+void cardPolledTransfer(uint32 flags, uint32 * destination, uint32 length, const uint8 * command) {
+//---------------------------------------------------------------------------------
+ u32 data;;
+ cardWriteCommand(command);
+ CARD_CR2 = flags;
+ uint32 * target = destination + length;
+ do {
+ // Read data if available
+ if (CARD_CR2 & CARD_DATA_READY) {
+ data=CARD_DATA_RD;
+ if (destination < target)
+ *destination = data;
+ destination++;
+ }
+ } while (CARD_CR2 & CARD_BUSY);
+}
+
+
+//---------------------------------------------------------------------------------
+void cardStartTransfer(const uint8 * command, uint32 * destination, int channel, uint32 flags) {
+//---------------------------------------------------------------------------------
+ cardWriteCommand(command);
+
+ // Set up a DMA channel to transfer a word every time the card makes one
+ DMA_SRC(channel) = (uint32)&CARD_DATA_RD;
+ DMA_DEST(channel) = (uint32)destination;
+ DMA_CR(channel) = DMA_ENABLE | DMA_START_CARD | DMA_32_BIT | DMA_REPEAT | DMA_SRC_FIX | 0x0001;;
+
+ CARD_CR2 = flags;
+}
+
+
+//---------------------------------------------------------------------------------
+uint32 cardWriteAndRead(const uint8 * command, uint32 flags) {
+//---------------------------------------------------------------------------------
+ cardWriteCommand(command);
+ CARD_CR2 = flags | CARD_ACTIVATE | CARD_nRESET | 0x07000000;
+ while (!(CARD_CR2 & CARD_DATA_READY)) ;
+ return CARD_DATA_RD;
+}
+
+
+//---------------------------------------------------------------------------------
+void cardRead00(uint32 address, uint32 * destination, uint32 length, uint32 flags) {
+//---------------------------------------------------------------------------------f
+ uint8 command[8];
+ command[7] = 0;
+ command[6] = (address >> 24) & 0xff;
+ command[5] = (address >> 16) & 0xff;
+ command[4] = (address >> 8) & 0xff;
+ command[3] = address & 0xff;
+ command[2] = 0;
+ command[1] = 0;
+ command[0] = 0;
+ cardPolledTransfer(flags, destination, length, command);
+}
+
+
+//---------------------------------------------------------------------------------
+void cardReadHeader(uint8 * header) {
+//---------------------------------------------------------------------------------
+ cardRead00(0, (uint32 *)header, 512, 0xA93F1FFF);
+}
+
+
+//---------------------------------------------------------------------------------
+int cardReadID(uint32 flags) {
+//---------------------------------------------------------------------------------
+ uint8 command[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90};
+ return cardWriteAndRead(command, flags);
+}
+
+
+//---------------------------------------------------------------------------------
+static inline void EepromWaitBusy() {
+//---------------------------------------------------------------------------------
+ while (CARD_CR1 & /*BUSY*/0x80);
+}
+
+//---------------------------------------------------------------------------------
+uint8 cardEepromReadID(uint8 i) {
+//---------------------------------------------------------------------------------
+ return cardEepromCommand(/*READID*/0xAB, i&1);
+}
+
+//---------------------------------------------------------------------------------
+uint8 cardEepromCommand(uint8 command, uint32 address) {
+//---------------------------------------------------------------------------------
+ uint8 retval;
+ int k;
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+
+ CARD_CR1 = 0xFFFF;
+ CARD_EEPDATA = command;
+
+ EepromWaitBusy();
+
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+
+ CARD_EEPDATA = (address) & 0xFF;
+ EepromWaitBusy();
+
+ for(k=0;k<256;k++)
+ {
+ retval = CARD_EEPDATA;
+ if(retval!=0xFF)
+ break;
+ EepromWaitBusy();
+ }
+
+ CARD_CR1 = /*MODE*/0x40;
+ return retval;
+}
+
+//---------------------------------------------------------------------------------
+int cardEepromGetType(void)
+//---------------------------------------------------------------------------------
+{
+ uint8 c00;
+ uint8 c05;
+ uint8 c9f;
+ uint8 c03;
+
+#ifdef ARM9
+ sysSetBusOwners(BUS_OWNER_ARM9, BUS_OWNER_ARM9);
+#endif
+
+ c03=cardEepromCommand(0x03,0);
+ c05=cardEepromCommand(0x05,0);
+ c9f=cardEepromCommand(0x9f,0);
+ c00=cardEepromCommand(0x00,0);
+
+ if((c00==0x00) && (c9f==0x00)) return 0; // PassMe?
+ if((c00==0xff) && (c05==0xff) && (c9f==0xff))return -1;
+
+ if((c00==0xff) && (c05 & 0xFD) == 0xF0 && (c9f==0xff))return 1;
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0xff))return 2;
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x00))return 3;
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x12))return 3; // NEW TYPE 3
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x13))return 3; // NEW TYPE 3+ 4Mbit
+ if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x14))return 3; // NEW TYPE 3++ 8Mbit MK4-FLASH Memory
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------------
+uint32 cardEepromGetSize() {
+//---------------------------------------------------------------------------------
+
+ int type = cardEepromGetType();
+
+ if(type == -1)
+ return 0;
+ if(type == 0)
+ return 8192;
+ if(type == 1)
+ return 512;
+ if(type == 2) {
+ static const uint32 offset0 = (8*1024-1); // 8KB
+ static const uint32 offset1 = (2*8*1024-1); // 16KB
+ u8 buf1; // +0k data read -> write
+ u8 buf2; // +8k data read -> read
+ u8 buf3; // +0k ~data write
+ u8 buf4; // +8k data new comp buf2
+ cardReadEeprom(offset0,&buf1,1,type);
+ cardReadEeprom(offset1,&buf2,1,type);
+ buf3=~buf1;
+ cardWriteEeprom(offset0,&buf3,1,type);
+ cardReadEeprom (offset1,&buf4,1,type);
+ cardWriteEeprom(offset0,&buf1,1,type);
+ if(buf4!=buf2) // +8k
+ return 8*1024; // 8KB(64kbit)
+ else
+ return 64*1024; // 64KB(512kbit)
+ }
+ if(type == 3) {
+ uint8 c9f;
+ c9f=cardEepromCommand(0x9f,0);
+
+ if(c9f==0x14)
+ return 1024*1024; // NEW TYPE 3++ 8Mbit(1024KByte)
+
+ if(c9f==0x13)
+ return 512*1024; // NEW TYPE 3+ 4Mbit(512KByte)
+
+ return 256*1024; // TYPE 3 2Mbit(256KByte)
+ }
+
+ return 0;
+}
+
+
+//---------------------------------------------------------------------------------
+void cardReadEeprom(uint32 address, uint8 *data, uint32 length, uint32 addrtype) {
+//---------------------------------------------------------------------------------
+
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x03 | ((addrtype == 1) ? address>>8<<3 : 0);
+ EepromWaitBusy();
+
+ if (addrtype == 3) {
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+ }
+
+ if (addrtype >= 2) {
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+ }
+
+
+ CARD_EEPDATA = (address) & 0xFF;
+ EepromWaitBusy();
+
+ while (length > 0) {
+ CARD_EEPDATA = 0;
+ EepromWaitBusy();
+ *data++ = CARD_EEPDATA;
+ length--;
+ }
+
+ EepromWaitBusy();
+ CARD_CR1 = /*MODE*/0x40;
+}
+
+
+//---------------------------------------------------------------------------------
+void cardWriteEeprom(uint32 address, uint8 *data, uint32 length, uint32 addrtype) {
+//---------------------------------------------------------------------------------
+
+ uint32 address_end = address + length;
+ int i;
+ int maxblocks = 32;
+ if(addrtype == 1) maxblocks = 16;
+ if(addrtype == 2) maxblocks = 32;
+ if(addrtype == 3) maxblocks = 256;
+
+ while (address < address_end) {
+ // set WEL (Write Enable Latch)
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x06; EepromWaitBusy();
+ CARD_CR1 = /*MODE*/0x40;
+
+ // program maximum of 32 bytes
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+
+ if(addrtype == 1) {
+ // WRITE COMMAND 0x02 + A8 << 3
+ CARD_EEPDATA = 0x02 | (address & BIT(8)) >> (8-3) ;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+ }
+ else if(addrtype == 2) {
+ CARD_EEPDATA = 0x02;
+ EepromWaitBusy();
+ CARD_EEPDATA = address >> 8;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+ }
+ else if(addrtype == 3) {
+ CARD_EEPDATA = 0x02;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+ }
+
+ for (i=0; address<address_end && i<maxblocks; i++, address++) {
+ CARD_EEPDATA = *data++;
+ EepromWaitBusy();
+ }
+ CARD_CR1 = /*MODE*/0x40;
+
+ // wait programming to finish
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x05; EepromWaitBusy();
+ do { CARD_EEPDATA = 0; EepromWaitBusy(); } while (CARD_EEPDATA & 0x01); // WIP (Write In Progress) ?
+ EepromWaitBusy();
+ CARD_CR1 = /*MODE*/0x40;
+ }
+}
+
+
+// Chip Erase : clear FLASH MEMORY (TYPE 3 ONLY)
+//---------------------------------------------------------------------------------
+void cardEepromChipErase(void) {
+//---------------------------------------------------------------------------------
+ int sz;
+ sz=cardEepromGetSize();
+ cardEepromSectorErase(0x00000);
+ cardEepromSectorErase(0x10000);
+ cardEepromSectorErase(0x20000);
+ cardEepromSectorErase(0x30000);
+ if(sz==512*1024)
+ {
+ cardEepromSectorErase(0x40000);
+ cardEepromSectorErase(0x50000);
+ cardEepromSectorErase(0x60000);
+ cardEepromSectorErase(0x70000);
+ }
+}
+
+// COMMAND Sec.erase 0xD8
+void cardEepromSectorErase(uint32 address)
+{
+ // set WEL (Write Enable Latch)
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x06;
+ EepromWaitBusy();
+
+ CARD_CR1 = /*MODE*/0x40;
+
+ // SectorErase 0xD8
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0xD8;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 16) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = (address >> 8) & 0xFF;
+ EepromWaitBusy();
+ CARD_EEPDATA = address & 0xFF;
+ EepromWaitBusy();
+
+ CARD_CR1 = /*MODE*/0x40;
+
+ // wait erase to finish
+ CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40;
+ CARD_EEPDATA = 0x05;
+ EepromWaitBusy();
+
+ do
+ {
+ CARD_EEPDATA = 0;
+ EepromWaitBusy();
+ } while (CARD_EEPDATA & 0x01); // WIP (Write In Progress) ?
+ CARD_CR1 = /*MODE*/0x40;
+}
+
+
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/gbfs.c b/c/src/lib/libbsp/arm/nds/libnds/source/common/gbfs.c new file mode 100644 index 0000000000..cc9348a4e8 --- /dev/null +++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/gbfs.c @@ -0,0 +1,221 @@ +/*--------------------------------------------------------------------------------- + $Id$ + + access object in a GBFS file + + Copyright 2002-2005 Damian Yerrick + + Additional code Dave Murphy + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF + OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + + $Log$ + Revision 1.5 2006/05/05 05:32:06 wntrmute + consistency formatting + + Revision 1.4 2006/02/25 02:31:12 wntrmute + tabs, not spaces + + Revision 1.3 2005/09/20 04:59:44 wntrmute + *** empty log message *** + + Revision 1.2 2005/08/23 17:06:10 wntrmute + converted all endings to unix + + Revision 1.1 2005/08/04 17:55:44 wntrmute + added gbfs + + +---------------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------------- + This code assumes a LITTLE ENDIAN target. It'll need a boatload + of itohs and itohl calls if converted to run on Sega Genesis. It + also assumes that the target uses 16-bit short and 32-bit longs. +---------------------------------------------------------------------------------*/ + +#include <stdlib.h> +#include <string.h> +#include <nds/jtypes.h> +#include "gbfs.h" + +/*--------------------------------------------------------------------------------- + change this to the end of your ROM, + or to 0x02040000 for gba multiboot + or to 0x24000000 for nds main ram +---------------------------------------------------------------------------------*/ + +static const u32 * GBFS_1ST_SEARCH_LIMIT = (const u32 *)0x02400000; +static const u32 * GBFS_2ND_SEARCH_START = (const u32 *)0x08000000; +static const u32 * GBFS_2ND_SEARCH_LIMIT = (const u32 *)0x0a000000; +/*--------------------------------------------------------------------------------- + a power of two, less than or equal to the argument passed to + padbin. Increasing the stride makes find_first_gbfs_file() + faster at the cost of a slightly larger binary. +---------------------------------------------------------------------------------*/ +static int GBFS_STRIDE = 256; + +/*--------------------------------------------------------------------------------- + Set the search limits and stride for searching +---------------------------------------------------------------------------------*/ +void gbfs_search_range( + u32 gbfs_1st_limit, + u32 gbfs_2nd_start, u32 gbfs_2nd_limit, + u32 gbfs_stride +) { +//--------------------------------------------------------------------------------- + if ( NULL != gbfs_1st_limit ) GBFS_1ST_SEARCH_LIMIT = (u32 *)gbfs_1st_limit; + if ( NULL != gbfs_2nd_limit ) GBFS_2ND_SEARCH_LIMIT = (u32 *)gbfs_2nd_limit; + if ( NULL != gbfs_2nd_start ) GBFS_2ND_SEARCH_START = (u32 *)gbfs_2nd_start; + if ( NULL != gbfs_stride ) GBFS_STRIDE = gbfs_stride; + +} + +//--------------------------------------------------------------------------------- +const GBFS_FILE * find_first_gbfs_file(const void *start) { +//--------------------------------------------------------------------------------- + /* align the pointer */ + const u32 *here = (const u32 *) + ((unsigned long)start & (-GBFS_STRIDE)); + const char rest_of_magic[] = "ightGBFS\r\n\x1a\n"; + + /* Linear-search first in multiboot space. */ + while(here < GBFS_1ST_SEARCH_LIMIT) + { + /* We have to keep the magic code in two pieces; otherwise, + this function may find itself and think it's a GBFS file. + This obviously won't work if your compiler stores this + numeric literal just before the literal string, but Devkit + Advance R4 and R5 seem to keep numeric constant pools + separate enough from string pools for this to work. + */ + if(*here == 0x456e6950) { /* ASCII code for little endian "PinE" */ + /* We've matched the first four bytes. + If the rest of the magic matches, then we've found a file. */ + if(!memcmp(here + 1, rest_of_magic, 12)) + return (const GBFS_FILE *)here; + } + here += GBFS_STRIDE / sizeof(here); + } + + /* Now search in ROM space. */ + if(here < GBFS_2ND_SEARCH_START) + here = GBFS_2ND_SEARCH_START; + while(here < GBFS_2ND_SEARCH_LIMIT) { + /* Search loop same as above. */ + if(*here == 0x456e6950) { /* ASCII code for little endian "PinE" */ + if(!memcmp(here + 1, rest_of_magic, 12)) + return (const GBFS_FILE *)here; + } + here += GBFS_STRIDE / sizeof(*here); + } + return 0; +} + + +//--------------------------------------------------------------------------------- +const void *skip_gbfs_file(const GBFS_FILE *file) { +//--------------------------------------------------------------------------------- + return ((char *)file + file->total_len); +} + + +//--------------------------------------------------------------------------------- +static int namecmp(const void *a, const void *b) { +//--------------------------------------------------------------------------------- + return memcmp(a, b, 24); +} + + +//--------------------------------------------------------------------------------- +const void *gbfs_get_obj( const GBFS_FILE *file, + const char *name, + u32 *len) { +//--------------------------------------------------------------------------------- + char key[24] = {0}; + + const GBFS_ENTRY *dirbase = (const GBFS_ENTRY *)((const char *)file + file->dir_off); + size_t n_entries = file->dir_nmemb; + const GBFS_ENTRY *here; + + strncpy(key, name, 24); + + here = bsearch( key, dirbase, + n_entries, sizeof(GBFS_ENTRY), + namecmp); + if(!here) + return NULL; + + if(len) + *len = here->len; + return (char *)file + here->data_offset; +} + + +//--------------------------------------------------------------------------------- +const void *gbfs_get_nth_obj( const GBFS_FILE *file, + size_t n, + char *name, + u32 *len) +//--------------------------------------------------------------------------------- +{ + const GBFS_ENTRY *dirbase = (const GBFS_ENTRY *)((const char *)file + file->dir_off); + size_t n_entries = file->dir_nmemb; + const GBFS_ENTRY *here = dirbase + n; + + if(n >= n_entries) + return NULL; + + if(name) { + strncpy(name, here->name, 24); + name[24] = 0; + } + + if(len) + *len = here->len; + + return (char *)file + here->data_offset; +} + + +//--------------------------------------------------------------------------------- +void *gbfs_copy_obj( void *dst, + const GBFS_FILE *file, + const char *name) { +//--------------------------------------------------------------------------------- + u32 len; + const void *src = gbfs_get_obj(file, name, &len); + + if(!src) + return NULL; + + memcpy(dst, src, len); + return dst; +} + + +//--------------------------------------------------------------------------------- +size_t gbfs_count_objs(const GBFS_FILE *file) { +//--------------------------------------------------------------------------------- + return file ? file->dir_nmemb : 0; +} + diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/interruptDispatcher.s b/c/src/lib/libbsp/arm/nds/libnds/source/common/interruptDispatcher.s new file mode 100644 index 0000000000..70b726e6e6 --- /dev/null +++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/interruptDispatcher.s @@ -0,0 +1,152 @@ +/*---------------------------------------------------------------------------------
+ $Id$
+
+ Copyright (C) 2005
+ 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.
+
+ $Log$
+ Revision 1.10 2007/08/11 06:00:23 wntrmute
+ make nesting really work
+
+ Revision 1.9 2007/01/10 15:48:27 wntrmute
+ remove unused code
+
+ Revision 1.8 2006/12/16 09:10:02 wntrmute
+ acknowledge interrupt before calling handler
+
+ Revision 1.7 2006/04/26 05:11:31 wntrmute
+ rebase dtcm, take __irq_flags and __irq_vector from linker script
+ move arm7 irq vector & irq flags to actual locations
+
+ Revision 1.6 2006/04/23 18:19:15 wntrmute
+ reworked interrupt code to allow dtcm moving
+
+ Revision 1.5 2005/12/12 13:01:55 wntrmute
+ disable interrupts on return from user handler
+
+ Revision 1.4 2005/10/21 22:43:42 wntrmute
+ restore REG_IME on exit from null handler
+
+ Revision 1.3 2005/09/27 18:21:53 wntrmute
+ safer nested interrupt support
+
+ Revision 1.2 2005/09/04 16:37:01 wntrmute
+ check for NULL handler
+
+ Revision 1.1 2005/09/03 17:09:35 wntrmute
+ added interworking aware interrupt dispatcher
+
+
+---------------------------------------------------------------------------------*/
+
+#ifdef ARM7
+ .text
+#endif
+
+#ifdef ARM9
+ .section .itcm,"ax",%progbits
+#endif
+
+ .extern irqTable
+ .code 32
+
+ .global IntrMain
+@---------------------------------------------------------------------------------
+IntrMain:
+@---------------------------------------------------------------------------------
+ mov r3, #0x4000000 @ REG_BASE
+
+ ldr r1, [r3, #0x208] @ r1 = IME
+ str r3, [r3, #0x208] @ disable IME
+ mrs r0, spsr
+ stmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq}
+
+ ldr r1, [r3,#0x210] @ REG_IE
+ ldr r2, [r3,#0x214] @ REG_IF
+ and r1,r1,r2
+
+ ldr r0,=__irq_flags @ defined by linker script
+
+ ldr r2,[r0]
+ orr r2,r2,r1
+ str r2,[r0]
+
+ ldr r2,=irqTable
+@---------------------------------------------------------------------------------
+findIRQ:
+@---------------------------------------------------------------------------------
+ ldr r0, [r2, #4]
+ cmp r0,#0
+ beq no_handler
+ ands r0, r0, r1
+ bne jump_intr
+ add r2, r2, #8
+ b findIRQ
+
+@---------------------------------------------------------------------------------
+no_handler:
+@---------------------------------------------------------------------------------
+ str r1, [r3, #0x0214] @ IF Clear
+ ldmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq}
+ str r1, [r3, #0x208] @ restore REG_IME
+ mov pc,lr
+
+@---------------------------------------------------------------------------------
+jump_intr:
+@---------------------------------------------------------------------------------
+ ldr r1, [r2] @ user IRQ handler address
+ cmp r1, #0
+ bne got_handler
+ mov r1, r0
+ b no_handler
+@---------------------------------------------------------------------------------
+got_handler:
+@---------------------------------------------------------------------------------
+
+ mrs r2, cpsr
+ bic r2, r2, #0xdf @ \__
+ orr r2, r2, #0x1f @ / --> Enable IRQ & FIQ. Set CPU mode to System.
+ msr cpsr,r2
+
+ str r0, [r3, #0x0214] @ IF Clear
+
+ push {lr}
+ adr lr, IntrRet
+ bx r1
+
+@---------------------------------------------------------------------------------
+IntrRet:
+@---------------------------------------------------------------------------------
+ mov r3, #0x4000000 @ REG_BASE
+ str r3, [r3, #0x208] @ disable IME
+ pop {lr}
+
+ mrs r3, cpsr
+ bic r3, r3, #0xdf @ \__
+ orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ.
+ msr cpsr, r3
+
+ ldmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq}
+ msr spsr, r0 @ restore spsr
+ str r1, [r3, #0x208] @ restore REG_IME
+ mov pc,lr
+
+ .pool
+ .end
diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/interrupts.c b/c/src/lib/libbsp/arm/nds/libnds/source/common/interrupts.c new file mode 100644 index 0000000000..6d49e6f89f --- /dev/null +++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/interrupts.c @@ -0,0 +1,178 @@ +/*--------------------------------------------------------------------------------- + $Id$ + + Copyright (C) 2005 + 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. + + $Log$ + Revision 1.10 2007/02/06 12:00:32 wntrmute + use uint32 for irqEnable + + Revision 1.9 2006/06/16 07:35:14 wntrmute + more moves to REG_ values + implement SetYtrigger helper function + set bits in REG_DISPSTAT for IRQ_VCOUNT + + Revision 1.8 2006/02/21 00:12:35 wntrmute + clear interrupts and enable REG_IME in irqInit + + Revision 1.7 2005/12/12 13:03:29 wntrmute + set/clear LCD interrupts in irqEnable/Disable + + Revision 1.6 2005/11/07 01:11:08 wntrmute + more doxygen + moved IntrMain declaration to C file + + Revision 1.5 2005/09/20 05:00:24 wntrmute + use new register definitions + + Revision 1.4 2005/09/04 16:28:04 wntrmute + place irqTable in ewram + + Revision 1.3 2005/09/03 17:09:35 wntrmute + added interworking aware interrupt dispatcher + + +---------------------------------------------------------------------------------*/ + +#include <nds/interrupts.h> +#include <nds/system.h> + +void IntrMain(); // Prototype for assembly interrupt dispatcher + +//--------------------------------------------------------------------------------- +void irqDummy(void) {} +//--------------------------------------------------------------------------------- + + +#ifdef ARM9 +#define INT_TABLE_SECTION __attribute__((section(".itcm"))) +#else +#define INT_TABLE_SECTION +#endif + +struct IntTable irqTable[MAX_INTERRUPTS] INT_TABLE_SECTION; + +//--------------------------------------------------------------------------------- +void irqSet(int mask, IntFn handler) { +//--------------------------------------------------------------------------------- + if (!mask) return; + + int i; + + for (i=0;i<MAX_INTERRUPTS;i++) + if (!irqTable[i].mask || irqTable[i].mask == mask) break; + + if ( i == MAX_INTERRUPTS ) return; + + irqTable[i].handler = handler; + irqTable[i].mask = mask; + + if(mask & IRQ_VBLANK) + REG_DISPSTAT |= DISP_VBLANK_IRQ ; + if(mask & IRQ_HBLANK) + REG_DISPSTAT |= DISP_HBLANK_IRQ ; + + REG_IE |= mask; +} + +//--------------------------------------------------------------------------------- +void irqInit() { +//--------------------------------------------------------------------------------- + int i; + + // Set all interrupts to dummy functions. + for(i = 0; i < MAX_INTERRUPTS; i ++) + { + irqTable[i].handler = irqDummy; + irqTable[i].mask = 0; + } + + IRQ_HANDLER = IntrMain; + + REG_IE = 0; // disable all interrupts + REG_IF = IRQ_ALL; // clear all pending interrupts + REG_IME = 1; // enable global interrupt + +} + + +//--------------------------------------------------------------------------------- +void irqClear(int mask) { +//--------------------------------------------------------------------------------- + int i = 0; + + for (i=0;i<MAX_INTERRUPTS;i++) + if (irqTable[i].mask == mask) break; + + if ( i == MAX_INTERRUPTS ) return; + + irqTable[i].handler = irqDummy; + + if (mask & IRQ_VBLANK) + REG_DISPSTAT &= ~DISP_VBLANK_IRQ ; + if (mask & IRQ_HBLANK) + REG_DISPSTAT &= ~DISP_HBLANK_IRQ ; + if (mask & IRQ_VCOUNT) + REG_DISPSTAT &= ~DISP_YTRIGGER_IRQ; + + REG_IE &= ~mask; +} + + +//--------------------------------------------------------------------------------- +void irqInitHandler(IntFn handler) { +//--------------------------------------------------------------------------------- + REG_IME = 0; + REG_IF = ~0; + REG_IE = 0; + + IRQ_HANDLER = handler; + + REG_IME = 1; +} + +//--------------------------------------------------------------------------------- +void irqEnable(uint32 irq) { +//--------------------------------------------------------------------------------- + if (irq & IRQ_VBLANK) + REG_DISPSTAT |= DISP_VBLANK_IRQ ; + if (irq & IRQ_HBLANK) + REG_DISPSTAT |= DISP_HBLANK_IRQ ; + if (irq & IRQ_VCOUNT) + REG_DISPSTAT |= DISP_YTRIGGER_IRQ; + + REG_IE |= irq; + REG_IME = 1; +} + +//--------------------------------------------------------------------------------- +void irqDisable(uint32 irq) { +//--------------------------------------------------------------------------------- + if (irq & IRQ_VBLANK) + REG_DISPSTAT &= ~DISP_VBLANK_IRQ ; + if (irq & IRQ_HBLANK) + REG_DISPSTAT &= ~DISP_HBLANK_IRQ ; + if (irq & IRQ_VCOUNT) + REG_DISPSTAT &= ~DISP_YTRIGGER_IRQ; + + REG_IE &= ~irq; +} + |