From 446d66db9df0f6e12e316980448a196ad9fb1cfb Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 23 Nov 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-11-23 --- bitsy/devuda1341.c | 19 ++++++++-------- bitsy/fns.h | 2 -- bitsy/io.h | 16 +++++++------- bitsy/power.c | 55 +++++++++++++++++++++++++++++++++++++++------- 4 files changed, 64 insertions(+), 28 deletions(-) diff --git a/bitsy/devuda1341.c b/bitsy/devuda1341.c index 9f6e0fcfb9f20e6fc6060b5e03f3d3c33fd6f089..5b0ec491cf57f2ec254fb54992829ce668e96622 100644 --- a/bitsy/devuda1341.c +++ b/bitsy/devuda1341.c @@ -624,8 +624,6 @@ outdisable(void) { static void inenable(void) { /* turn on ADC, set input gain switch */ -// egpiobits(EGPIO_audio_power, 1); -// audiomute(0); status1 |= 0x22; L3_write(UDA1341_L3Addr | UDA1341_STATUS, (uchar*)&status1, 1); if (debug) { @@ -644,20 +642,21 @@ indisable(void) { } } -static void -disable(void) { - egpiobits(EGPIO_audio_ic_power | EGPIO_codec_reset, 0); -} - -static 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 */ - egpiobits(EGPIO_audio_power, 0); - egpiobits(EGPIO_audio_ic_power | EGPIO_codec_reset, 0); + if (audio.omode & Aread) + indisable(); + if (audio.omode & Awrite) + outdisable(); + egpiobits(EGPIO_audio_ic_power | EGPIO_codec_reset | EGPIO_audio_power, 0); } } diff --git a/bitsy/fns.h b/bitsy/fns.h index 2bc3e93d85a402642ecbc34fe90e7ba77b0b1374..e52db50e645ea7642687012d97ce4a4b5325ccda 100644 --- a/bitsy/fns.h +++ b/bitsy/fns.h @@ -1,8 +1,6 @@ #include "../port/portfns.h" -void amplifierpower(int); void audiopower(int); -void audiomute(int); void cacheflush(void); void cachewb(void); void cachewbaddr(void*); diff --git a/bitsy/io.h b/bitsy/io.h index b17235eb5f0242fc2e8f59002df39ccb1ef8c0e4..15abcd2d4ead0ae64f0e76fc8edb50b50dd9ed36 100644 --- a/bitsy/io.h +++ b/bitsy/io.h @@ -248,13 +248,13 @@ extern MemConfRegs *memconfregs; typedef struct PowerRegs PowerRegs; struct PowerRegs { - ulong pmcr; - ulong pssr; - ulong pspr; - ulong pwer; - ulong pcfr; - ulong ppcr; - ulong pgsr; - ulong posr; + ulong pmcr; /* Power manager control register */ + ulong pssr; /* Power manager sleep status register */ + ulong pspr; /* Power manager scratch pad register */ + ulong pwer; /* Power manager wakeup enable register */ + ulong pcfr; /* Power manager general configuration register */ + ulong ppcr; /* Power manager PPL configuration register */ + ulong pgsr; /* Power manager GPIO sleep state register */ + ulong posr; /* Power manager oscillator status register */ }; extern PowerRegs *powerregs; diff --git a/bitsy/power.c b/bitsy/power.c index 32a97d082753647d5c27aa03dbaecb77051bdc03..091b48218c80222562242bbb200eec43d1d89a7e 100644 --- a/bitsy/power.c +++ b/bitsy/power.c @@ -10,17 +10,56 @@ /* Power management for the bitsy */ +int powerup; + +enum { + pmcr_sf = 0, + + pcfr_opde = 0, + pcfr_fp = 1, + pcfr_fs = 2, + pcfr_fo = 3, +}; + static void -powerintr(Ureg*, void *x) +onoffintr(Ureg*, void *x) { - /* Power button interrupt */ + /* On/off button interrupt */ int i; - /* debounce, 50 ms*/ - for (i = 0; i < 50; i++) { - delay(1); - if ((gpioregs->level & GPIO_PWR_ON_i) == 0) - return; /* bounced */ + 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(); } - rs232power(0); +} + +static void +sa1100_power_off(void) +{ + delay(100); + splhi(); + /* disable internal oscillator, float CS lines */ + powerregs->pcfr = 1<ppcr = 0; + /* set all GPIOs to input mode */ + gpioregs->direction = 0; + /* enter sleep mode */ + powerregs->pmcr = 1<