|
|
1.1 ! root 1: /* $Header: /src386/STREAMS/coh.386/RCS/clocked.c,v 2.2 93/08/09 13:35:17 bin Exp Locker: bin $ */ ! 2: /* ! 3: * clocked.c - support routines for alternate clock rate ! 4: * ! 5: * altclk_in(hz, fn) - install routine with specified rate ! 6: * "hz" should be a multiple of system rate of 100 Hz ! 7: * return 0 if completed ok, -1 otherwise ! 8: * ! 9: * altclk_out() - uninstall alternate clock routine and restore system rate ! 10: * return old value of "altclk" ! 11: * ! 12: * altclk_rate(hz) - set clock interrupt rate ! 13: * new rate must be an even multiple of system rate "HZ" ! 14: * return 0 if completed ok, -1 otherwise ! 15: * ! 16: * History: ! 17: * 90/08/08 hws initial version, works with hs.c modified for com[1-4] ! 18: * 90/08/14 hws make it more like a Unix system call ! 19: * ! 20: * $Log: clocked.c,v $ ! 21: * Revision 2.2 93/08/09 13:35:17 bin ! 22: * Kernel 82 changes ! 23: * ! 24: * Revision 2.2 93/07/26 15:22:04 nigel ! 25: * Nigel's R80 ! 26: * ! 27: */ ! 28: ! 29: #include <sys/coherent.h> /* altclk */ ! 30: ! 31: #ifdef _I386 ! 32: #include <kernel/param.h> /* HZ */ ! 33: #else ! 34: #include <kernel/const.h> /* HZ */ ! 35: #endif ! 36: ! 37: #define PIT 0x40 /* 8253 port */ ! 38: #define TMR0_M3 0x36 /* timer 0, mode 3 */ ! 39: #define SYS_HZ 1193200L /* rate of input clock to timer 0 */ ! 40: ! 41: typedef int (*PFI)(); /* pointer to function returning int */ ! 42: ! 43: altclk_rate(hz) ! 44: unsigned int hz; ! 45: { ! 46: int s; /* to save CPU irpt flag */ ! 47: unsigned int interval; /* period for hz, in units of 1.19 MHz ticks */ ! 48: int ret; ! 49: ! 50: if (hz >= HZ && hz % HZ == 0) { /* can't go slower than HZ! */ ! 51: interval = SYS_HZ/hz; ! 52: s = sphi(); /* disable irpts */ ! 53: outb(PIT+3, TMR0_M3); ! 54: outb(PIT, interval & 0xff); ! 55: outb(PIT, interval >> 8); /* unsigned shift */ ! 56: spl(s); /* restore previous irpt state */ ! 57: ret = 0; ! 58: } else { ! 59: ret = -1; ! 60: } ! 61: return ret; ! 62: } ! 63: ! 64: int altclk_in(hz, fn) ! 65: int hz; ! 66: PFI fn; ! 67: { ! 68: int ret; ! 69: ! 70: if ((ret = altclk_rate(hz)) == 0) ! 71: altclk = fn; ! 72: return ret; ! 73: } ! 74: ! 75: PFI altclk_out() ! 76: { ! 77: PFI ret; ! 78: ! 79: ret = altclk; ! 80: if (ret) { ! 81: altclk_rate(HZ); ! 82: altclk = 0; ! 83: } ! 84: return ret; ! 85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.