|
|
1.1 root 1: /*
2: * SUN-3 console driver
3: */
4: #include "../h/param.h"
5: #include "../h/inode.h"
6: #include "../h/stream.h"
7: #include "../h/ttyio.h"
8: #include "../h/ttyld.h"
9: #include "../h/conf.h"
10: #include "../machine/sunromvec.h"
11:
12: #define TIMEOUT 04
13:
14: short cnstate;
15: struct queue *cnrq;
16: struct queue *cnwq;
17:
18: int cnopen(), cnclose(), cnoput(), nodev();
19:
20: static struct qinit cnrinit = { nodev, NULL, cnopen, cnclose, 0, 0 };
21: static struct qinit cnwinit = { cnoput, NULL, cnopen, cnclose, 200, 100 };
22: struct streamtab cninfo = { &cnrinit, &cnwinit };
23:
24: cnopen(qp, dev)
25: register struct queue *qp;
26: {
27: cnrq = qp;
28: cnwq = WR(qp);
29: return(1);
30: }
31:
32: cnclose(qp)
33: {
34: cnrq = NULL;
35: cnwq = NULL;
36: }
37:
38: /*
39: * Console write put routine
40: */
41: cnoput(q, bp)
42: register struct queue *q;
43: register struct block *bp;
44: {
45: register union stmsg *sp;
46:
47: switch(bp->type) {
48:
49: case M_IOCTL:
50: sp = (union stmsg *)bp->rptr;
51: switch (sp->ioc0.com) {
52:
53: case TIOCGDEV:
54: sp->ioc3.sb.ispeed =
55: sp->ioc3.sb.ospeed = B9600;
56: bp->type = M_IOCACK;
57: qreply(q, bp);
58: return;
59: case TIOCSDEV:
60: bp->wptr = bp->rptr;
61: bp->type = M_IOCACK;
62: qreply(q, bp);
63: return;
64: default:
65: bp->type = M_IOCNAK;
66: bp->wptr = bp->rptr;
67: qreply(q, bp);
68: return;
69: }
70:
71: case M_STOP:
72: cnstate |= TTSTOP;
73: break;
74:
75: case M_START:
76: cnstate &= ~TTSTOP;
77: cnstart();
78: break;
79:
80: case M_FLUSH:
81: flushq(q, 0);
82: break;
83:
84: case M_DELAY:
85: case M_DATA:
86: putq(q, bp);
87: cnstart();
88: return;
89:
90: default:
91: break;
92: }
93: freeb(bp);
94: }
95:
96: /*
97: * Console receive interrupt
98: */
99: /*ARGSUSED*/
100: /*
101: cnrint(dev)
102: {
103: register int c;
104:
105: c = mfpr(RXDB);
106: if (c&RXDB_ID || cnrq==NULL)
107: return;
108: if ((cnrq->next->flag & QFULL) == 0)
109: putd(cnrq->next->qinfo->putp, cnrq->next, c);
110: }
111: */
112:
113: cntime()
114: {
115: cnstate &= ~TIMEOUT;
116: cnstart();
117: }
118:
119: cnstart()
120: {
121: register s;
122: register struct block *bp;
123: register u_char *cp;
124:
125: if (cnwq==NULL)
126: return;
127: s = spl1();
128: while ((cnstate & (TIMEOUT|TTSTOP))==0 && cnwq->count) {
129: bp = getq(cnwq);
130: switch (bp->type) {
131:
132: case M_DATA:
133: /* Must clear high bit for monitor */
134: for(cp = bp->rptr; cp < bp->wptr; cp++)
135: *cp &= 0177;
136: (*romp->v_fwritestr)(bp->rptr, bp->wptr - bp->rptr,
137: romp->v_fbaddr);
138: freeb(bp);
139: break;
140:
141: case M_DELAY:
142: timeout(cntime, (caddr_t)NULL, (int)*bp->rptr);
143: cnstate |= TIMEOUT;
144: freeb(bp);
145: splx(s);
146: return;
147: default:
148: freeb(bp);
149: break;
150: }
151: }
152: splx(s);
153: }
154:
155: /*
156: * Print a character on console.
157: */
158: cnputc(c)
159: register int c;
160: {
161: register int s;
162:
163: s = spl7();
164: if (c == '\n')
165: (*romp->v_putchar)('\r');
166: (*romp->v_putchar)(c);
167: (void) splx(s);
168: }
169:
170: cngetc()
171: {
172: register int c;
173:
174: while ((c = (*romp->v_mayget)()) == -1)
175: ;
176: return (c);
177: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.