1: /*
2: * DZ11 driver
3: * CAUTION -- MODIFIED FROM WORKING VERSION BUT NEVER PROPERLY TESTED
4: */
5:
6: #include "../h/param.h"
7: #include "../h/dir.h"
8: #include "../h/user.h"
9: #include "../h/tty.h"
10:
11: struct device *dz_addr[] = { (struct device *)0160100, (struct device *)0160110};
12: int dz_cnt = 16;
13: struct tty dz_tty[16];
14: char dz_stat;
15:
16: char dz_speeds[] = {
17: 0, 020, 021, 022, 023, 024, 0, 025,
18: 026, 027, 030, 032, 034, 036, 0, 0,
19: };
20:
21: #define BITS7 020
22: #define BITS8 030
23: #define TWOSB 040
24: #define PENABLE 0100
25: #define OPAR 0200
26: #define RCVENA 010000
27:
28: #define IE 040140
29: #define PERROR 010000
30: #define FRERROR 020000
31: #define SSPEED 7 /* standard speed: 300 baud */
32:
33: struct device {
34: int dzcsr, dzrbuf;
35: char dztcr, dzdtr;
36: char dztbuf, dzbrk;
37: };
38: #define dzlpr dzrbuf
39: #define dzmsr dzbrk
40:
41: #define ON 1
42: #define OFF 0
43:
44:
45: dzopen(dev, flag)
46: {
47: register struct tty *tp;
48: int x;
49: extern dzstart(), dzscan();
50:
51: x = dev;
52: dev = minor(dev);
53: if (dev >= dz_cnt) {
54: u.u_error = ENXIO;
55: return;
56: }
57: tp = &dz_tty[dev];
58: if ((tp->t_state&(ISOPEN|WOPEN)) == 0) {
59: tp->t_oproc = dzstart;
60: tp->t_iproc = NULL;
61: ttychars(tp);
62: tp->t_ispeed = SSPEED;
63: tp->t_ospeed = SSPEED;
64: tp->t_flags = ODDP|EVENP|ECHO;
65: dzparam(dev);
66: }
67: dzmodem(dev, ON);
68: spl6();
69: while ((tp->t_state&CARR_ON)==0) {
70: tp->t_state |= WOPEN;
71: sleep((caddr_t)&tp->t_rawq, TTIPRI);
72: }
73: ttyopen(x,tp);
74: spl0();
75: }
76:
77: dzclose(dev)
78: {
79: register struct tty *tp;
80:
81: dev = minor(dev);
82: tp = &dz_tty[dev];
83: wflushtty(tp);
84: if (tp->t_state&HUPCLS) {
85: dzmodem(dev, OFF);
86: }
87: tp->t_state &= CARR_ON;
88: }
89:
90: dzread(dev)
91: {
92: dev = minor(dev);
93: ttread(&dz_tty[dev]);
94: }
95:
96: dzwrite(dev)
97: {
98: dev = minor(dev);
99: ttwrite(&dz_tty[dev]);
100: }
101:
102: dzioctl(dev, cmd, addr, flag)
103: {
104: register struct tty *tp;
105:
106: dev = minor(dev);
107: tp = &dz_tty[dev];
108: if (ttioccomm(cmd, tp, (caddr_t)addr, dev)) {
109: if (cmd==TIOCSETP||cmd==TIOCSETN)
110: dzparam(dev);
111: } else {
112: u.u_error = ENOTTY;
113: }
114: }
115:
116: dzparam(dev)
117: {
118: register struct tty *tp;
119: register struct device *dzaddr;
120: register lpr;
121:
122: tp = &dz_tty[dev];
123: dzaddr= dz_addr[dev>>3];
124: dzaddr->dzcsr = IE;
125: if (dz_stat==0) {
126: dzscan();
127: dz_stat++;
128: }
129: if (tp->t_ispeed==0) { /* Hang up line */
130: dzmodem(dev, OFF);
131: return;
132: }
133: lpr = (dz_speeds[tp->t_ispeed]<<8)|(dev&07);
134: if (tp->t_flags&RAW)
135: lpr |= BITS8;
136: else
137: lpr |= BITS7|PENABLE;
138: if ((tp->t_flags&EVENP)==0)
139: lpr |= OPAR;
140: if (tp->t_ispeed == 3) /* 110 baud */
141: lpr |= TWOSB;
142: dzaddr->dzlpr = lpr;
143: }
144:
145: dzrint(dev)
146: {
147: register struct tty *tp;
148: register c;
149: register struct device *dzaddr;
150:
151: dzaddr = dz_addr[dev];
152: while ((c = dzaddr->dzrbuf) < 0) { /* char. present */
153: tp = &dz_tty[((c>>8)&07)|(dev<<3)];
154: if (tp >= &dz_tty[dz_cnt])
155: continue;
156: if((tp->t_state&ISOPEN)==0) {
157: wakeup((caddr_t)&tp->t_rawq);
158: continue;
159: }
160: if (c&FRERROR) /* break */
161: if (tp->t_flags&RAW)
162: c = 0; /* null (for getty) */
163: else
164: c = 0177; /* DEL (intr) */
165: if (c&PERROR)
166: if ((tp->t_flags&(EVENP|ODDP))==EVENP
167: || (tp->t_flags&(EVENP|ODDP))==ODDP )
168: continue;
169: ttyinput(c, tp);
170: }
171: }
172:
173: dzxint(dev)
174: {
175: register struct tty *tp;
176: register struct device *dzaddr;
177:
178: dzaddr = dz_addr[dev];
179: while(dzaddr->dzcsr<0) { /* TX rdy */
180: tp = &dz_tty[((dev<<3)|(dzaddr->dzcsr>>8)&07)];
181: dzaddr->dztbuf = tp->t_char;
182: tp->t_state &= ~BUSY;
183: dzstart(tp);
184: }
185: }
186:
187: dzstart(tp)
188: register struct tty *tp;
189: {
190: register unit, c;
191: int s;
192: struct device *dzaddr;
193: extern ttrstrt();
194:
195: unit = tp - dz_tty;
196: dzaddr = dz_addr[unit>>3];
197: unit = 1<<(unit&07);
198: s = spl5();
199: if (tp->t_state&(TIMEOUT|BUSY)) {
200: splx(s);
201: return;
202: }
203: if (tp->t_state&TTSTOP) {
204: dzaddr->dztcr &= ~unit;
205: splx(s);
206: return;
207: }
208: if ((c=getc(&tp->t_outq)) >= 0) {
209: if (c>=0200 && (tp->t_flags&RAW)==0) {
210: dzaddr->dztcr &= ~unit;
211: tp->t_state |= TIMEOUT;
212: timeout(ttrstrt, (caddr_t)tp, (c&0177)+6);
213: } else {
214: tp->t_char = c;
215: tp->t_state |= BUSY;
216: dzaddr->dztcr |= unit;
217: }
218: if (tp->t_outq.c_cc<=TTLOWAT && tp->t_state&ASLEEP) {
219: tp->t_state &= ~ASLEEP;
220: wakeup((caddr_t)&tp->t_outq);
221: }
222: } else
223: dzaddr->dztcr &= ~unit;
224: splx(s);
225: }
226:
227: dzmodem(dev, flag)
228: {
229: register struct device *dzaddr;
230: register bit;
231:
232: dzaddr = dz_addr[dev>>3];
233: bit = 1<<(dev&07);
234: if (flag==OFF)
235: dzaddr->dzdtr &= ~bit;
236: else dzaddr->dzdtr |= bit;
237: }
238:
239: dzscan()
240: {
241: register i;
242: register struct device *dzaddr;
243: register struct tty *tp;
244: char bit;
245:
246: for (i=0; i<dz_cnt; i++) {
247: dzaddr = dz_addr[i>>3];
248: tp = &dz_tty[i];
249: bit = 1<<(i&07);
250: if (dzaddr->dzmsr&bit) {
251: if ((tp->t_state&CARR_ON)==0) {
252: wakeup((caddr_t)&tp->t_rawq);
253: tp->t_state |= CARR_ON;
254: }
255: } else {
256: if (tp->t_state&CARR_ON) {
257: if (tp->t_state&ISOPEN) {
258: signal(tp->t_pgrp, SIGHUP);
259: dzaddr->dzdtr &= ~bit;
260: flushtty(tp);
261: }
262: tp->t_state &= ~CARR_ON;
263: }
264: }
265: }
266: timeout(dzscan, (caddr_t)0, 120);
267: }
Defined functions
Defined variables
dz_tty
defined in line
13; used 11 times
Defined struct's
device
defined in line
33; used 15 times
Defined macros
BITS7
defined in line
21; used 1 times
BITS8
defined in line
22; used 1 times
IE
defined in line
28; used 1 times
OFF
defined in line
42; used 3 times
ON
defined in line
41; used 1 times
OPAR
defined in line
25; used 1 times
TWOSB
defined in line
23; used 1 times
dzlpr
defined in line
38; used 1 times
dzmsr
defined in line
39; used 1 times