~kris/9p

9hist

446d66db9df0f6e12e316980448a196ad9fb1cfb — David du Colombier 25 years ago 602fc10
Plan 9 from Bell Labs 2000-11-23
4 files changed, 64 insertions(+), 28 deletions(-)

M bitsy/devuda1341.c
M bitsy/fns.h
M bitsy/io.h
M bitsy/power.c
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;
}