| plan 9 kernel history: overview | file list | diff list |
2002/0410/pc/i8253.c (diff list | history)
| 2002/0409/sys/src/9/pc/i8253.c:46,56 – 2002/0410/sys/src/9/pc/i8253.c:46,51 (short | long | prev | next) | ||
| 2000/0623 | Trigger=0x0, /* interrupt on terminal count */ Sstrobe=0x8, /* software triggered strobe */ | |
| 1997/0327 | ||
| 2000/0623 |
| |
| 2002/0409 | /* T2ctl bits */ T2gate= (1<<0), /* enable T2 counting */ T2spkr= (1<<1), /* connect T2 out to speaker */ | |
| 2002/0409/sys/src/9/pc/i8253.c:57,83 – 2002/0410/sys/src/9/pc/i8253.c:52,74 | ||
| 2002/0409 | T2out= (1<<5), /* output of T2 */ | |
| 1997/0327 | Freq= 1193182, /* Real clock frequency */ | |
| 2002/0409 |
| |
| 2000/0623 | ||
| 2000/0706 |
| |
| 2000/0623 |
| |
| 2002/0410 | Tickshift=8, /* extra accuracy */ MaxPeriod=Freq/HZ, MinPeriod=Freq/(100*HZ), | |
| 1997/0327 | }; | |
| 2000/0623 | static struct { | |
| 2000/0627 | Lock; | |
| 2002/0410 | ulong period; /* current clock period */ | |
| 2000/0701 | int enabled; | |
| 2000/0627 |
| |
| 2000/0623 |
| |
| 2002/0405 |
| |
| 2000/0623 |
| |
| 2002/0410 | uvlong hz; | |
| 2002/0405 | ||
| 2002/0409 | ushort last; /* last value of clock 1 */ uvlong ticks; /* cumulative ticks of counter 1 */ | |
| 2000/0623 | }i8253; | |
| 2000/0622 | ||
| 2002/0410 | ||
| 1997/0327 | void | |
| 2002/0405 | i8253init(void) | |
| 1997/0327 | { | |
| 2002/0409/sys/src/9/pc/i8253.c:87,98 – 2002/0410/sys/src/9/pc/i8253.c:78,89 | ||
| 2002/0405 | ioalloc(T2ctl, 1, 0, "i8253.cntr2ctl"); | |
| 2000/0623 | ||
| 2002/0405 | /* | |
| 2002/0410 | * enable a 1/HZ interrupt for providing scheduling interrupts | |
| 2002/0405 | */ outb(Tmode, Load0|Square); | |
| 2002/0410 | i8253.period = Freq/HZ; | |
| 1998/0903 | ||
| 2002/0405 | /* | |
| 2002/0409 | * enable a longer period counter to use as a clock | |
| 2002/0409/sys/src/9/pc/i8253.c:100,109 – 2002/0410/sys/src/9/pc/i8253.c:91,101 | ||
| 2002/0409 | outb(Tmode, Load2|Square); outb(T2cntr, 0); /* low byte */ outb(T2cntr, 0); /* high byte */ | |
| 2002/0410 | i8253.period = Freq/HZ; | |
| 2002/0409 | x = inb(T2ctl); x |= T2gate; outb(T2ctl, x); | |
| 2002/0405 | ||
| 2002/0410 | ||
| 2002/0405 | /* * Introduce a little delay to make sure the count is * latched and the timer is counting down; with a fast | |
| 2002/0409/sys/src/9/pc/i8253.c:189,285 – 2002/0410/sys/src/9/pc/i8253.c:181,238 | ||
| 1999/0131 | m->cpumhz = (cpufreq + cpufreq/200)/1000000; m->cpuhz = cpufreq; } | |
| 2002/0410 | i8253.hz = Freq<<Tickshift; | |
| 1997/0327 | } | |
| 2000/0627 |
| |
| 2002/0405 |
| |
| 2000/0627 |
| |
| 2000/0621 |
| |
| 2000/0627 |
| |
| 2002/0410 | ulong i8253periodset; void i8253timerset(uvlong next) | |
| 2000/0621 | { | |
| 2000/0623 |
| |
| 2002/0410 | ulong period; ulong want; ulong now; | |
| 2000/0623 | ||
| 2002/0405 |
| |
| 2000/0627 |
| |
| 2002/0410 | want = next>>Tickshift; now = i8253.ticks; /* assuming whomever called us just did fastticks() */ | |
| 2000/0627 | ||
| 2000/0623 |
| |
| 2000/0627 |
| |
| 2000/0706 |
| |
| 2000/0627 |
| |
| 2002/0410 | period = MaxPeriod; if(next != 0){ period = want - now; if(period < MinPeriod) period = MinPeriod; else if(period > (4*MaxPeriod)/5) /* strong attraction to MaxPeriod */ period = MaxPeriod; | |
| 2000/0627 | } | |
| 2000/0623 | ||
| 2000/0701 |
| |
| 2002/0405 |
| |
| 2000/0701 |
| |
| 2002/0405 |
| |
| 2000/0701 |
| |
| 2002/0410 | /* histeresis */ if(i8253.period != period){ ilock(&i8253); /* load new value */ outb(Tmode, Load0|Square); outb(T0cntr, period); /* low byte */ outb(T0cntr, period>>8); /* high byte */ | |
| 2000/0701 | ||
| 2000/0627 |
| |
| 2002/0405 |
| |
| 2000/0701 |
| |
| 2002/0410 | /* remember period */ i8253.period = period; i8253periodset++; iunlock(&i8253); | |
| 2000/0701 | } | |
| 2000/0627 |
| |
| 2002/0410 | i8253clock(Ureg* ureg, void*) | |
| 2000/0627 | { | |
| 2000/0713 | ||
| 2002/0405 |
| |
| 2000/0627 |
| |
| 2002/0406 | ||
| 2000/0627 |
| |
| 2002/0405 |
| |
| 2002/0410 | timerintr(ureg, 0); | |
| 2000/0621 | } | |
| 1997/0327 | void i8253enable(void) { | |
| 2002/0405 |
| |
| 2000/0701 | i8253.enabled = 1; | |
| 2000/0621 |
| |
| 2002/0410 | i8253.period = Freq/HZ; intrenable(IrqCLOCK, i8253clock, 0, BUSUNKNOWN, "clock"); | |
| 1997/0327 | } | |
| 1998/0710 | /* | |
| 2002/0409/sys/src/9/pc/i8253.c:294,300 – 2002/0410/sys/src/9/pc/i8253.c:247,253 | ||
| 2002/0405 | uvlong ticks; | |
| 1998/0710 | if(hz) | |
| 2002/0409 |
| |
| 2002/0410 | *hz = i8253.hz; | |
| 2002/0405 | ||
| 2002/0409 | ilock(&i8253); outb(Tmode, Latch2); | |
| 2002/0409/sys/src/9/pc/i8253.c:304,310 – 2002/0410/sys/src/9/pc/i8253.c:257,263 | ||
| 2002/0409 | if(y < i8253.last) x = i8253.last - y; | |
| 2002/0405 | else | |
| 2002/0409 |
| |
| 2002/0410 | x = i8253.last + (0x10000 - y); | |
| 2002/0409 | i8253.last = y; i8253.ticks += x>>1; ticks = i8253.ticks; | |
| 2002/0409/sys/src/9/pc/i8253.c:313,323 – 2002/0410/sys/src/9/pc/i8253.c:266,299 | ||
| 2002/0409 | return ticks<<Tickshift; | |
| 2002/0405 | } | |
| 2002/0410 | void delay(int millisecs) | |
| 2002/0405 | { | |
| 2002/0410 | millisecs *= m->loopconst; if(millisecs <= 0) millisecs = 1; aamloop(millisecs); } void microdelay(int microsecs) { microsecs *= m->loopconst; microsecs /= 1000; if(microsecs <= 0) microsecs = 1; aamloop(microsecs); } ulong TK2MS(ulong ticks) { uvlong t, hz; t = ticks; hz = HZ; t *= 1000L; t = t/hz; ticks = t; return ticks; | |
| 1998/0710 | } | |