|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution is only permitted until one year after the first shipment
6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
7: * binary forms are permitted provided that: (1) source distributions retain
8: * this entire copyright notice and comment, and (2) distributions including
9: * binaries display the following acknowledgement: This product includes
10: * software developed by the University of California, Berkeley and its
11: * contributors'' in the documentation or other materials provided with the
12: * distribution and in all advertising materials mentioning features or use
13: * of this software. Neither the name of the University nor the names of
14: * its contributors may be used to endorse or promote products derived from
15: * this software without specific prior written permission.
16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19: *
20: * @(#)nhpib.c 7.1 (Berkeley) 5/8/90
21: */
22:
23: /*
24: * Internal/98624 HPIB driver
25: */
26: #include "hpib.h"
27: #if NHPIB > 0
28:
29: #include "param.h"
30: #include "systm.h"
31: #include "buf.h"
32: #include "device.h"
33: #include "nhpibreg.h"
34: #include "hpibvar.h"
35: #include "dmavar.h"
36:
37: nhpibtype(hc)
38: register struct hp_ctlr *hc;
39: {
40: register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
41: register struct nhpibdevice *hd = (struct nhpibdevice *)hc->hp_addr;
42:
43: if ((int)hc->hp_addr == internalhpib) {
44: hs->sc_type = HPIBA;
45: hs->sc_ba = HPIBA_BA;
46: hc->hp_ipl = HPIBA_IPL;
47: }
48: else if (hd->hpib_cid == HPIBB) {
49: hs->sc_type = HPIBB;
50: hs->sc_ba = hd->hpib_csa & CSA_BA;
51: hc->hp_ipl = HPIB_IPL(hd->hpib_ids);
52: }
53: else
54: return(0);
55: return(1);
56: }
57:
58: nhpibreset(unit)
59: {
60: register struct hpib_softc *hs = &hpib_softc[unit];
61: register struct nhpibdevice *hd;
62:
63: hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
64: hd->hpib_acr = AUX_SSWRST;
65: hd->hpib_ar = hs->sc_ba;
66: hd->hpib_lim = LIS_ERR;
67: hd->hpib_mim = 0;
68: hd->hpib_acr = AUX_CDAI;
69: hd->hpib_acr = AUX_CSHDW;
70: hd->hpib_acr = AUX_SSTD1;
71: hd->hpib_acr = AUX_SVSTD1;
72: hd->hpib_acr = AUX_CPP;
73: hd->hpib_acr = AUX_CHDFA;
74: hd->hpib_acr = AUX_CHDFE;
75: hd->hpib_acr = AUX_RHDF;
76: hd->hpib_acr = AUX_CSWRST;
77: nhpibifc(hd);
78: hd->hpib_ie = IDS_IE;
79: hd->hpib_data = C_DCL;
80: DELAY(100000);
81: }
82:
83: nhpibifc(hd)
84: register struct nhpibdevice *hd;
85: {
86: hd->hpib_acr = AUX_TCA;
87: hd->hpib_acr = AUX_CSRE;
88: hd->hpib_acr = AUX_SSIC;
89: DELAY(100);
90: hd->hpib_acr = AUX_CSIC;
91: hd->hpib_acr = AUX_SSRE;
92: }
93:
94: nhpibsend(unit, slave, sec, addr, cnt)
95: register char *addr;
96: register int cnt;
97: {
98: register struct hpib_softc *hs = &hpib_softc[unit];
99: register struct nhpibdevice *hd;
100: register int origcnt = cnt;
101:
102: hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
103: hd->hpib_acr = AUX_TCA;
104: hd->hpib_data = C_UNL;
105: nhpibowait(hd);
106: hd->hpib_data = C_TAG + hs->sc_ba;
107: hd->hpib_acr = AUX_STON;
108: nhpibowait(hd);
109: hd->hpib_data = C_LAG + slave;
110: nhpibowait(hd);
111: if (sec != -1) {
112: hd->hpib_data = C_SCG + sec;
113: nhpibowait(hd);
114: }
115: hd->hpib_acr = AUX_GTS;
116: if (cnt) {
117: while (--cnt) {
118: hd->hpib_data = *addr++;
119: if (nhpibowait(hd) < 0) {
120: nhpibifc(hd);
121: cnt++;
122: goto out;
123: }
124: }
125: hd->hpib_acr = AUX_EOI;
126: hd->hpib_data = *addr;
127: if (nhpibowait(hd) < 0) {
128: nhpibifc(hd);
129: cnt++;
130: }
131: else
132: hd->hpib_acr = AUX_TCA;
133: }
134: out:
135: return(origcnt - cnt);
136: }
137:
138: nhpibrecv(unit, slave, sec, addr, cnt)
139: register char *addr;
140: register int cnt;
141: {
142: register struct hpib_softc *hs = &hpib_softc[unit];
143: register struct nhpibdevice *hd;
144: register int origcnt = cnt;
145:
146: hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
147: hd->hpib_acr = AUX_TCA;
148: hd->hpib_data = C_UNL;
149: nhpibowait(hd);
150: hd->hpib_data = C_LAG + hs->sc_ba;
151: hd->hpib_acr = AUX_SLON;
152: nhpibowait(hd);
153: hd->hpib_data = C_TAG + slave;
154: nhpibowait(hd);
155: if (sec != -1) {
156: hd->hpib_data = C_SCG + sec;
157: nhpibowait(hd);
158: }
159: hd->hpib_acr = AUX_RHDF;
160: hd->hpib_acr = AUX_GTS;
161: if (cnt) {
162: while (--cnt >= 0) {
163: if (nhpibiwait(hd) < 0) {
164: nhpibifc(hd);
165: break;
166: }
167: *addr++ = hd->hpib_data;
168: }
169: cnt++;
170: hd->hpib_acr = AUX_TCA;
171: }
172: return(origcnt - cnt);
173: }
174:
175: nhpibgo(unit, slave, sec, addr, count, rw)
176: register int unit, slave;
177: char *addr;
178: {
179: register struct hpib_softc *hs = &hpib_softc[unit];
180: register struct nhpibdevice *hd;
181:
182: hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
183: hs->sc_flags |= HPIBF_IO;
184: if (rw == B_READ)
185: hs->sc_flags |= HPIBF_READ;
186: #ifdef DEBUG
187: else if (hs->sc_flags & HPIBF_READ) {
188: printf("nhpibgo: HPIBF_READ still set\n");
189: hs->sc_flags &= ~HPIBF_READ;
190: }
191: #endif
192: hs->sc_count = count;
193: hs->sc_addr = addr;
194: if (hs->sc_flags & HPIBF_READ) {
195: hs->sc_curcnt = count;
196: dmago(hs->sc_dq.dq_ctlr, addr, count, DMAGO_BYTE|DMAGO_READ);
197: nhpibrecv(unit, slave, sec, 0, 0);
198: hd->hpib_mim = MIS_END;
199: }
200: else {
201: if (count == 1) {
202: hs->sc_curcnt = 1;
203: dmago(hs->sc_dq.dq_ctlr, addr, 1, DMAGO_BYTE);
204: nhpibsend(unit, slave, sec, 0, 0);
205: hd->hpib_acr = AUX_EOI;
206: }
207: else {
208: hs->sc_curcnt = count - 1;
209: dmago(hs->sc_dq.dq_ctlr, addr, count - 1, DMAGO_BYTE);
210: nhpibsend(unit, slave, sec, 0, 0);
211: }
212: }
213: hd->hpib_ie = IDS_IE | IDS_DMA(hs->sc_dq.dq_ctlr);
214: }
215:
216: nhpibdone(unit)
217: register int unit;
218: {
219: register struct hpib_softc *hs = &hpib_softc[unit];
220: register struct nhpibdevice *hd;
221: register int cnt;
222:
223: hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
224: cnt = hs->sc_curcnt;
225: hs->sc_addr += cnt;
226: hs->sc_count -= cnt;
227: if (hs->sc_flags & HPIBF_READ) {
228: hs->sc_flags |= HPIBF_DONE;
229: hd->hpib_ie = IDS_IE;
230: } else {
231: if (hs->sc_count == 1) {
232: hs->sc_curcnt = 1;
233: hd->hpib_acr = AUX_EOI;
234: dmago(hs->sc_dq.dq_ctlr, hs->sc_addr, 1, DMAGO_BYTE);
235: return;
236: }
237: hs->sc_flags |= HPIBF_DONE;
238: hd->hpib_ie = IDS_IE;
239: hd->hpib_mim = MIS_BO;
240: }
241: }
242:
243: nhpibintr(unit)
244: register int unit;
245: {
246: register struct hpib_softc *hs = &hpib_softc[unit];
247: register struct nhpibdevice *hd;
248: register struct devqueue *dq = hs->sc_sq.dq_forw;
249: register int stat0;
250: int stat1;
251:
252: #ifdef lint
253: if (stat1 = unit) return(1);
254: #endif
255: hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
256: if ((hd->hpib_ids & IDS_IR) == 0)
257: return(0);
258: stat0 = hd->hpib_mis;
259: stat1 = hd->hpib_lis;
260: if (hs->sc_flags & HPIBF_IO) {
261: hd->hpib_mim = 0;
262: if ((hs->sc_flags & HPIBF_DONE) == 0)
263: dmastop(hs->sc_dq.dq_ctlr);
264: hd->hpib_acr = AUX_TCA;
265: hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ);
266: dmafree(&hs->sc_dq);
267: (dq->dq_driver->d_intr)(dq->dq_unit);
268: return(1);
269: }
270: if (hs->sc_flags & HPIBF_PPOLL) {
271: hd->hpib_mim = 0;
272: stat0 = nhpibppoll(unit);
273: if (stat0 & (0x80 >> dq->dq_slave)) {
274: hs->sc_flags &= ~HPIBF_PPOLL;
275: (dq->dq_driver->d_intr)(dq->dq_unit);
276: }
277: return(1);
278: }
279: return(1);
280: }
281:
282: nhpibppoll(unit)
283: register int unit;
284: {
285: register struct hpib_softc *hs = &hpib_softc[unit];
286: register struct nhpibdevice *hd;
287: register int ppoll;
288:
289: hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
290: hd->hpib_acr = AUX_SPP;
291: DELAY(25);
292: ppoll = hd->hpib_cpt;
293: hd->hpib_acr = AUX_CPP;
294: return(ppoll);
295: }
296:
297: nhpibowait(hd)
298: register struct nhpibdevice *hd;
299: {
300: extern int hpibtimeout;
301: register int timo = hpibtimeout;
302:
303: while ((hd->hpib_mis & MIS_BO) == 0 && --timo)
304: ;
305: if (timo == 0)
306: return(-1);
307: return(0);
308: }
309:
310: nhpibiwait(hd)
311: register struct nhpibdevice *hd;
312: {
313: extern int hpibtimeout;
314: register int timo = hpibtimeout;
315:
316: while ((hd->hpib_mis & MIS_BI) == 0 && --timo)
317: ;
318: if (timo == 0)
319: return(-1);
320: return(0);
321: }
322:
323: nhpibppwatch(unit)
324: register int unit;
325: {
326: register struct hpib_softc *hs = &hpib_softc[unit];
327: register struct devqueue *dq = hs->sc_sq.dq_forw;
328: register int slave = 0x80 >> dq->dq_slave;
329:
330: if ((hs->sc_flags & HPIBF_PPOLL) == 0)
331: return;
332: if (nhpibppoll(unit) & slave)
333: ((struct nhpibdevice *)hs->sc_hc->hp_addr)->hpib_mim = MIS_BO;
334: else
335: timeout(nhpibppwatch, unit, 1);
336: }
337: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.