xref: /csrg-svn/sys/hp300/stand/nhpib.c (revision 41488)
1*41488Smckusick /*
2*41488Smckusick  * Copyright (c) 1982, 1990 The Regents of the University of California.
3*41488Smckusick  * All rights reserved.
4*41488Smckusick  *
5*41488Smckusick  * %sccs.include.redist.c%
6*41488Smckusick  *
7*41488Smckusick  *	@(#)nhpib.c	7.1 (Berkeley) 05/08/90
8*41488Smckusick  */
9*41488Smckusick 
10*41488Smckusick /*
11*41488Smckusick  * Internal/98624 HPIB driver
12*41488Smckusick  */
13*41488Smckusick 
14*41488Smckusick #include "param.h"
15*41488Smckusick #include "../hpdev/nhpibreg.h"
16*41488Smckusick #include "hpibvar.h"
17*41488Smckusick 
18*41488Smckusick nhpibinit(unit)
19*41488Smckusick {
20*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
21*41488Smckusick 	register struct nhpibdevice *hd = (struct nhpibdevice *)hs->sc_addr;
22*41488Smckusick 	extern int internalhpib;
23*41488Smckusick 
24*41488Smckusick 	if ((int)hd == internalhpib) {
25*41488Smckusick 		hs->sc_type = HPIBA;
26*41488Smckusick 		hs->sc_ba = HPIBA_BA;
27*41488Smckusick 	}
28*41488Smckusick 	else if (hd->hpib_cid == HPIBB) {
29*41488Smckusick 		hs->sc_type = HPIBB;
30*41488Smckusick 		hs->sc_ba = hd->hpib_csa & CSA_BA;
31*41488Smckusick 	}
32*41488Smckusick 	else
33*41488Smckusick 		return(0);
34*41488Smckusick 	nhpibreset(unit);
35*41488Smckusick 	return(1);
36*41488Smckusick }
37*41488Smckusick 
38*41488Smckusick nhpibreset(unit)
39*41488Smckusick {
40*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
41*41488Smckusick 	register struct nhpibdevice *hd;
42*41488Smckusick 
43*41488Smckusick 	hd = (struct nhpibdevice *)hs->sc_addr;
44*41488Smckusick 	hd->hpib_acr = AUX_SSWRST;
45*41488Smckusick 	hd->hpib_ar = hs->sc_ba;
46*41488Smckusick 	hd->hpib_lim = 0;
47*41488Smckusick 	hd->hpib_mim = 0;
48*41488Smckusick 	hd->hpib_acr = AUX_CDAI;
49*41488Smckusick 	hd->hpib_acr = AUX_CSHDW;
50*41488Smckusick 	hd->hpib_acr = AUX_SSTD1;
51*41488Smckusick 	hd->hpib_acr = AUX_SVSTD1;
52*41488Smckusick 	hd->hpib_acr = AUX_CPP;
53*41488Smckusick 	hd->hpib_acr = AUX_CHDFA;
54*41488Smckusick 	hd->hpib_acr = AUX_CHDFE;
55*41488Smckusick 	hd->hpib_acr = AUX_RHDF;
56*41488Smckusick 	hd->hpib_acr = AUX_CSWRST;
57*41488Smckusick 	hd->hpib_acr = AUX_TCA;
58*41488Smckusick 	hd->hpib_acr = AUX_CSRE;
59*41488Smckusick 	hd->hpib_acr = AUX_SSIC;
60*41488Smckusick 	DELAY(100);
61*41488Smckusick 	hd->hpib_acr = AUX_CSIC;
62*41488Smckusick 	hd->hpib_acr = AUX_SSRE;
63*41488Smckusick 	hd->hpib_data = C_DCL;
64*41488Smckusick 	DELAY(100000);
65*41488Smckusick }
66*41488Smckusick 
67*41488Smckusick nhpibsend(unit, slave, sec, buf, cnt)
68*41488Smckusick 	register char *buf;
69*41488Smckusick 	register int cnt;
70*41488Smckusick {
71*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
72*41488Smckusick 	register struct nhpibdevice *hd;
73*41488Smckusick 	register int origcnt = cnt;
74*41488Smckusick 
75*41488Smckusick 	hd = (struct nhpibdevice *)hs->sc_addr;
76*41488Smckusick 	hd->hpib_acr = AUX_TCA;
77*41488Smckusick 	hd->hpib_data = C_UNL;
78*41488Smckusick 	nhpibowait(hd);
79*41488Smckusick 	hd->hpib_data = C_TAG + hs->sc_ba;
80*41488Smckusick 	hd->hpib_acr = AUX_STON;
81*41488Smckusick 	nhpibowait(hd);
82*41488Smckusick 	hd->hpib_data = C_LAG + slave;
83*41488Smckusick 	nhpibowait(hd);
84*41488Smckusick 	if (sec != -1) {
85*41488Smckusick 		hd->hpib_data = C_SCG + sec;
86*41488Smckusick 		nhpibowait(hd);
87*41488Smckusick 	}
88*41488Smckusick 	hd->hpib_acr = AUX_GTS;
89*41488Smckusick 	if (cnt) {
90*41488Smckusick 		while (--cnt) {
91*41488Smckusick 			hd->hpib_data = *buf++;
92*41488Smckusick 			if (nhpibowait(hd) < 0)
93*41488Smckusick 				break;
94*41488Smckusick 		}
95*41488Smckusick 		hd->hpib_acr = AUX_EOI;
96*41488Smckusick 		hd->hpib_data = *buf;
97*41488Smckusick 		if (nhpibowait(hd) < 0)
98*41488Smckusick 			cnt++;
99*41488Smckusick 		hd->hpib_acr = AUX_TCA;
100*41488Smckusick 	}
101*41488Smckusick 	return(origcnt - cnt);
102*41488Smckusick }
103*41488Smckusick 
104*41488Smckusick nhpibrecv(unit, slave, sec, buf, cnt)
105*41488Smckusick 	register char *buf;
106*41488Smckusick 	register int cnt;
107*41488Smckusick {
108*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
109*41488Smckusick 	register struct nhpibdevice *hd;
110*41488Smckusick 	register int origcnt = cnt;
111*41488Smckusick 
112*41488Smckusick 	hd = (struct nhpibdevice *)hs->sc_addr;
113*41488Smckusick 	hd->hpib_acr = AUX_TCA;
114*41488Smckusick 	hd->hpib_data = C_UNL;
115*41488Smckusick 	nhpibowait(hd);
116*41488Smckusick 	hd->hpib_data = C_LAG + hs->sc_ba;
117*41488Smckusick 	hd->hpib_acr = AUX_SLON;
118*41488Smckusick 	nhpibowait(hd);
119*41488Smckusick 	hd->hpib_data = C_TAG + slave;
120*41488Smckusick 	nhpibowait(hd);
121*41488Smckusick 	if (sec != -1) {
122*41488Smckusick 		hd->hpib_data = C_SCG + sec;
123*41488Smckusick 		nhpibowait(hd);
124*41488Smckusick 	}
125*41488Smckusick 	hd->hpib_acr = AUX_RHDF;
126*41488Smckusick 	hd->hpib_acr = AUX_GTS;
127*41488Smckusick 	if (cnt) {
128*41488Smckusick 		while (--cnt >= 0) {
129*41488Smckusick 			if (nhpibiwait(hd) < 0)
130*41488Smckusick 				break;
131*41488Smckusick 			*buf++ = hd->hpib_data;
132*41488Smckusick 		}
133*41488Smckusick 		cnt++;
134*41488Smckusick 		hd->hpib_acr = AUX_TCA;
135*41488Smckusick 	}
136*41488Smckusick 	return(origcnt - cnt);
137*41488Smckusick }
138*41488Smckusick 
139*41488Smckusick nhpibppoll(unit)
140*41488Smckusick 	register int unit;
141*41488Smckusick {
142*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
143*41488Smckusick 	register struct nhpibdevice *hd;
144*41488Smckusick 	register int ppoll;
145*41488Smckusick 
146*41488Smckusick 	hd = (struct nhpibdevice *)hs->sc_addr;
147*41488Smckusick 	hd->hpib_acr = AUX_SPP;
148*41488Smckusick 	DELAY(25);
149*41488Smckusick 	ppoll = hd->hpib_cpt;
150*41488Smckusick 	hd->hpib_acr = AUX_CPP;
151*41488Smckusick 	return(ppoll);
152*41488Smckusick }
153*41488Smckusick 
154*41488Smckusick nhpibowait(hd)
155*41488Smckusick 	register struct nhpibdevice *hd;
156*41488Smckusick {
157*41488Smckusick 	register int timo = 100000;
158*41488Smckusick 
159*41488Smckusick 	while ((hd->hpib_mis & MIS_BO) == 0 && --timo)
160*41488Smckusick 		;
161*41488Smckusick 	if (timo == 0)
162*41488Smckusick 		return(-1);
163*41488Smckusick 	return(0);
164*41488Smckusick }
165*41488Smckusick 
166*41488Smckusick nhpibiwait(hd)
167*41488Smckusick 	register struct nhpibdevice *hd;
168*41488Smckusick {
169*41488Smckusick 	register int timo = 100000;
170*41488Smckusick 
171*41488Smckusick 	while ((hd->hpib_mis & MIS_BI) == 0 && --timo)
172*41488Smckusick 		;
173*41488Smckusick 	if (timo == 0)
174*41488Smckusick 		return(-1);
175*41488Smckusick 	return(0);
176*41488Smckusick }
177