Research V5 development
[unix-history] / usr / sys / dmr / dc.c
CommitLineData
050a4377
DR
1#
2/*
3 * Copyright 1973 Bell Telephone Laboratories Inc
4 */
5
6/*
7 * DC-11 driver
8 */
9#include "../param.h"
10#include "../conf.h"
11#include "../user.h"
12#include "../tty.h"
13#include "../proc.h"
14
15/* base address */
16#define DCADDR 0174000
17#define NDC11 14
18
19/* Control bits */
20#define CDLEAD 01
21#define CARRIER 04
22#define SPEED1 010
23#define STOP1 0400
24#define RQSEND 01
25#define PARITY 040
26#define ERROR 0100000
27#define CTRANS 040000
28#define RINGIND 020000
29
30
31struct tty dc11[NDC11];
32
33struct dcregs {
34 int dcrcsr;
35 int dcrbuf;
36 int dctcsr;
37 int dctbuf;
38};
39
40int dcrstab[] {
41 0, /* 0 baud */
42 0, /* 50 baud */
43 0, /* 75 baud */
44 0, /* 110 baud */
45 01101, /* 134.5 baud: 7b/ch, speed 0 */
46 0111, /* 150 baud: 8b/ch, speed 1 */
47 0, /* 200 baud */
48 0121, /* 300 baud: 8b/ch, speed 2 */
49 0, /* 600 baud */
50 0131, /* 1200 baud */
51 0, /* 1800 baud */
52 0, /* 2400 baud */
53 0, /* 4800 baud */
54 0, /* 9600 baud */
55 0, /* X0 */
56 0, /* X1 */
57};
58
59int dctstab[] {
60 0, /* 0 baud */
61 0, /* 50 baud */
62 0, /* 75 baud */
63 0, /* 110 baud */
64 0501, /* 134.5 baud: stop 1 */
65 0511, /* 150 baud */
66 0, /* 200 baud */
67 0521, /* 300 baud */
68 0, /* 600 baud */
69 0531, /* 1200 baud */
70 0, /* 1800 baud */
71 0, /* 2400 baud */
72 0, /* 4800 baud */
73 0, /* 9600 baud */
74 0, /* X0 */
75 0, /* X1 */
76};
77
78dcopen(dev, flag)
79{
80 register struct tty *rtp;
81 register *addr;
82
83 if (dev.d_minor >= NDC11) {
84 u.u_error = ENXIO;
85 return;
86 }
87 rtp = &dc11[dev.d_minor];
88 rtp->t_addr = addr = DCADDR + dev.d_minor*8;
89 rtp->t_state =| WOPEN;
90 addr->dcrcsr =| IENABLE|CDLEAD;
91 if ((rtp->t_state&ISOPEN) == 0) {
92 rtp->t_erase = CERASE;
93 rtp->t_kill = CKILL;
94 addr->dcrcsr = IENABLE|CDLEAD|SPEED1;
95 addr->dctcsr = IENABLE|SPEED1|STOP1|RQSEND;
96 rtp->t_state = ISOPEN | WOPEN;
97 rtp->t_flags = ODDP|EVENP|ECHO;
98 }
99 if (addr->dcrcsr & CARRIER)
100 rtp->t_state =| CARR_ON;
101 while ((rtp->t_state & CARR_ON) == 0)
102 sleep(&rtp->t_rawq, TTIPRI);
103 rtp->t_state =& ~WOPEN;
104 if (u.u_procp->p_ttyp == 0)
105 u.u_procp->p_ttyp = rtp;
106}
107
108dcclose(dev)
109{
110 register struct tty *tp;
111
112 (tp = &dc11[dev.d_minor])->t_state = 0;
113 if (tp->t_flags&HUPCL)
114 tp->t_addr->dcrcsr =& ~CDLEAD;
115 wflushtty(tp);
116}
117
118dcread(dev)
119{
120 register struct tty *tp;
121
122 tp = &dc11[dev.d_minor];
123 if ((tp->t_addr->dcrcsr&CARRIER) != 0)
124 ttread(tp);
125}
126
127dcwrite(dev)
128{
129 register struct tty *tp;
130
131 tp = &dc11[dev.d_minor];
132 if ((tp->t_addr->dcrcsr & CARRIER) != 0)
133 ttwrite(tp);
134}
135
136dcxint(dev)
137{
138 register struct tty *tp;
139
140 ttstart(tp = &dc11[dev.d_minor]);
141 if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT)
142 wakeup(&tp->t_outq);
143}
144
145dcrint(dev)
146{
147 register struct tty *tp;
148 register int c, csr;
149
150 tp = &dc11[dev.d_minor];
151 c = tp->t_addr->dcrbuf;
152 if (((csr = tp->t_addr->dcrcsr) & CARRIER) == 0) {
153 if ((tp->t_state&WOPEN) == 0) {
154 tp->t_addr->dcrcsr =& ~CDLEAD;
155 if (tp->t_state & CARR_ON)
156 signal(tp, SIGHUP);
157 flushtty(tp);
158 }
159 tp->t_state =& ~CARR_ON;
160 return;
161 }
162 if (csr&ERROR || (tp->t_state&ISOPEN)==0) {
163 if (tp->t_state&WOPEN && csr&CARRIER)
164 tp->t_state =| CARR_ON;
165 wakeup(tp);
166 return;
167 }
168 csr =& PARITY;
169 if (csr&&(tp->t_flags&ODDP) || !csr&&(tp->t_flags&EVENP))
170 ttyinput(c, tp);
171}
172
173dcsgtty(dev, av)
174int *av;
175{
176 register struct tty *tp;
177 register r;
178
179 tp = &dc11[dev.d_minor];
180 if (ttystty(tp, av))
181 return;
182 if (r = dcrstab[tp->t_speeds.lobyte&017])
183 tp->t_addr->dcrcsr = r;
184 if (r = dctstab[tp->t_speeds.hibyte&017])
185 tp->t_addr->dctcsr = r;
186}