dslinux/toolchain/ndstool/DefaultArm7/source main.c
stsp
stsp at user.in-berlin.de
Sun Aug 13 22:25:31 CEST 2006
Update of /cvsroot/dslinux/dslinux/toolchain/ndstool/DefaultArm7/source
In directory antilope:/tmp/cvs-serv5897/DefaultArm7/source
Added Files:
main.c
Log Message:
Adding pristine copy of ndstool so I can branch from it.
--- NEW FILE: main.c ---
/*---------------------------------------------------------------------------------
$Id: main.c,v 1.1 2006-08-13 20:25:29 stsp Exp $
Simple ARM7 stub (sends RTC, TSC, and X/Y data to the ARM 9)
$Log: main.c,v $
Revision 1.1 2006-08-13 20:25:29 stsp
Adding pristine copy of ndstool so I can branch from it.
Revision 1.10 2005/10/19 16:30:44 wntrmute
updated default arm7 core
bumped ndstool version
Revision 1.9 2005/09/13 03:13:36 wntrmute
rework to use proper interrupt dispatcher
Revision 1.8 2005/08/03 05:13:16 wntrmute
corrected sound code
---------------------------------------------------------------------------------*/
#include <nds.h>
#include <nds/bios.h>
#include <nds/arm7/touch.h>
#include <nds/arm7/clock.h>
//---------------------------------------------------------------------------------
void startSound( int sampleRate,
const void* data, u32 bytes,
u8 channel, u8 vol, 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) | (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;
}
//---------------------------------------------------------------------------------
void irqVblank() {
//---------------------------------------------------------------------------------
static int heartbeat = 0;
uint16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0, batt=0, aux=0;
int t1=0, t2=0;
uint32 temp=0;
uint8 ct[sizeof(IPC->curtime)];
u32 i;
// Update the heartbeat
heartbeat++;
// Read the touch screen
but = REG_KEYXY;
if (!(but & (1<<6))) {
touchPosition tempPos = touchReadXY();
x = tempPos.x;
y = tempPos.y;
xpx = tempPos.px;
ypx = tempPos.py;
}
z1 = touchRead(TSC_MEASURE_Z1);
z2 = touchRead(TSC_MEASURE_Z2);
batt = touchRead(TSC_MEASURE_BATTERY);
aux = touchRead(TSC_MEASURE_AUX);
// Read the time
rtcGetTime((uint8 *)ct);
BCDToInteger((uint8 *)&(ct[1]), 7);
// Read the temperature
temp = touchReadTemperature(&t1, &t2);
IPC->mailBusy = 1;
// Update the IPC struct
IPC->heartbeat = heartbeat;
IPC->buttons = but;
IPC->touchX = x;
IPC->touchY = y;
IPC->touchXpx = xpx;
IPC->touchYpx = ypx;
IPC->touchZ1 = z1;
IPC->touchZ2 = z2;
IPC->battery = batt;
IPC->aux = aux;
IPC->mailBusy = 0;
for(i=0; i<sizeof(ct); i++) {
IPC->curtime[i] = ct[i];
}
IPC->temperature = temp;
IPC->tdiode1 = t1;
IPC->tdiode2 = t2;
//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].format);
}
}
}
}
//---------------------------------------------------------------------------------
// timer 0 irq handler
//---------------------------------------------------------------------------------
void irqTimer0(void) {
//---------------------------------------------------------------------------------
ProcessMicrophoneTimerIRQ();
}
//---------------------------------------------------------------------------------
int main(int argc, char ** argv) {
//---------------------------------------------------------------------------------
// reset the clock if needed
rtcReset();
// enable sound
powerON(POWER_SOUND);
SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7f);
IPC->soundData = 0;
IPC->mailBusy = 0;
// setup irq
irqInit();
irqSet(IRQ_VBLANK, irqVblank);
irqSet(IRQ_TIMER0, irqTimer0);
irqEnable(IRQ_VBLANK | IRQ_TIMER0);
// keep the ARM7 out of main RAM
while (1) swiWaitForVBlank();
}
More information about the dslinux-commit
mailing list