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