|
|
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.