Annotation of sys/arch/hp300/stand/common/nhpib.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: nhpib.c,v 1.4 2006/08/17 06:31:10 miod Exp $ */
2: /* $NetBSD: nhpib.c,v 1.5 1995/08/05 16:47:46 thorpej Exp $ */
3:
4: /*
5: * Copyright (c) 1982, 1990, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. Neither the name of the University nor the names of its contributors
17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: *
32: * @(#)nhpib.c 8.1 (Berkeley) 6/10/93
33: */
34:
35: /*
36: * Internal/98624 HPIB driver
37: */
38:
39: #include <sys/param.h>
40:
41: #include <hp300/dev/nhpibreg.h>
42:
43: #include "samachdep.h"
44: #include "hpibvar.h"
45:
46: int nhpibiwait(struct nhpibdevice *);
47: int nhpibowait(struct nhpibdevice *);
48: void nhpibreset(int);
49:
50: int
51: nhpibinit(int unit)
52: {
53: struct hpib_softc *hs = &hpib_softc[unit];
54: struct nhpibdevice *hd = (struct nhpibdevice *)hs->sc_addr;
55: extern int internalhpib;
56:
57: if ((int)hd == internalhpib) {
58: hs->sc_type = HPIBA;
59: hs->sc_ba = HPIBA_BA;
60: }
61: else if (hd->hpib_cid == HPIBB) {
62: hs->sc_type = HPIBB;
63: hs->sc_ba = hd->hpib_csa & CSA_BA;
64: }
65: else
66: return(0);
67: nhpibreset(unit);
68: return(1);
69: }
70:
71: void
72: nhpibreset(int unit)
73: {
74: struct hpib_softc *hs = &hpib_softc[unit];
75: struct nhpibdevice *hd;
76:
77: hd = (struct nhpibdevice *)hs->sc_addr;
78: hd->hpib_acr = AUX_SSWRST;
79: hd->hpib_ar = hs->sc_ba;
80: hd->hpib_lim = 0;
81: hd->hpib_mim = 0;
82: hd->hpib_acr = AUX_CDAI;
83: hd->hpib_acr = AUX_CSHDW;
84: hd->hpib_acr = AUX_SSTD1;
85: hd->hpib_acr = AUX_SVSTD1;
86: hd->hpib_acr = AUX_CPP;
87: hd->hpib_acr = AUX_CHDFA;
88: hd->hpib_acr = AUX_CHDFE;
89: hd->hpib_acr = AUX_RHDF;
90: hd->hpib_acr = AUX_CSWRST;
91: hd->hpib_acr = AUX_TCA;
92: hd->hpib_acr = AUX_CSRE;
93: hd->hpib_acr = AUX_SSIC;
94: DELAY(100);
95: hd->hpib_acr = AUX_CSIC;
96: hd->hpib_acr = AUX_SSRE;
97: hd->hpib_data = C_DCL;
98: DELAY(100000);
99: }
100:
101: int
102: nhpibsend(int unit, int slave, int sec, char *buf, int cnt)
103: {
104: struct hpib_softc *hs = &hpib_softc[unit];
105: struct nhpibdevice *hd;
106: int origcnt = cnt;
107:
108: hd = (struct nhpibdevice *)hs->sc_addr;
109: hd->hpib_acr = AUX_TCA;
110: hd->hpib_data = C_UNL;
111: nhpibowait(hd);
112: hd->hpib_data = C_TAG + hs->sc_ba;
113: hd->hpib_acr = AUX_STON;
114: nhpibowait(hd);
115: hd->hpib_data = C_LAG + slave;
116: nhpibowait(hd);
117: if (sec != -1) {
118: hd->hpib_data = C_SCG + sec;
119: nhpibowait(hd);
120: }
121: hd->hpib_acr = AUX_GTS;
122: if (cnt) {
123: while (--cnt) {
124: hd->hpib_data = *buf++;
125: if (nhpibowait(hd) < 0)
126: break;
127: }
128: hd->hpib_acr = AUX_EOI;
129: hd->hpib_data = *buf;
130: if (nhpibowait(hd) < 0)
131: cnt++;
132: hd->hpib_acr = AUX_TCA;
133: }
134: return(origcnt - cnt);
135: }
136:
137: int
138: nhpibrecv(int unit, int slave, int sec, char *buf, int cnt)
139: {
140: struct hpib_softc *hs = &hpib_softc[unit];
141: struct nhpibdevice *hd;
142: int origcnt = cnt;
143:
144: hd = (struct nhpibdevice *)hs->sc_addr;
145: hd->hpib_acr = AUX_TCA;
146: hd->hpib_data = C_UNL;
147: nhpibowait(hd);
148: hd->hpib_data = C_LAG + hs->sc_ba;
149: hd->hpib_acr = AUX_SLON;
150: nhpibowait(hd);
151: hd->hpib_data = C_TAG + slave;
152: nhpibowait(hd);
153: if (sec != -1) {
154: hd->hpib_data = C_SCG + sec;
155: nhpibowait(hd);
156: }
157: hd->hpib_acr = AUX_RHDF;
158: hd->hpib_acr = AUX_GTS;
159: if (cnt) {
160: while (--cnt >= 0) {
161: if (nhpibiwait(hd) < 0)
162: break;
163: *buf++ = hd->hpib_data;
164: }
165: cnt++;
166: hd->hpib_acr = AUX_TCA;
167: }
168: return(origcnt - cnt);
169: }
170:
171: int
172: nhpibppoll(int unit)
173: {
174: struct hpib_softc *hs = &hpib_softc[unit];
175: struct nhpibdevice *hd;
176: int ppoll;
177:
178: hd = (struct nhpibdevice *)hs->sc_addr;
179: hd->hpib_acr = AUX_SPP;
180: DELAY(25);
181: ppoll = hd->hpib_cpt;
182: hd->hpib_acr = AUX_CPP;
183: return(ppoll);
184: }
185:
186: int
187: nhpibowait(struct nhpibdevice *hd)
188: {
189: int timo = 100000;
190:
191: while ((hd->hpib_mis & MIS_BO) == 0 && --timo)
192: ;
193: if (timo == 0)
194: return(-1);
195: return(0);
196: }
197:
198: int
199: nhpibiwait(struct nhpibdevice *hd)
200: {
201: int timo = 100000;
202:
203: while ((hd->hpib_mis & MIS_BI) == 0 && --timo)
204: ;
205: if (timo == 0)
206: return(-1);
207: return(0);
208: }
CVSweb