|
|
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: #include <sys/const.h> /* HZ */
22:
23: #define PIT 0x40 /* 8253 port */
24: #define TMR0_M3 0x36 /* timer 0, mode 3 */
25:
26: #if 0
27: /* nominal IBM rate is 1.1900 MHz */
28: #define SYS_HZ 1190000L /* rate of input clock to timer 0 */
29: #else
30: /* current kernel rate is 1.1932 MHz */
31: #define SYS_HZ 1193200L /* rate of input clock to timer 0 */
32: #endif
33:
34: typedef int (*PFI)(); /* pointer to function returning int */
35:
36: altclk_rate(hz)
37: unsigned int hz;
38: {
39: int s; /* to save CPU irpt flag */
40: unsigned int interval; /* period for hz, in units of 1.19 MHz ticks */
41: int ret;
42:
43: if (hz >= HZ && hz % HZ == 0) { /* can't go slower than HZ! */
44: interval = SYS_HZ/hz;
45: s = sphi(); /* disable irpts */
46: outb(PIT+3, TMR0_M3);
47: outb(PIT, interval & 0xff);
48: outb(PIT, interval >> 8); /* unsigned shift */
49: spl(s); /* restore previous irpt state */
50: ret = 0;
51: } else {
52: ret = -1;
53: }
54: return ret;
55: }
56:
57: int altclk_in(hz, fn)
58: int hz;
59: PFI fn;
60: {
61: int ret;
62:
63: if ((ret = altclk_rate(hz)) == 0)
64: altclk = fn;
65: return ret;
66: }
67:
68: PFI altclk_out()
69: {
70: PFI ret;
71:
72: ret = altclk;
73: if (ret) {
74: altclk_rate(HZ);
75: altclk = 0;
76: }
77: return ret;
78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.