|
|
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: * @(#)hpib.c 7.1 (Berkeley) 5/8/90
21: */
22:
23: /*
24: * 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 "hpibvar.h"
34: #include "dmavar.h"
35:
36: #include "machine/cpu.h"
37: #include "machine/isr.h"
38:
39: int internalhpib = IOV(0x478000);
40:
41: int hpibinit(), hpibstart(), hpibgo(), hpibintr(), hpibdone();
42: struct driver hpibdriver = {
43: hpibinit, "hpib", hpibstart, hpibgo, hpibintr, hpibdone,
44: };
45:
46: struct hpib_softc hpib_softc[NHPIB];
47: struct isr hpib_isr[NHPIB];
48: int nhpibppoll(), fhpibppoll();
49:
50: int hpibtimeout = 100000; /* # of status tests before we give up */
51: int hpibidtimeout = 20000; /* # of status tests for hpibid() calls */
52:
53: hpibinit(hc)
54: register struct hp_ctlr *hc;
55: {
56: register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
57:
58: if (!nhpibtype(hc) && !fhpibtype(hc))
59: return(0);
60: hs->sc_hc = hc;
61: hs->sc_dq.dq_unit = hc->hp_unit;
62: hs->sc_dq.dq_driver = &hpibdriver;
63: hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq;
64: hpib_isr[hc->hp_unit].isr_intr = hpibintr;
65: hpib_isr[hc->hp_unit].isr_ipl = hc->hp_ipl;
66: hpib_isr[hc->hp_unit].isr_arg = hc->hp_unit;
67: isrlink(&hpib_isr[hc->hp_unit]);
68: hpibreset(hc->hp_unit);
69: return(1);
70: }
71:
72: hpibreset(unit)
73: register int unit;
74: {
75: if (hpib_softc[unit].sc_type == HPIBC)
76: fhpibreset(unit);
77: else
78: nhpibreset(unit);
79: }
80:
81: hpibreq(dq)
82: register struct devqueue *dq;
83: {
84: register struct devqueue *hq;
85:
86: hq = &hpib_softc[dq->dq_ctlr].sc_sq;
87: insque(dq, hq->dq_back);
88: if (dq->dq_back == hq)
89: return(1);
90: return(0);
91: }
92:
93: hpibfree(dq)
94: register struct devqueue *dq;
95: {
96: register struct devqueue *hq;
97:
98: hq = &hpib_softc[dq->dq_ctlr].sc_sq;
99: remque(dq);
100: if ((dq = hq->dq_forw) != hq)
101: (dq->dq_driver->d_start)(dq->dq_unit);
102: }
103:
104: hpibid(unit, slave)
105: {
106: short id;
107: int ohpibtimeout;
108:
109: /*
110: * XXX: shorten timeout value (so autoconfig doesn't take forever)
111: */
112: ohpibtimeout = hpibtimeout;
113: hpibtimeout = hpibidtimeout;
114: if (hpibrecv(unit, 31, slave, &id, 2) != 2)
115: id = 0;
116: hpibtimeout = ohpibtimeout;
117: return(id);
118: }
119:
120: hpibsend(unit, slave, sec, addr, cnt)
121: register int unit;
122: {
123: if (hpib_softc[unit].sc_type == HPIBC)
124: return(fhpibsend(unit, slave, sec, addr, cnt));
125: else
126: return(nhpibsend(unit, slave, sec, addr, cnt));
127: }
128:
129: hpibrecv(unit, slave, sec, addr, cnt)
130: register int unit;
131: {
132: if (hpib_softc[unit].sc_type == HPIBC)
133: return(fhpibrecv(unit, slave, sec, addr, cnt));
134: else
135: return(nhpibrecv(unit, slave, sec, addr, cnt));
136: }
137:
138: hpibpptest(unit, slave)
139: register int unit;
140: {
141: int (*ppoll)();
142:
143: ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
144: return((*ppoll)(unit) & (0x80 >> slave));
145: }
146:
147: hpibawait(unit)
148: {
149: register struct hpib_softc *hs = &hpib_softc[unit];
150:
151: hs->sc_flags |= HPIBF_PPOLL;
152: if (hs->sc_type == HPIBC)
153: fhpibppwatch(unit);
154: else
155: nhpibppwatch(unit);
156: }
157:
158: hpibswait(unit, slave)
159: register int unit;
160: {
161: register int timo = hpibtimeout;
162: register int mask, (*ppoll)();
163:
164: ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
165: mask = 0x80 >> slave;
166: while (((ppoll)(unit) & mask) == 0)
167: if (--timo == 0) {
168: printf("hpib%d: swait timeout\n", unit);
169: return(-1);
170: }
171: return(0);
172: }
173:
174: hpibustart(unit)
175: {
176: register struct hpib_softc *hs = &hpib_softc[unit];
177:
178: if (hs->sc_type == HPIBA)
179: hs->sc_dq.dq_ctlr = DMA0;
180: else
181: hs->sc_dq.dq_ctlr = DMA0 | DMA1;
182: if (dmareq(&hs->sc_dq))
183: return(1);
184: return(0);
185: }
186:
187: hpibstart(unit)
188: {
189: register struct devqueue *dq;
190:
191: dq = hpib_softc[unit].sc_sq.dq_forw;
192: (dq->dq_driver->d_go)(dq->dq_unit);
193: }
194:
195: hpibgo(unit, slave, sec, addr, count, rw)
196: register int unit;
197: {
198: if (hpib_softc[unit].sc_type == HPIBC)
199: fhpibgo(unit, slave, sec, addr, count, rw);
200: else
201: nhpibgo(unit, slave, sec, addr, count, rw);
202: }
203:
204: hpibdone(unit)
205: register int unit;
206: {
207: if (hpib_softc[unit].sc_type == HPIBC)
208: fhpibdone(unit);
209: else
210: nhpibdone(unit);
211: }
212:
213: hpibintr(unit)
214: register int unit;
215: {
216: int found;
217:
218: if (hpib_softc[unit].sc_type == HPIBC)
219: found = fhpibintr(unit);
220: else
221: found = nhpibintr(unit);
222: return(found);
223: }
224: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.