From 32c5540b39a80a26c17e8590eaa8c58102f0d3da Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 25 Nov 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-11-25 --- bitsy/devuda1341.c | 57 ++++++++++++++++++++++++++++++---------------- bitsy/fns.h | 2 +- bitsy/power.c | 45 +++++++++++++++++++----------------- bitsy/sa1110dma.c | 28 ++++++++++++++--------- bitsy/sa1110dma.h | 1 + bitsy/trap.c | 2 +- 6 files changed, 82 insertions(+), 53 deletions(-) diff --git a/bitsy/devuda1341.c b/bitsy/devuda1341.c index 5b0ec491cf57f2ec254fb54992829ce668e96622..c692600390b35e9a7820c99e96672c80b3771ebf 100644 --- a/bitsy/devuda1341.c +++ b/bitsy/devuda1341.c @@ -642,24 +642,6 @@ indisable(void) { } } -void -audiopower(int flag) { - if (debug) { - iprint("audiopower %d\n", flag); - } - if (flag) { - egpiobits(EGPIO_audio_power, 1); - egpiobits(EGPIO_audio_ic_power | EGPIO_codec_reset, 1); - } else { - /* power off */ - if (audio.omode & Aread) - indisable(); - if (audio.omode & Awrite) - outdisable(); - egpiobits(EGPIO_audio_ic_power | EGPIO_codec_reset | EGPIO_audio_power, 0); - } -} - static void sendaudio(IOstate *s) { /* interrupt routine calls this too */ @@ -731,6 +713,42 @@ recvaudio(IOstate *s) { iunlock(&s->ilock); } +void +audiopower(int flag) { + IOstate *s; + + if (debug) { + iprint("audiopower %d\n", flag); + } + if (flag) { + /* power on only when necessary */ + if (audio.amode) { + egpiobits(EGPIO_audio_power | EGPIO_audio_ic_power | EGPIO_codec_reset, 1); + enable(); + if (audio.amode & Aread) { + inenable(); + s = &audio.i; + dmareset(s->dma, 1, 0, 4, 2, SSPRecvDMA, Port4SSP); + recvaudio(s); + } + if (audio.amode & Awrite) { + outenable(); + s = &audio.o; + dmareset(s->dma, 0, 0, 4, 2, SSPXmitDMA, Port4SSP); + sendaudio(s); + } + mxvolume(); + } + } else { + /* power off */ + if (audio.amode & Aread) + indisable(); + if (audio.amode & Awrite) + outdisable(); + egpiobits(EGPIO_audio_ic_power | EGPIO_codec_reset | EGPIO_audio_power, 0); + } +} + static void audiointr(void *x, ulong ndma) { IOstate *s = x; @@ -804,13 +822,13 @@ audioopen(Chan *c, int mode) if (omode & Aread) { inenable(); s = &audio.i; - audio.amode |= Aread; if(s->bufinit == 0) bufinit(s); setempty(s); s->emptying = &s->buf[Nbuf-1]; s->chan = c; s->dma = dmaalloc(1, 0, 4, 2, SSPRecvDMA, Port4SSP, audiointr, (void*)s); + audio.amode |= Aread; } if (omode & Awrite) { outenable(); @@ -821,6 +839,7 @@ audioopen(Chan *c, int mode) setempty(s); s->chan = c; s->dma = dmaalloc(0, 0, 4, 2, SSPXmitDMA, Port4SSP, audiointr, (void*)s); + audio.amode |= Awrite; } resetlevel(); mxvolume(); diff --git a/bitsy/fns.h b/bitsy/fns.h index e52db50e645ea7642687012d97ce4a4b5325ccda..7106202089c43ab2deb6ee2f36458fd6eb77e6a2 100644 --- a/bitsy/fns.h +++ b/bitsy/fns.h @@ -23,7 +23,7 @@ char* getconf(char*); ulong getfar(void); ulong getfsr(void); #define getpgcolor(a) 0 -void gpiointrenable(ulong, int, void (*)(Ureg*, void*), void*, char*) +void gpiointrenable(ulong, int, void (*)(Ureg*, void*), void*, char*); void h3650uartsetup(void); void icacheinvalidate(void); void idle(void); diff --git a/bitsy/power.c b/bitsy/power.c index 091b48218c80222562242bbb200eec43d1d89a7e..288a015551a82f6b7eb8842ed1cf8a687456f526 100644 --- a/bitsy/power.c +++ b/bitsy/power.c @@ -10,8 +10,6 @@ /* Power management for the bitsy */ -int powerup; - enum { pmcr_sf = 0, @@ -21,32 +19,35 @@ enum { pcfr_fo = 3, }; +jmp_buf power_resume; + static void onoffintr(Ureg*, void *x) { /* On/off button interrupt */ int i; - if (powerup) { - /* Power back up */ - powerup = 0; - exit(0); - } else { - /* Power down */ - - /* debounce, 50 ms*/ - for (i = 0; i < 50; i++) { - delay(1); - if ((gpioregs->level & GPIO_PWR_ON_i) == 0) - return; /* bounced */ - } - powerup = 1; - irpower(0); - audiopower(0); - lcdpower(0); - rs232power(0); - sa1100_power_off(); + /* debounce, 50 ms*/ + for (i = 0; i < 50; i++) { + delay(1); + if ((gpioregs->level & GPIO_PWR_ON_i) == 0) + return; /* bounced */ + } + if (i = setjmp(power_resume)) { + /* power back up */ + rs232power(1); + lcdpower(1); + audiopower(1); + irpower(1); + return; } + /* Power down */ + irpower(0); + audiopower(0); + lcdpower(0); + rs232power(0); + sa1100_power_off(); + /* no return */ } static void @@ -54,6 +55,8 @@ sa1100_power_off(void) { delay(100); splhi(); + /* enable wakeup by µcontroller, on/off switch or real-time clock alarm */ + powerregs->pwer = 0x80000003; /* disable internal oscillator, float CS lines */ powerregs->pcfr = 1<direction) - panic(""gpiointrenable %lux of output pin", bit); + panic("gpiointrenable %lux of output pin", bit); /* set edge register */ switch(edge){