xref: /csrg-svn/sys/hp300/stand/fhpib.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  *	@(#)fhpib.c	7.1 (Berkeley) 05/08/90
8*41488Smckusick  */
9*41488Smckusick 
10*41488Smckusick /*
11*41488Smckusick  * 98625A/B HPIB driver
12*41488Smckusick  */
13*41488Smckusick 
14*41488Smckusick #include "param.h"
15*41488Smckusick #include "../hpdev/fhpibreg.h"
16*41488Smckusick #include "hpibvar.h"
17*41488Smckusick 
18*41488Smckusick fhpibinit(unit)
19*41488Smckusick 	register int unit;
20*41488Smckusick {
21*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
22*41488Smckusick 	register struct fhpibdevice *hd = (struct fhpibdevice *)hs->sc_addr;
23*41488Smckusick 
24*41488Smckusick 	if (hd->hpib_cid != HPIBC)
25*41488Smckusick 		return(0);
26*41488Smckusick 	hs->sc_type = HPIBC;
27*41488Smckusick 	hs->sc_ba = HPIBC_BA;
28*41488Smckusick 	fhpibreset(unit);
29*41488Smckusick 	return(1);
30*41488Smckusick }
31*41488Smckusick 
32*41488Smckusick fhpibreset(unit)
33*41488Smckusick {
34*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
35*41488Smckusick 	register struct fhpibdevice *hd;
36*41488Smckusick 
37*41488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
38*41488Smckusick 	hd->hpib_cid = 0xFF;
39*41488Smckusick 	DELAY(100);
40*41488Smckusick 	hd->hpib_cmd = CT_8BIT;
41*41488Smckusick 	hd->hpib_ar = AR_ARONC;
42*41488Smckusick 	hd->hpib_cmd |= CT_IFC;
43*41488Smckusick 	hd->hpib_cmd |= CT_INITFIFO;
44*41488Smckusick 	DELAY(100);
45*41488Smckusick 	hd->hpib_cmd &= ~CT_IFC;
46*41488Smckusick 	hd->hpib_cmd |= CT_REN;
47*41488Smckusick 	hd->hpib_stat = ST_ATN;
48*41488Smckusick 	hd->hpib_data = C_DCL;
49*41488Smckusick 	DELAY(100000);
50*41488Smckusick }
51*41488Smckusick 
52*41488Smckusick fhpibsend(unit, slave, sec, buf, cnt)
53*41488Smckusick 	register char *buf;
54*41488Smckusick 	register int cnt;
55*41488Smckusick {
56*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
57*41488Smckusick 	register struct fhpibdevice *hd;
58*41488Smckusick 	int origcnt = cnt;
59*41488Smckusick 
60*41488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
61*41488Smckusick 	hd->hpib_stat = 0;
62*41488Smckusick 	hd->hpib_imask = IM_IDLE | IM_ROOM;
63*41488Smckusick 	fhpibwait(hd, IM_IDLE);
64*41488Smckusick 	hd->hpib_stat = ST_ATN;
65*41488Smckusick 	hd->hpib_data = C_UNL;
66*41488Smckusick 	hd->hpib_data = C_TAG + hs->sc_ba;
67*41488Smckusick 	hd->hpib_data = C_LAG + slave;
68*41488Smckusick 	if (sec != -1)
69*41488Smckusick 		hd->hpib_data = C_SCG + sec;
70*41488Smckusick 	fhpibwait(hd, IM_IDLE);
71*41488Smckusick 	hd->hpib_stat = ST_WRITE;
72*41488Smckusick 	if (cnt) {
73*41488Smckusick 		while (--cnt) {
74*41488Smckusick 			hd->hpib_data = *buf++;
75*41488Smckusick 			if (fhpibwait(hd, IM_ROOM) < 0)
76*41488Smckusick 				break;
77*41488Smckusick 		}
78*41488Smckusick 		hd->hpib_stat = ST_EOI;
79*41488Smckusick 		hd->hpib_data = *buf;
80*41488Smckusick 		if (fhpibwait(hd, IM_ROOM) < 0)
81*41488Smckusick 			cnt++;
82*41488Smckusick 		hd->hpib_stat = ST_ATN;
83*41488Smckusick 		/* XXX: HP-UX claims bug with CS80 transparent messages */
84*41488Smckusick 		if (sec == 0x12)
85*41488Smckusick 			DELAY(150);
86*41488Smckusick 		hd->hpib_data = C_UNL;
87*41488Smckusick 		fhpibwait(hd, IM_IDLE);
88*41488Smckusick 	}
89*41488Smckusick 	hd->hpib_imask = 0;
90*41488Smckusick 	return(origcnt - cnt);
91*41488Smckusick }
92*41488Smckusick 
93*41488Smckusick fhpibrecv(unit, slave, sec, buf, cnt)
94*41488Smckusick 	register char *buf;
95*41488Smckusick 	register int cnt;
96*41488Smckusick {
97*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
98*41488Smckusick 	register struct fhpibdevice *hd;
99*41488Smckusick 	int origcnt = cnt;
100*41488Smckusick 
101*41488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
102*41488Smckusick 	hd->hpib_stat = 0;
103*41488Smckusick 	hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE;
104*41488Smckusick 	fhpibwait(hd, IM_IDLE);
105*41488Smckusick 	hd->hpib_stat = ST_ATN;
106*41488Smckusick 	hd->hpib_data = C_UNL;
107*41488Smckusick 	hd->hpib_data = C_LAG + hs->sc_ba;
108*41488Smckusick 	hd->hpib_data = C_TAG + slave;
109*41488Smckusick 	if (sec != -1)
110*41488Smckusick 		hd->hpib_data = C_SCG + sec;
111*41488Smckusick 	fhpibwait(hd, IM_IDLE);
112*41488Smckusick 	hd->hpib_stat = ST_READ0;
113*41488Smckusick 	hd->hpib_data = 0;
114*41488Smckusick 	if (cnt) {
115*41488Smckusick 		while (--cnt >= 0) {
116*41488Smckusick 			if (fhpibwait(hd, IM_BYTE) < 0)
117*41488Smckusick 				break;
118*41488Smckusick 			*buf++ = hd->hpib_data;
119*41488Smckusick 		}
120*41488Smckusick 		cnt++;
121*41488Smckusick 		fhpibwait(hd, IM_ROOM);
122*41488Smckusick 		hd->hpib_stat = ST_ATN;
123*41488Smckusick 		hd->hpib_data = (slave == 31) ? C_UNA : C_UNT;
124*41488Smckusick 		fhpibwait(hd, IM_IDLE);
125*41488Smckusick 	}
126*41488Smckusick 	hd->hpib_imask = 0;
127*41488Smckusick 	return(origcnt - cnt);
128*41488Smckusick }
129*41488Smckusick 
130*41488Smckusick fhpibppoll(unit)
131*41488Smckusick 	register int unit;
132*41488Smckusick {
133*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
134*41488Smckusick 	register struct fhpibdevice *hd;
135*41488Smckusick 	register int ppoll;
136*41488Smckusick 
137*41488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
138*41488Smckusick 	hd->hpib_stat = 0;
139*41488Smckusick 	hd->hpib_psense = 0;
140*41488Smckusick 	hd->hpib_pmask = 0xFF;
141*41488Smckusick 	hd->hpib_imask = IM_PPRESP | IM_PABORT;
142*41488Smckusick 	DELAY(25);
143*41488Smckusick 	hd->hpib_intr = IM_PABORT;
144*41488Smckusick 	ppoll = hd->hpib_data;
145*41488Smckusick 	if (hd->hpib_intr & IM_PABORT)
146*41488Smckusick 		ppoll = 0;
147*41488Smckusick 	hd->hpib_imask = 0;
148*41488Smckusick 	hd->hpib_pmask = 0;
149*41488Smckusick 	hd->hpib_stat = ST_IENAB;
150*41488Smckusick 	return(ppoll);
151*41488Smckusick }
152*41488Smckusick 
153*41488Smckusick fhpibwait(hd, x)
154*41488Smckusick 	register struct fhpibdevice *hd;
155*41488Smckusick {
156*41488Smckusick 	register int timo = 100000;
157*41488Smckusick 
158*41488Smckusick 	while ((hd->hpib_intr & x) == 0 && --timo)
159*41488Smckusick 		;
160*41488Smckusick 	if (timo == 0)
161*41488Smckusick 		return(-1);
162*41488Smckusick 	return(0);
163*41488Smckusick }
164