From 5d2faf716f4f0d742ab4bc304057c58634c711f3 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 20 Jun 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-06-20 --- bitsy/devuda1341.c | 3 +- bitsy/fns.h | 1 + bitsy/l.s | 2 +- bitsy/main.c | 3 +- bitsy/power.c | 108 +++++++++++++++++++++++++++++++-------------- bitsy/trap.c | 21 +++++---- 6 files changed, 93 insertions(+), 45 deletions(-) diff --git a/bitsy/devuda1341.c b/bitsy/devuda1341.c index 39219f8adf794163ce6cf4afe389307df13831d6..03e3471e2a7463c254db3cb873e5ccae2d94a586 100644 --- a/bitsy/devuda1341.c +++ b/bitsy/devuda1341.c @@ -939,9 +939,9 @@ audioopen(Chan *c, int mode) outenable(); } mxvolume(); - qunlock(&audio); if (audio.amode & Aread) sendaudio(&audio.o); + qunlock(&audio); if (debug) print("open done\n"); break; @@ -1084,7 +1084,6 @@ audioread(Chan *c, void *v, long n, vlong off) poperror(); qunlock(s); break; - break; case Qstatus: buf[0] = 0; diff --git a/bitsy/fns.h b/bitsy/fns.h index 6a3fa6319df397224ccd1bbd721b8dc143b42d44..019de497ebfa912d275890ea9e398bc172e662fe 100644 --- a/bitsy/fns.h +++ b/bitsy/fns.h @@ -70,6 +70,7 @@ void pcmunmap(int, PCMmap*); void penbutton(int, int); void pentrackxy(int x, int y); void powerinit(void); +void powerkproc(void*); #define procrestore(p) void procsave(Proc*); void procsetup(Proc*); diff --git a/bitsy/l.s b/bitsy/l.s index bf214bae92126373ae0d2dfed42664a0defc2973..ebfb100919a38e15756ae7b5de405d2a701e4ffe 100644 --- a/bitsy/l.s +++ b/bitsy/l.s @@ -527,7 +527,7 @@ TEXT setpowerlabel(SB), $-4 /* Entered after a resume from suspend state. * The bootldr jumps here after a processor reset. - */ + */ TEXT sa1100_power_resume(SB), $-4 MOVW $setR12(SB), R12 /* load the SB */ /* SVC mode, interrupts disabled */ diff --git a/bitsy/main.c b/bitsy/main.c index 4f7227be40a3460c074ad8ff6c21e59d7bef5b59..6e42a913acb3c2c8ec85a8d81ffadf72616cea62 100644 --- a/bitsy/main.c +++ b/bitsy/main.c @@ -37,7 +37,6 @@ main(void) trapinit(); sa1110_uartsetup(1); rs232power(1); - powerinit(); dmainit(); screeninit(); printinit(); /* from here on, print works, before this we need iprint */ @@ -49,6 +48,7 @@ main(void) pageinit(); swapinit(); userinit(); + powerinit(); schedinit(); } @@ -104,6 +104,7 @@ init0(void) poperror(); } kproc("alarm", alarmkproc, 0); + kproc("power", powerkproc, 0); touser(sp); } diff --git a/bitsy/power.c b/bitsy/power.c index 6cc854dabb380603c3c58d52dad728f6b2cc9eb9..d5853e7827af4691a0190f399ec367d6d8df26be 100644 --- a/bitsy/power.c +++ b/bitsy/power.c @@ -13,7 +13,9 @@ * it's only used up to 164/4. * it's only used by routines in l.s */ -ulong power_resume[200/4]; +ulong power_resume[200/4]; +Rendez powerr; +ulong powerflag = 0; /* set to start power-off sequence */ extern void sa1100_power_resume(void); extern int setpowerlabel(void); @@ -72,10 +74,8 @@ gpiocpy(GPIOregs *to, GPIOregs *from) static void sa1100_power_off(void) { - iprint("11.."); /* enable wakeup by µcontroller, on/off switch or real-time clock alarm */ powerregs->pwer = 1 << IRQrtc | 1 << IRQgpio0 | 1 << IRQgpio1; - iprint("12.."); /* clear previous reset status */ resetregs->rcsr = RCSR_all; @@ -98,26 +98,62 @@ sa1100_power_off(void) for(;;); } +static int +bitno(ulong x) +{ + int i; + + for(i = 0; i < 8*sizeof(x); i++) + if((1<level & GPIO_PWR_ON_i) == 0) return; /* bounced */ } + + powerflag = 1; + wakeup(&powerr); +} + +int +powerdown(void *) +{ + return powerflag; +} + +void +deepsleep(void) { + static int power_pl; + power_pl = splhi(); + + /* flush cache */ cachewb(); delay(500); + + /* Save state and setjmp */ if (setpowerlabel()) { + /* return from longjmp, turn everything back on */ mmuinvalidate(); mmuenable(); cacheflush(); trapresume(); - rs232power(1); - clockpower(1); gpclkregs->r0 = 1<<0; gpiocpy(gpioregs, &savedgpioregs); intrcpy(intrregs, &savedintrregs); @@ -126,46 +162,56 @@ onoffintr(Ureg* , void*) gpioregs->edgestatus = (1<icip = (1<kstack; else rem = ((char*)ureg)-((char*)(MACHADDR+sizeof(Mach))); - if(rem < 256) - panic("trap %d bytes remaining", rem); + if(rem < 256) { + dumpstack(); + panic("trap %d bytes remaining, up = 0x%lux, ureg = 0x%lux, at pc 0x%lux", + rem, up, ureg, ureg->pc); + } user = (ureg->psr & PsrMask) == PsrMusr; @@ -338,8 +341,8 @@ trap(Ureg *ureg) } break; case PsrMund: /* undefined instruction */ - /* start of Inferno code [SJM] */ if (user) { + /* look for floating point instructions to interpret */ x = spllo(); rv = fpiarm(ureg); splx(x); @@ -351,7 +354,6 @@ trap(Ureg *ureg) warnregs(ureg, "undefined instruction"); panic("undefined instruction"); } - /* end of Inferno code [SJM] */ break; } @@ -424,8 +426,9 @@ syscall(Ureg* ureg) long ret; int i, scallnr; - if((ureg->psr & PsrMask) != PsrMusr) + if((ureg->psr & PsrMask) != PsrMusr) { panic("syscall: pc 0x%lux r14 0x%lux cs 0x%ux\n", ureg->pc, ureg->r14, ureg->psr); + } m->syscall++; up->insyscall = 1; @@ -757,7 +760,7 @@ _dumpstack(Ureg *ureg) extern ulong etext; if(up == 0){ - print("no current proc\n"); + iprint("no current proc\n"); return; } @@ -769,17 +772,17 @@ _dumpstack(Ureg *ureg) v -= 4; p = (ulong*)v; if((*p & 0x0f000000) == 0x0b000000){ - print("%.8lux=%.8lux ", l, v); + iprint("%.8lux=%.8lux ", l, v); i++; } } if(i == 4){ i = 0; - print("\n"); + iprint("\n"); } } if(i) - print("\n"); + iprint("\n"); } void