## diffname bitsy/power.c 2000/1122 ## diff -e /dev/null /n/emeliedump/2000/1122/sys/src/9/bitsy/power.c 0a #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "ureg.h" #include "init.h" #include "pool.h" /* Power management for the bitsy */ static void powerintr(Ureg*, void *x) { /* Power 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 */ } rs232power(0); } . ## diffname bitsy/power.c 2000/1123 ## diff -e /n/emeliedump/2000/1122/sys/src/9/bitsy/power.c /n/emeliedump/2000/1123/sys/src/9/bitsy/power.c 25c } 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<level & GPIO_PWR_ON_i) == 0) return; /* bounced */ } powerup = 1; irpower(0); audiopower(0); lcdpower(0); rs232power(0); sa1100_power_off(); . 16c /* On/off button interrupt */ . 14c onoffintr(Ureg*, void *x) . 12a int powerup; enum { pmcr_sf = 0, pcfr_opde = 0, pcfr_fp = 1, pcfr_fs = 2, pcfr_fo = 3, }; . ## diffname bitsy/power.c 2000/1125 ## diff -e /n/emeliedump/2000/1123/sys/src/9/bitsy/power.c /n/emeliedump/2000/1125/sys/src/9/bitsy/power.c 56a /* enable wakeup by µcontroller, on/off switch or real-time clock alarm */ powerregs->pwer = 0x80000003; . 49a 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 */ . 30,48c /* debounce, 50 ms*/ for (i = 0; i < 50; i++) { delay(1); if ((gpioregs->level & GPIO_PWR_ON_i) == 0) return; /* bounced */ . 23a jmp_buf power_resume; . 13,14d ## diffname bitsy/power.c 2000/1130 ## diff -e /n/emeliedump/2000/1125/sys/src/9/bitsy/power.c /n/emeliedump/2000/1130/sys/src/9/bitsy/power.c 67a } void idlehands(void) { } #endif void idlehands(void) { doze(); . 12a #ifdef NOTDEF . 8d ## diffname bitsy/power.c 2000/1207 ## diff -e /n/emeliedump/2000/1130/sys/src/9/bitsy/power.c /n/emeliedump/2000/1207/sys/src/9/bitsy/power.c 79c // doze(); . ## diffname bitsy/power.c 2000/1209 ## diff -e /n/emeliedump/2000/1207/sys/src/9/bitsy/power.c /n/emeliedump/2000/1209/sys/src/9/bitsy/power.c 79c doze(); . ## diffname bitsy/power.c 2001/0324 ## diff -e /n/emeliedump/2000/1209/sys/src/9/bitsy/power.c /n/emeliedump/2001/0324/sys/src/9/bitsy/power.c 79c // doze(); . ## diffname bitsy/power.c 2001/0325 ## diff -e /n/emeliedump/2001/0324/sys/src/9/bitsy/power.c /n/emeliedump/2001/0325/sys/src/9/bitsy/power.c 79c char *msgb = "idlehands called with splhi\n"; char *msga = "doze returns with splhi\n"; if(!islo()){ serialputs(msga, strlen(msga)); spllo(); } doze(); if(!islo()){ serialputs(msgb, strlen(msgb)); spllo(); } . ## diffname bitsy/power.c 2001/0618 ## diff -e /n/emeliedump/2001/0325/sys/src/9/bitsy/power.c /n/emeliedump/2001/0618/sys/src/9/bitsy/power.c 91a . 90a #endif . 78a #ifdef notdef . 75a . 74d 72a intrenable(GPIOrising, bitno(GPIO_PWR_ON_i), onoffintr, (void*)0x12344321, "on/off"); . 71c powerinit(void) . 56,67c int i; for(i = 0; i < 8*sizeof(x); i++) if((1<r0 = 1<<0; gpiocpy(gpioregs, &savedgpioregs); intrcpy(intrregs, &savedintrregs); if (intrregs->icip & (1<edgestatus = (1<icip = (1<status[0] = uart3regs->status[0]; uartcpy(uart1regs,&saveduart1regs); uart1regs->status[0] = uart1regs->status[0]; µcpower(1); screenpower(1); iprint("\nresuming execution\n"); // dumpitall(); delay(800); splx(power_pl); . 39,40d 36,37c power_pl = splhi(); cachewb(); delay(500); if (setpowerlabel()) { mmuinvalidate(); mmuenable(); cacheflush(); trapresume(); . 30,31c } static void intrcpy(Intrregs *to, Intrregs *from) { to->iclr = from->iclr; to->iccr = from->iccr; to->icmr = from->icmr; // interrupts enabled } static void uartcpy(Uartregs *to, Uartregs *from) { to->ctl[0] = from->ctl[0]; // to->ctl[1] = from->ctl[1]; // to->ctl[2] = from->ctl[2]; to->ctl[3] = from->ctl[3]; } static void gpiocpy(GPIOregs *to, GPIOregs *from) { to->rising = from->rising; // gpio intrs enabled to->falling= from->falling; // gpio intrs enabled to->altfunc = from->altfunc; to->direction = from->direction; } static void sa1100_power_off(void) { /* enable wakeup by µcontroller, on/off switch or real-time clock alarm */ powerregs->pwer = 1 << IRQrtc | 1 << IRQgpio0 | 1 << IRQgpio1; /* clear previous reset status */ resetregs->rcsr = RCSR_all; /* disable internal oscillator, float CS lines */ powerregs->pcfr = PCFR_opde | PCFR_fp | PCFR_fs; powerregs->pgsr = 0; /* set resume address. The loader jumps to it */ powerregs->pspr = (ulong)sa1100_power_resume; /* set lowest clock; delay to avoid resume hangs on fast sa1110 */ delay(90); powerregs->ppcr = 0; delay(90); /* set all GPIOs to input mode */ gpioregs->direction = 0; delay(100); /* enter sleep mode */ powerregs->pmcr = PCFR_suspend; for(;;); } void onoffintr(Ureg* , void*) { static int power_pl; int i; for (i = 0; i < 100; i++) { . 27,28c iprint("intr: icip %lux iclr %lux iccr %lux icmr %lux\n", intrregs->icip, intrregs->iclr, intrregs->iccr, intrregs->icmr ); iprint("gpio: lvl %lux dir %lux, re %lux, fe %lux sts %lux alt %lux\n", gpioregs->level, gpioregs->direction, gpioregs->rising, gpioregs->falling, gpioregs->edgestatus, gpioregs->altfunc); iprint("uart1: %lux %lux %lux \nuart3: %lux %lux %lux\n", uart1regs->ctl[0], uart1regs->status[0], uart1regs->status[1], uart3regs->ctl[0], uart3regs->status[0], uart3regs->status[1]); iprint("tmr: osmr %lux %lux %lux %lux oscr %lux ossr %lux oier %lux\n", timerregs->osmr[0], timerregs->osmr[1], timerregs->osmr[2], timerregs->osmr[3], timerregs->oscr, timerregs->ossr, timerregs->oier); iprint("dram: mdcnfg %lux mdrefr %lux cas %lux %lux %lux %lux %lux %lux\n", memconfregs->mdcnfg, memconfregs->mdrefr, memconfregs->mdcas00, memconfregs->mdcas01,memconfregs->mdcas02, memconfregs->mdcas20, memconfregs->mdcas21,memconfregs->mdcas22); iprint("dram: mdcnfg msc %lux %lux %lux mecr %lux\n", memconfregs->msc0, memconfregs->msc1,memconfregs->msc2, memconfregs->mecr); . 25c dumpitall(void) . 23a GPIOregs savedgpioregs; Uartregs saveduart3regs; Uartregs saveduart1regs; Intrregs savedintrregs; . 22d 16,20c extern void sa1100_power_resume(void); extern int setpowerlabel(void); . 12,14c /* saved state during power down. * it's only used up to 164/4. * it's only used by routines in l.s */ ulong power_resume[200/4]; . ## diffname bitsy/power.c 2001/0619 ## diff -e /n/emeliedump/2001/0618/sys/src/9/bitsy/power.c /n/emeliedump/2001/0619/sys/src/9/bitsy/power.c 164a iprint("10.."); . 163a uartpower(0); iprint("rs\n"); . 156,157d 145a irpower(1); audiopower(1); . 140,143c uartpower(1); . 129,130d 87a iprint("12.."); . 85a iprint("11.."); . 64,73d 39,40c R(&sa1110uart[0])->ctl[0], R(&sa1110uart[0])->status[0], R(&sa1110uart[0])->status[1], R(&sa1110uart[1])->ctl[0], R(&sa1110uart[1])->status[0], R(&sa1110uart[1])->status[1]); . 26a #define R(p) ((Uartregs*)((p)->regs)) . 23,24d 21d 18,19c extern void sa1100_power_resume(void); extern int setpowerlabel(void); extern Uart sa1110uart[]; . ## diffname bitsy/power.c 2001/0620 ## diff -e /n/emeliedump/2001/0619/sys/src/9/bitsy/power.c /n/emeliedump/2001/0620/sys/src/9/bitsy/power.c 176,177d 165,168c // irpower(0); // audiopower(0); screenpower(0); µcpower(0); clockpower(0); rs232power(0); uartpower(0); deepsleep(); rs232power(1); uartpower(1); clockpower(1); µcpower(1); screenpower(1); // audiopower(1); // irpower(1); splx(power_pl); iprint("power restored\n"); } . 160,163c power_pl = splhi(); . 158a for(;;){ while(powerflag == 0) sleep(&powerr, powerdown, 0); iprint("starting power down\n"); powerflag = 0; . 157a void powerkproc(void*) { static int power_pl; . 145,153d 141d 129,134d 119,120d 114a /* return from longjmp, turn everything back on */ . 113a /* Save state and setjmp */ . 111a /* flush cache */ . 110a powerflag = 1; wakeup(&powerr); } int powerdown(void *) { return powerflag; } void deepsleep(void) { static int power_pl; . 105a /* Power down interrupt comes on power button release. * Act only after button has been released a full 100 ms */ if (powerflag) return; . 104d 100a 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 */ . 207,210c /* Power down interrupt comes on power button release. * Act only after button has been released a full 100 ms */ . 205c void onoffintr(Ureg* , void*) { int i; . 200,203c } } . 197a deepsleep(); delay(2000); . 192d 169a delay(1000); xsp = getsp(); xlink = getlink(); iprint("power restored, sp = %lux, link = %lux\n", xsp, xlink); . 144a xsp = getsp(); xlink = getlink(); iprint("starting power down, sp = %lux, link = %lux\n", xsp, xlink); delay(1000); . 142a void *xsp, *xlink; . 112,133d 96a . 90c // powerregs->ppcr = 0; . 88a . 87c // powerregs->pspr = (ulong)sa1100_power_resume; // powerregs->pspr = (ulong)_start; . 82a sa1100_power_resume(); . 76a cacheflush(); mmuinvalidate(); mmudisable(); . 73a void (*restart)(void) = nil; . 21a extern void _start(void); . ## diffname bitsy/power.c 2001/0623 ## diff -e /n/emeliedump/2001/0622/sys/src/9/bitsy/power.c /n/emeliedump/2001/0623/sys/src/9/bitsy/power.c 184c // rs232power(0); . 182c // screenpower(0); . 101c powerregs->ppcr = 0; . 97c powerregs->pspr = (ulong)_start; . 90,91d 83a iprint("calling resume\n"); sa1100_power_resume(); . 80,82d ## diffname bitsy/power.c 2001/0626 ## diff -e /n/emeliedump/2001/0623/sys/src/9/bitsy/power.c /n/emeliedump/2001/0626/sys/src/9/bitsy/power.c 81,83d ## diffname bitsy/power.c 2001/0731 ## diff -e /n/emeliedump/2001/0626/sys/src/9/bitsy/power.c /n/emeliedump/2001/0731/sys/src/9/bitsy/power.c 220,222c powerflag = 1; wakeup(&powerr); . 198d 192d 179c rs232power(0); . 177c screenpower(0); . 160,163c xsp = getsp(); xlink = getlink(); iprint("power restored, sp = %lux, link = %lux\n", xsp, xlink); delay(1000); . 131,134c xsp = getsp(); xlink = getlink(); iprint("starting power down, sp = %lux, link = %lux\n", xsp, xlink); delay(1000); . 91,92c powerregs->pspr = (ulong)sa1100_power_resume; . ## diffname bitsy/power.c 2001/0808 ## diff -e /n/emeliedump/2001/0731/sys/src/9/bitsy/power.c /n/emeliedump/2001/0808/sys/src/9/bitsy/power.c 91c // powerregs->pspr = (ulong)sa1100_power_resume; powerregs->pspr = 0; . 81c /* enable wakeup by µcontroller, on/off switch * or real-time clock alarm */ . ## diffname bitsy/power.c 2001/0809 ## diff -e /n/emeliedump/2001/0808/sys/src/9/bitsy/power.c /n/emeliedump/2001/0809/sys/src/9/bitsy/power.c 162,166d 156d 145,146c uartpower(1); // irpower(1); // audiopower(1); . 133,136d 96a sa1100_power_resume(); . ## diffname bitsy/power.c 2001/0810 ## diff -e /n/emeliedump/2001/0809/sys/src/9/bitsy/power.c /n/emeliedump/2001/0810/sys/src/9/bitsy/power.c 162,173d 147,153d 137,139c mmurestart(); gpiorestore(gpioregs, &savedgpioregs); delay(50); intrcpy(intrregs, &savedintrregs); if (intrregs->icip & (1<edgestatus = (1<icip = (1<ppcr = 0; // delay(90); . 97,100c //sa1100_power_resume(); . 93,95c powerregs->pspr = (ulong)sa1100_power_resume; // powerregs->pspr = 0; . 74a static void gpiorestore(GPIOregs *to, GPIOregs *from) { to->rising = from->rising; // gpio intrs enabled to->falling= from->falling; // gpio intrs enabled to->altfunc = from->altfunc; to->direction = from->direction; to->set = from->level & 0x0fffffff; to->clear = ~from->level & 0x0fffffff; } . 68a to->level = from->level; . 67c gpiosave(GPIOregs *to, GPIOregs *from) . ## diffname bitsy/power.c 2001/0811 ## diff -e /n/emeliedump/2001/0810/sys/src/9/bitsy/power.c /n/emeliedump/2001/0811/sys/src/9/bitsy/power.c 198a iprint("deepsleep returned\n"); . 197a iprint("call deepsleep\n"); . 181c dumpitall(); . 161a /* Turn off memory auto power */ memconfregs->mdrefr &= ~0x30000000; . 149a dumpitall(); . ## diffname bitsy/power.c 2001/0812 ## diff -e /n/emeliedump/2001/0811/sys/src/9/bitsy/power.c /n/emeliedump/2001/0812/sys/src/9/bitsy/power.c 184a xlink = getcallerpc(&xlink); iprint("\nresuming execution, sp = 0x%lux, pc = 0x%lux, psw = 0x%lux\n", &xsp, xlink, splhi()); . 183d 149c iprint("entering suspend mode, sp = 0x%lux, pc = 0x%lux, psw = 0x%lux\n", &xsp, xlink, power_pl); . 147a xlink = getcallerpc(&xlink); . 144c ulong xsp, xlink; . ## diffname bitsy/power.c 2001/0813 ## diff -e /n/emeliedump/2001/0812/sys/src/9/bitsy/power.c /n/emeliedump/2001/0813/sys/src/9/bitsy/power.c 190a wbflush(); delay(50); . 188a // irpower(1); // audiopower(1); µcpower(1); screenpower(1); . 187d 184a delay(100); . 182,183c rs232power(1); uartpower(1); . 176,179d 158a clockpower(0); . 157a power_pl = splhi(); iprint("entering suspend mode, sp = 0x%lux, pc = 0x%lux, psw = 0x%lux\n", &xsp, xlink, power_pl); dumpitall(); delay(100); uartpower(0); . 150,153d 146,147d 84a to->rising = from->rising; // gpio intrs enabled to->falling= from->falling; // gpio intrs enabled . 82a to->altfunc = from->altfunc; . 79,81d 54,55c iprint("powerregs: pmcr %lux pssr %lux pcfr %lux ppcr %lux pwer %lux pspr %lux pgsr %lux posr %lux\n", powerregs->pmcr, powerregs->pssr, powerregs->pcfr, powerregs->ppcr, powerregs->pwer, powerregs->pspr, powerregs->pgsr, powerregs->posr); . ## diffname bitsy/power.c 2001/0814 ## diff -e /n/emeliedump/2001/0813/sys/src/9/bitsy/power.c /n/emeliedump/2001/0814/sys/src/9/bitsy/power.c 208c xlink1 = getcallerpc(&xlink1); iprint("deepsleep returned, pc = 0x%lux, sp = 0x%lux\n", xlink1, &xlink); . 206c xlink = getcallerpc(&xlink); iprint("call deepsleep, pc = 0x%lux, sp = 0x%lux\n", xlink, &xlink); . 200a ulong xlink, xlink1; . 193a mmuinvalidate(); delay(10); . 176a // mmurestart(); . 171c if(intrregs->icip & (1<mdrefr &= ~0x30000000; memconfregs->mecr = mecr; . 174a /* return here with mmu back on */ . 173a mecr = memconfregs->mecr; . 163,164c iprint("entering suspend mode, sp = 0x%lux, pc = 0x%lux, psw = 0x%ux\n", &xsp, xlink, power_pl); . 152,157d 150a power_pl = splhi(); . 147,149c ulong xsp, xlink, mecr; . 114,116c /* Doesn't work [sjm] delay(90); powerregs->ppcr = 0; delay(90); */ . 58a checkpagetab(); checkflash(); // checkktext(); iprint("\n\n"); . 54,55c iprint("mmu: CpControl %lux CpTTB %lux CpDAC %lux l1table 0x%lux\n", getcontrol(), getttb(), getdac(), l1table); . 32a extern ulong l1table; . 30a checkflash(void) { ulong *p; ulong s; s = 0; for (p = (ulong*)FLASHZERO; p < (ulong*)(FLASHZERO+8*1024*1024); p++) s += *p; iprint("flash checksum is 0x%lux\n", s); } static void checkpagetab(void) { extern ulong l1table; ulong *p; ulong s; s = 0; for (p = (ulong*)l1table; p < (ulong*)(l1table+16*1024); p++) s += *p; iprint("page table checksum is 0x%lux\n", s); } static void checkktext(void) { /* check the kernel text */ ulong *p, *q; ulong s; s = 0; if (savedtext == nil){ savedtext=malloc((ulong)etext-(ulong)_start); if (savedtext == nil) iprint("can't malloc savedtext\n"); memmove(savedtext, _start, (ulong)etext-(ulong)_start); }else{ for (p = (ulong*)_start, q = (ulong*)savedtext; p < (ulong*)(etext); p++,q++) { if (*p != *q) { iprint("0x%lux: 0x%lux != 0x%lux\n", p, *p, *q); s++; } } if (s == 0) iprint("ktext ok\n"); } } static void . 29a uchar *savedtext; . ## diffname bitsy/power.c 2001/0816 ## diff -e /n/emeliedump/2001/0815/sys/src/9/bitsy/power.c /n/emeliedump/2001/0816/sys/src/9/bitsy/power.c 249a dumpitall(); delay(1000); . 246d 241d 227a trapresume(); . 217c delay(1000); . 181a /* Doesn't work [sjm] powerregs->ppcr = 0; */ . 171,175d 162c powerregs->pcfr = PCFR_opde; . 151a /* Set KAPD and EAPD bits */ memconfregs->mdrefr |= 0x30000000; . 114c checkktext(); . 80a . 65,78c for (p = (ulong*)l1table; p < (ulong*)(l1table+16*1024); p++) s += *p; iprint("page table checksum is 0x%lux\n", s); . 60,61c extern ulong l1table; ulong *p; . 58c checkpagetab(void) . 54c } iprint("page 0x%lux checksum 0x%lux\n", (ulong)(p-1)&~0x1fff, s); . 52c for (p = (ulong*)_start; p < (ulong*)etext; p++){ if(*p == 0) iprint("0x%lux->0\n", p); if (((ulong)p & 0x1fff) == 0){ iprint("page 0x%lux checksum 0x%lux\n", (ulong)(p-1)&~0x1fff, s); s = 0; } . 47d 45c checkktext(void) . ## diffname bitsy/power.c 2001/0817 ## diff -e /n/emeliedump/2001/0816/sys/src/9/bitsy/power.c /n/emeliedump/2001/0817/sys/src/9/bitsy/power.c 256c delay(100); . 178a memconfregs->mdrefr |= 0x80000000; . 177a delay(500); . 176c /* set lowest clock; delay to avoid resume hangs on fast sa1110 */ /* Doesn't work [sjm] . 167,170d 165d 161c powerregs->pcfr = PCFR_opde|PCFR_fp|PCFR_fs; . 150c // memconfregs->mdrefr |= 0x30000000; . ## diffname bitsy/power.c 2001/0818 ## diff -e /n/emeliedump/2001/0817/sys/src/9/bitsy/power.c /n/emeliedump/2001/0818/sys/src/9/bitsy/power.c 174,177c µdelay(90); memconfregs->msc0 &= ~0x30003; memconfregs->msc1 &= ~0x30003; memconfregs->msc2 &= ~0x30003; memconfregs->mdrefr = refr; /* Clear dri 0 ⋯ 11 */ refr |= 1<mdrefr = refr; /* Set selfrefresh */ . 172c memconfregs->mdrefr |= 1<<22; µdelay(90); . 168,169d 150c refr = memconfregs->mdrefr; refr |= 1<mdrefr = refr; /* Set selfrefresh */ . 180a refr &= ~0xfff0; . ## diffname bitsy/power.c 2001/0821 ## diff -e /n/emeliedump/2001/0820/sys/src/9/bitsy/power.c /n/emeliedump/2001/0821/sys/src/9/bitsy/power.c 265d 146,189d 20c extern void power_resume(void); . 16c ulong power_state[200/4]; . ## diffname bitsy/power.c 2001/0822 ## diff -e /n/emeliedump/2001/0821/sys/src/9/bitsy/power.c /n/emeliedump/2001/0822/sys/src/9/bitsy/power.c 291d 278d ## diffname bitsy/power.c 2002/0408 ## diff -e /n/emeliedump/2001/0822/sys/src/9/bitsy/power.c /n/emeliedump/2002/0408/sys/src/9/bitsy/power.c 239c // iprint("deepsleep returned, pc = 0x%lux, sp = 0x%lux\n", xlink1, &xlink); . 235c // iprint("call deepsleep, pc = 0x%lux, sp = 0x%lux\n", xlink, &xlink); . 209c // dumpitall(); . 176c // dumpitall(); . ## diffname bitsy/power.c 2002/0411 ## diff -e /n/emeliedump/2002/0408/sys/src/9/bitsy/power.c /n/emeliedump/2002/0411/sys/src/9/bitsy/power.c 271a addclock0link(blanktimer); . 268a static void blanktimer(void) { drawactive(0); } . ## diffname bitsy/power.c 2002/0412 ## diff -e /n/emeliedump/2002/0411/sys/src/9/bitsy/power.c /n/emeliedump/2002/0412/sys/src/9/bitsy/power.c 294c uartputs(msgb, strlen(msgb)); . 289c uartputs(msga, strlen(msga)); . ## diffname bitsy/power.c 2002/0424 ## diff -e /n/emeliedump/2002/0412/sys/src/9/bitsy/power.c /n/emeliedump/2002/0424/sys/src/9/bitsy/power.c 212c audiopower(1); . 209c dumpitall(); . 176c dumpitall(); . ## diffname bitsy/power.c 2002/0518 ## diff -e /n/emeliedump/2002/0424/sys/src/9/bitsy/power.c /n/emeliedump/2002/0518/sys/src/9/bitsy/power.c 242a // iprint("deepsleep returned, pc = 0x%lux, sp = 0x%lux\n", xlink1, &xlink); . 239d 212c // audiopower(1); . 209c // dumpitall(); . 192c // memconfregs->mecr = mecr; . 176c // dumpitall(); . 169a *resumeaddr = (ulong) power_resume; // *resumeaddr = nil; . 166a extern void power_resume(void); . 31a . 16a ulong resumeaddr[1]; . ## diffname bitsy/power.c 2002/0604 ## diff -e /n/emeliedump/2002/0518/sys/src/9/bitsy/power.c /n/emeliedump/2002/0604/sys/src/9/bitsy/power.c 283a extern ulong power_magic; extern ulong power_code; extern ulong doze_code; ulong *p, *q, i; p = (ulong*)(((ulong)&power_magic + 0x1f) & ~0x1f); q = &power_code; for (i = 0; i < 8; i++) *p++ = *q++; p = (ulong*)(((ulong)doze + 0x3f) & ~0x1f); q = &doze_code; for (i = 0; i < 3; i++) *p++ = *q++; *resumeaddr = (ulong) power_resume; . 191c // mecr = memconfregs->mecr; . 174,175d 168c ulong xsp, xlink; // ulong mecr; . 33d ## diffname bitsy/power.c 2002/0618 ## diff -e /n/emeliedump/2002/0604/sys/src/9/bitsy/power.c /n/emeliedump/2002/0618/sys/src/9/bitsy/power.c 218a pcmciapower(1); . 174a pcmciapower(0); . ## diffname bitsy/power.c 2002/0619 ## diff -e /n/emeliedump/2002/0618/sys/src/9/bitsy/power.c /n/emeliedump/2002/0619/sys/src/9/bitsy/power.c 320d 298d ## diffname bitsy/power.c 2002/0625 ## diff -e /n/emeliedump/2002/0619/sys/src/9/bitsy/power.c /n/emeliedump/2002/0625/sys/src/9/bitsy/power.c 220c // pcmciapower(1); . 217c audiopower(1); . 195,198d 190d ## diffname bitsy/power.c 2002/0626 ## diff -e /n/emeliedump/2002/0625/sys/src/9/bitsy/power.c /n/emeliedump/2002/0626/sys/src/9/bitsy/power.c 215c pcmciapower(1); . ## diffname bitsy/power.c 2002/1017 ## diff -e /n/emeliedump/2002/0626/sys/src/9/bitsy/power.c /n/emeliedump/2002/1017/sys/src/9/bitsy/power.c 294c addclock0link(blanktimer, 1000/HZ); . ## diffname bitsy/power.c 2002/1112 ## diff -e /n/emeliedump/2002/1017/sys/src/9/bitsy/power.c /n/emeliedump/2002/1112/sys/src/9/bitsy/power.c 313a . 294a addclock0link(suspendtimer, 1000/HZ); . 276a resetsuspendtimer(void) { suspendtime = 60 * HZ; } static void suspendtimer(void) { uvlong now; return; // does not work well. if (suspendtime > 0) suspendtime--; if (suspendtime == 0){ now = seconds(); if (now < lastsuspend + 10){ resetsuspendtimer(); return; } lastsuspend = seconds(); deepsleep(); lastsuspend = seconds(); return; } } void . 275a static ulong suspendtime = 120 * HZ; static int lastsuspend; . 220a savedtod = todgetoff(); . 203a todsetoff( savedtod + clkd * TODFREQ); resetsuspendtimer(); . 202c clkd = clockpower(1); . 168a ulong clkd; vlong savedtod; . 33a todsetoff(vlong off) { tod.off = off; } static void . 32a static vlong todgetoff(void) { return tod.off; } . 11a /* * Very ugly. This is just to get/set the offset field without * touching port/tod.c. */ #define TODFREQ 1000000000LL extern struct { ulong cnt; Lock; vlong multiplier; // t = off + (multiplier*ticks)>>31 vlong hz; // frequency of fast clock vlong last; // last reading of fast clock vlong off; // offset from epoch to last vlong lasttime; // last return value from todget vlong delta; // add 'delta' each slow clock tick from sstart to send ulong sstart; // ... ulong send; // ... } tod; . ## diffname bitsy/power.c 2002/1121 ## diff -e /n/emeliedump/2002/1112/sys/src/9/bitsy/power.c /n/emeliedump/2002/1121/sys/src/9/bitsy/power.c 257c savedtod = todget(nil); . 238c todset(savedtod + clkd * TODFREQ, 0LL, 0); . 60,65d 53,58d 36a . 31d 18,29d 12,16d