|
|
1.1 root 1: /*
2: * mm.c
3: *
4: * Memory Mapped Video
5: * High level output routines.
6: *
7: * $Log: mm.c,v $
8: * Revision 2.3 93/08/09 13:45:55 bin
9: * Kernel 82 changes
10: *
11: * Revision 2.2 93/07/26 15:32:02 nigel
12: * Nigel's R80
13: *
14: * Revision 1.4 92/04/09 10:25:38 hal
15: * Call mmgo() from mmstart() at low priority.
16: *
17: */
18:
19: #include <kernel/timeout.h>
20:
21: #include <sys/coherent.h>
22: #include <sys/sched.h>
23: #include <sys/errno.h>
24: #include <sys/stat.h>
25: #include <sys/io.h>
26: #include <sys/tty.h>
27:
28: /* For beeper */
29: #define TIMCTL 0x43 /* Timer control port */
30: #define TIMCNT 0x42 /* Counter timer port */
31: #define PORTB 0x61 /* Port containing speaker enable */
32: #define FREQ ((int)(1193181L/440)) /* Counter for 440 Hz. tone */
33:
34: int mmtime();
35:
36: char mmbeeps; /* number of ticks remaining on bell */
37: char mmesc; /* last unserviced escape character */
38: int mmcrtsav = 1; /* crt saver enabled */
39: int mmvcnt = 900; /* seconds remaining before crt saver is activated */
40:
41: extern TTY istty;
42:
43: /*
44: * Start the output stream.
45: * Called from `ttwrite' and `isrint' routines.
46: */
47: TIM mmtim;
48:
49: mmstart(tp)
50: register TTY *tp;
51: {
52: int c, s;
53: IO iob;
54: static int mmbegun;
55:
56: if (mmbegun == 0) {
57: ++mmbegun;
58: timeout(&mmtim, HZ/10, mmtime, (char *)tp);
59: }
60:
61: while ((tp->t_flags&T_STOP) == 0) {
62: if ((c = ttout(tp)) < 0)
63: break;
64: iob.io_seg = IOSYS;
65: iob.io_ioc = 1;
66: iob.io.vbase = &c;
67: iob.io_flag = 0;
68: #if 0
69: mmwrite( makedev(2,0), &iob );
70: #else
71: s = splo();
72: mmgo(&iob);
73: spl(s);
74: #endif
75: }
76: }
77:
78: mmtime(xp)
79: char *xp;
80: {
81: register int s;
82:
83: s = sphi();
84: if (mmbeeps < 0) {
85: mmbeeps = 2;
86: outb(TIMCTL, 0xB6); /* Timer 2, lsb, msb, binary */
87: outb(TIMCNT, FREQ&0xFF);
88: outb(TIMCNT, FREQ>>8);
89: outb(PORTB, inb(PORTB) | 03); /* Turn speaker on */
90: }
91: else if ((mmbeeps > 0) && (--mmbeeps == 0))
92: outb( PORTB, inb(PORTB) & ~03 );
93:
94: if (mmesc) {
95: ismmfunc(mmesc);
96: mmesc = 0;
97: }
98: spl(s);
99:
100: ttstart( (TTY *) xp );
101:
102: timeout(&mmtim, HZ/10, mmtime, xp);
103: }
104:
105: /**
106: *
107: * void
108: * mmwatch() -- turn video display off after 15 minutes inactivity.
109: */
110: void
111: mmwatch()
112: {
113: if ( (mmcrtsav > 0) && (mmvcnt > 0) && (--mmvcnt == 0) )
114: mm_voff();
115: }
116:
117: mmwrite( dev, iop )
118: dev_t dev;
119: register IO *iop;
120: {
121: int ioc;
122: int s;
123:
124: /*
125: * Kernel writes.
126: */
127: if (iop->io_seg == IOSYS) {
128: while (mmgo(iop))
129: ;
130: goto mmwdone;
131: }
132:
133: #if 0
134: ioc = iop->io_ioc;
135: /*
136: * Blocking user writes.
137: */
138: if ( (iop->io_flag & IONDLY) == 0 ) {
139: do {
140: while (istty.t_flags & T_STOP) {
141: s = sphi();
142: istty.t_flags |= T_HILIM;
143: sleep((char*) &istty.t_oq,
144: CVTTOUT, IVTTOUT, SVTTOUT);
145: spl( s );
146: }
147: /*
148: * Signal received.
149: */
150: if (nondsig ()) {
151: kbunscroll(); /* update kbd LEDS */
152: /*
153: * No data transferred yet.
154: */
155: if ( ioc == iop->io_ioc )
156: u.u_error = EINTR;
157: /*
158: * Transfer remaining data
159: * without pausing after scrolling.
160: */
161: else while ( mmgo(iop) )
162: ;
163: goto mmwdone;
164: }
165: mmgo(iop);
166: } while ( iop->io_ioc );
167: goto mmwdone;
168: }
169:
170: /*
171: * Non-blocking user writes with output stopped.
172: */
173: if ( istty.t_flags & T_STOP ) {
174: u.u_error = EAGAIN;
175: goto mmwdone;
176: }
177:
178: /*
179: * Non-blocking user writes do not pause after scrolling.
180: */
181: {
182: while ( mmgo(iop) )
183: ;
184: }
185: #else
186: ttwrite(&istty, iop);
187: #endif
188: mmwdone:
189: return;
190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.