M bitsy/devuda1341.c => bitsy/devuda1341.c +9 -10
@@ 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);
}
}
M bitsy/fns.h => bitsy/fns.h +0 -2
@@ 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*);
M bitsy/io.h => bitsy/io.h +8 -8
@@ 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;
M bitsy/power.c => bitsy/power.c +47 -8
@@ 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<<pcfr_opde | 1<<pcfr_fp | 1<<pcfr_fs;
+ /* set lowest clock */
+ powerregs->ppcr = 0;
+ /* set all GPIOs to input mode */
+ gpioregs->direction = 0;
+ /* enter sleep mode */
+ powerregs->pmcr = 1<<pmcr_sf;
}