|
|
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:
27: #include "param.h"
28: #include "../hpdev/nhpibreg.h"
29: #include "hpibvar.h"
30:
31: nhpibinit(unit)
32: {
33: register struct hpib_softc *hs = &hpib_softc[unit];
34: register struct nhpibdevice *hd = (struct nhpibdevice *)hs->sc_addr;
35: extern int internalhpib;
36:
37: if ((int)hd == internalhpib) {
38: hs->sc_type = HPIBA;
39: hs->sc_ba = HPIBA_BA;
40: }
41: else if (hd->hpib_cid == HPIBB) {
42: hs->sc_type = HPIBB;
43: hs->sc_ba = hd->hpib_csa & CSA_BA;
44: }
45: else
46: return(0);
47: nhpibreset(unit);
48: return(1);
49: }
50:
51: nhpibreset(unit)
52: {
53: register struct hpib_softc *hs = &hpib_softc[unit];
54: register struct nhpibdevice *hd;
55:
56: hd = (struct nhpibdevice *)hs->sc_addr;
57: hd->hpib_acr = AUX_SSWRST;
58: hd->hpib_ar = hs->sc_ba;
59: hd->hpib_lim = 0;
60: hd->hpib_mim = 0;
61: hd->hpib_acr = AUX_CDAI;
62: hd->hpib_acr = AUX_CSHDW;
63: hd->hpib_acr = AUX_SSTD1;
64: hd->hpib_acr = AUX_SVSTD1;
65: hd->hpib_acr = AUX_CPP;
66: hd->hpib_acr = AUX_CHDFA;
67: hd->hpib_acr = AUX_CHDFE;
68: hd->hpib_acr = AUX_RHDF;
69: hd->hpib_acr = AUX_CSWRST;
70: hd->hpib_acr = AUX_TCA;
71: hd->hpib_acr = AUX_CSRE;
72: hd->hpib_acr = AUX_SSIC;
73: DELAY(100);
74: hd->hpib_acr = AUX_CSIC;
75: hd->hpib_acr = AUX_SSRE;
76: hd->hpib_data = C_DCL;
77: DELAY(100000);
78: }
79:
80: nhpibsend(unit, slave, sec, buf, cnt)
81: register char *buf;
82: register int cnt;
83: {
84: register struct hpib_softc *hs = &hpib_softc[unit];
85: register struct nhpibdevice *hd;
86: register int origcnt = cnt;
87:
88: hd = (struct nhpibdevice *)hs->sc_addr;
89: hd->hpib_acr = AUX_TCA;
90: hd->hpib_data = C_UNL;
91: nhpibowait(hd);
92: hd->hpib_data = C_TAG + hs->sc_ba;
93: hd->hpib_acr = AUX_STON;
94: nhpibowait(hd);
95: hd->hpib_data = C_LAG + slave;
96: nhpibowait(hd);
97: if (sec != -1) {
98: hd->hpib_data = C_SCG + sec;
99: nhpibowait(hd);
100: }
101: hd->hpib_acr = AUX_GTS;
102: if (cnt) {
103: while (--cnt) {
104: hd->hpib_data = *buf++;
105: if (nhpibowait(hd) < 0)
106: break;
107: }
108: hd->hpib_acr = AUX_EOI;
109: hd->hpib_data = *buf;
110: if (nhpibowait(hd) < 0)
111: cnt++;
112: hd->hpib_acr = AUX_TCA;
113: }
114: return(origcnt - cnt);
115: }
116:
117: nhpibrecv(unit, slave, sec, buf, cnt)
118: register char *buf;
119: register int cnt;
120: {
121: register struct hpib_softc *hs = &hpib_softc[unit];
122: register struct nhpibdevice *hd;
123: register int origcnt = cnt;
124:
125: hd = (struct nhpibdevice *)hs->sc_addr;
126: hd->hpib_acr = AUX_TCA;
127: hd->hpib_data = C_UNL;
128: nhpibowait(hd);
129: hd->hpib_data = C_LAG + hs->sc_ba;
130: hd->hpib_acr = AUX_SLON;
131: nhpibowait(hd);
132: hd->hpib_data = C_TAG + slave;
133: nhpibowait(hd);
134: if (sec != -1) {
135: hd->hpib_data = C_SCG + sec;
136: nhpibowait(hd);
137: }
138: hd->hpib_acr = AUX_RHDF;
139: hd->hpib_acr = AUX_GTS;
140: if (cnt) {
141: while (--cnt >= 0) {
142: if (nhpibiwait(hd) < 0)
143: break;
144: *buf++ = hd->hpib_data;
145: }
146: cnt++;
147: hd->hpib_acr = AUX_TCA;
148: }
149: return(origcnt - cnt);
150: }
151:
152: nhpibppoll(unit)
153: register int unit;
154: {
155: register struct hpib_softc *hs = &hpib_softc[unit];
156: register struct nhpibdevice *hd;
157: register int ppoll;
158:
159: hd = (struct nhpibdevice *)hs->sc_addr;
160: hd->hpib_acr = AUX_SPP;
161: DELAY(25);
162: ppoll = hd->hpib_cpt;
163: hd->hpib_acr = AUX_CPP;
164: return(ppoll);
165: }
166:
167: nhpibowait(hd)
168: register struct nhpibdevice *hd;
169: {
170: register int timo = 100000;
171:
172: while ((hd->hpib_mis & MIS_BO) == 0 && --timo)
173: ;
174: if (timo == 0)
175: return(-1);
176: return(0);
177: }
178:
179: nhpibiwait(hd)
180: register struct nhpibdevice *hd;
181: {
182: register int timo = 100000;
183:
184: while ((hd->hpib_mis & MIS_BI) == 0 && --timo)
185: ;
186: if (timo == 0)
187: return(-1);
188: return(0);
189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.