|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: *
33: * @(#)fhpib.c 7.2 (Berkeley) 12/16/90
34: */
35:
36: /*
37: * 98625A/B HPIB driver
38: */
39:
40: #include "sys/param.h"
41: #include "../dev/fhpibreg.h"
42: #include "hpibvar.h"
43:
44: fhpibinit(unit)
45: register int unit;
46: {
47: register struct hpib_softc *hs = &hpib_softc[unit];
48: register struct fhpibdevice *hd = (struct fhpibdevice *)hs->sc_addr;
49:
50: if (hd->hpib_cid != HPIBC)
51: return(0);
52: hs->sc_type = HPIBC;
53: hs->sc_ba = HPIBC_BA;
54: fhpibreset(unit);
55: return(1);
56: }
57:
58: fhpibreset(unit)
59: {
60: register struct hpib_softc *hs = &hpib_softc[unit];
61: register struct fhpibdevice *hd;
62:
63: hd = (struct fhpibdevice *)hs->sc_addr;
64: hd->hpib_cid = 0xFF;
65: DELAY(100);
66: hd->hpib_cmd = CT_8BIT;
67: hd->hpib_ar = AR_ARONC;
68: hd->hpib_cmd |= CT_IFC;
69: hd->hpib_cmd |= CT_INITFIFO;
70: DELAY(100);
71: hd->hpib_cmd &= ~CT_IFC;
72: hd->hpib_cmd |= CT_REN;
73: hd->hpib_stat = ST_ATN;
74: hd->hpib_data = C_DCL;
75: DELAY(100000);
76: }
77:
78: fhpibsend(unit, slave, sec, buf, cnt)
79: register char *buf;
80: register int cnt;
81: {
82: register struct hpib_softc *hs = &hpib_softc[unit];
83: register struct fhpibdevice *hd;
84: int origcnt = cnt;
85:
86: hd = (struct fhpibdevice *)hs->sc_addr;
87: hd->hpib_stat = 0;
88: hd->hpib_imask = IM_IDLE | IM_ROOM;
89: fhpibwait(hd, IM_IDLE);
90: hd->hpib_stat = ST_ATN;
91: hd->hpib_data = C_UNL;
92: hd->hpib_data = C_TAG + hs->sc_ba;
93: hd->hpib_data = C_LAG + slave;
94: if (sec != -1)
95: hd->hpib_data = C_SCG + sec;
96: fhpibwait(hd, IM_IDLE);
97: hd->hpib_stat = ST_WRITE;
98: if (cnt) {
99: while (--cnt) {
100: hd->hpib_data = *buf++;
101: if (fhpibwait(hd, IM_ROOM) < 0)
102: break;
103: }
104: hd->hpib_stat = ST_EOI;
105: hd->hpib_data = *buf;
106: if (fhpibwait(hd, IM_ROOM) < 0)
107: cnt++;
108: hd->hpib_stat = ST_ATN;
109: /* XXX: HP-UX claims bug with CS80 transparent messages */
110: if (sec == 0x12)
111: DELAY(150);
112: hd->hpib_data = C_UNL;
113: fhpibwait(hd, IM_IDLE);
114: }
115: hd->hpib_imask = 0;
116: return(origcnt - cnt);
117: }
118:
119: fhpibrecv(unit, slave, sec, buf, cnt)
120: register char *buf;
121: register int cnt;
122: {
123: register struct hpib_softc *hs = &hpib_softc[unit];
124: register struct fhpibdevice *hd;
125: int origcnt = cnt;
126:
127: hd = (struct fhpibdevice *)hs->sc_addr;
128: hd->hpib_stat = 0;
129: hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE;
130: fhpibwait(hd, IM_IDLE);
131: hd->hpib_stat = ST_ATN;
132: hd->hpib_data = C_UNL;
133: hd->hpib_data = C_LAG + hs->sc_ba;
134: hd->hpib_data = C_TAG + slave;
135: if (sec != -1)
136: hd->hpib_data = C_SCG + sec;
137: fhpibwait(hd, IM_IDLE);
138: hd->hpib_stat = ST_READ0;
139: hd->hpib_data = 0;
140: if (cnt) {
141: while (--cnt >= 0) {
142: if (fhpibwait(hd, IM_BYTE) < 0)
143: break;
144: *buf++ = hd->hpib_data;
145: }
146: cnt++;
147: fhpibwait(hd, IM_ROOM);
148: hd->hpib_stat = ST_ATN;
149: hd->hpib_data = (slave == 31) ? C_UNA : C_UNT;
150: fhpibwait(hd, IM_IDLE);
151: }
152: hd->hpib_imask = 0;
153: return(origcnt - cnt);
154: }
155:
156: fhpibppoll(unit)
157: register int unit;
158: {
159: register struct hpib_softc *hs = &hpib_softc[unit];
160: register struct fhpibdevice *hd;
161: register int ppoll;
162:
163: hd = (struct fhpibdevice *)hs->sc_addr;
164: hd->hpib_stat = 0;
165: hd->hpib_psense = 0;
166: hd->hpib_pmask = 0xFF;
167: hd->hpib_imask = IM_PPRESP | IM_PABORT;
168: DELAY(25);
169: hd->hpib_intr = IM_PABORT;
170: ppoll = hd->hpib_data;
171: if (hd->hpib_intr & IM_PABORT)
172: ppoll = 0;
173: hd->hpib_imask = 0;
174: hd->hpib_pmask = 0;
175: hd->hpib_stat = ST_IENAB;
176: return(ppoll);
177: }
178:
179: fhpibwait(hd, x)
180: register struct fhpibdevice *hd;
181: {
182: register int timo = 100000;
183:
184: while ((hd->hpib_intr & x) == 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.