xref: /csrg-svn/sys/hp300/stand/hpib.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  *	@(#)hpib.c	7.1 (Berkeley) 05/08/90
8*41488Smckusick  */
9*41488Smckusick 
10*41488Smckusick /*
11*41488Smckusick  * HPIB driver
12*41488Smckusick  */
13*41488Smckusick #include "../h/reboot.h"
14*41488Smckusick #include "../hpdev/device.h"
15*41488Smckusick #include "hpibvar.h"
16*41488Smckusick 
17*41488Smckusick #include "saio.h"
18*41488Smckusick #include "samachdep.h"
19*41488Smckusick 
20*41488Smckusick int	internalhpib = 0x478000;
21*41488Smckusick int	fhpibppoll(), nhpibppoll();
22*41488Smckusick 
23*41488Smckusick struct	hpib_softc hpib_softc[NHPIB];
24*41488Smckusick 
25*41488Smckusick #define	hpibunit(x)	((x) >> 3)
26*41488Smckusick #define	hpibslave(x)	((x) & 7)
27*41488Smckusick 
28*41488Smckusick hpibinit()
29*41488Smckusick {
30*41488Smckusick 	extern struct hp_hw sc_table[];
31*41488Smckusick 	register struct hp_hw *hw;
32*41488Smckusick 	register struct hpib_softc *hs;
33*41488Smckusick 	register int i, addr;
34*41488Smckusick 	static int first = 1;
35*41488Smckusick 
36*41488Smckusick 	i = 0;
37*41488Smckusick 	for (hw = sc_table; i < NHPIB && hw < &sc_table[MAX_CTLR]; hw++) {
38*41488Smckusick 		if (hw->hw_type != HPIB)
39*41488Smckusick 			continue;
40*41488Smckusick 		hs = &hpib_softc[i];
41*41488Smckusick 		hs->sc_addr = hw->hw_addr;
42*41488Smckusick 		if (nhpibinit(i) == 0)
43*41488Smckusick 			if (fhpibinit(i) == 0)
44*41488Smckusick 				continue;
45*41488Smckusick 		if (howto & RB_ASKNAME)
46*41488Smckusick 			printf("hpib%d at sc%d\n", i, hw->hw_sc);
47*41488Smckusick 		/*
48*41488Smckusick 		 * Adjust devtype on first call.  This routine assumes that
49*41488Smckusick 		 * adaptor is in the high byte of devtype.
50*41488Smckusick 		 */
51*41488Smckusick 		if (first && ((devtype >> 24) & 0xff) == hw->hw_sc) {
52*41488Smckusick 			devtype = (devtype & 0x00ffffff) | (i << 24);
53*41488Smckusick 			first = 0;
54*41488Smckusick 		}
55*41488Smckusick 		hs->sc_alive = 1;
56*41488Smckusick 		i++;
57*41488Smckusick 	}
58*41488Smckusick }
59*41488Smckusick 
60*41488Smckusick hpibalive(unit)
61*41488Smckusick 	register int unit;
62*41488Smckusick {
63*41488Smckusick 	unit = hpibunit(unit);
64*41488Smckusick 	if (unit >= NHPIB || hpib_softc[unit].sc_alive == 0)
65*41488Smckusick 		return (0);
66*41488Smckusick 	return (1);
67*41488Smckusick }
68*41488Smckusick 
69*41488Smckusick hpibid(unit)
70*41488Smckusick 	register int unit;
71*41488Smckusick {
72*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
73*41488Smckusick 	register int slave;
74*41488Smckusick 	short id;
75*41488Smckusick 
76*41488Smckusick 	slave = hpibslave(unit);
77*41488Smckusick 	unit = hpibunit(unit);
78*41488Smckusick 	if (hs->sc_type == HPIBC)
79*41488Smckusick 		slave = fhpibrecv(unit, 31, slave, &id, 2);
80*41488Smckusick 	else
81*41488Smckusick 		slave = nhpibrecv(unit, 31, slave, &id, 2);
82*41488Smckusick 	if (slave != 2)
83*41488Smckusick 		return (0);
84*41488Smckusick 	return (id);
85*41488Smckusick }
86*41488Smckusick 
87*41488Smckusick hpibsend(unit, sec, buf, cnt)
88*41488Smckusick 	register char *buf;
89*41488Smckusick 	register int cnt;
90*41488Smckusick {
91*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
92*41488Smckusick 	register int slave;
93*41488Smckusick 
94*41488Smckusick 	slave = hpibslave(unit);
95*41488Smckusick 	unit = hpibunit(unit);
96*41488Smckusick 	if (hs->sc_type == HPIBC)
97*41488Smckusick 		return (fhpibsend(unit, slave, sec, buf, cnt));
98*41488Smckusick 	else
99*41488Smckusick 		return (nhpibsend(unit, slave, sec, buf, cnt));
100*41488Smckusick }
101*41488Smckusick 
102*41488Smckusick hpibrecv(unit, sec, buf, cnt)
103*41488Smckusick 	register char *buf;
104*41488Smckusick 	register int cnt;
105*41488Smckusick {
106*41488Smckusick 	register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
107*41488Smckusick 	register int slave;
108*41488Smckusick 
109*41488Smckusick 	slave = hpibslave(unit);
110*41488Smckusick 	unit = hpibunit(unit);
111*41488Smckusick 	if (hs->sc_type == HPIBC)
112*41488Smckusick 		return (fhpibrecv(unit, slave, sec, buf, cnt));
113*41488Smckusick 	else
114*41488Smckusick 		return (nhpibrecv(unit, slave, sec, buf, cnt));
115*41488Smckusick }
116*41488Smckusick 
117*41488Smckusick hpibswait(unit)
118*41488Smckusick 	register int unit;
119*41488Smckusick {
120*41488Smckusick 	register int timo = 1000000;
121*41488Smckusick 	register int slave = 0x80 >> hpibslave(unit);
122*41488Smckusick 	register int (*poll)();
123*41488Smckusick 
124*41488Smckusick 	unit = hpibunit(unit);
125*41488Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
126*41488Smckusick 		poll = fhpibppoll;
127*41488Smckusick 	else
128*41488Smckusick 		poll = nhpibppoll;
129*41488Smckusick 	while (((*poll)(unit) & slave) == 0)
130*41488Smckusick 		if (--timo == 0)
131*41488Smckusick 			break;
132*41488Smckusick 	if (timo == 0)
133*41488Smckusick 		return (-1);
134*41488Smckusick 	return (0);
135*41488Smckusick }
136*41488Smckusick 
137*41488Smckusick hpibgo(unit, sec, addr, count, flag)
138*41488Smckusick 	register int unit;
139*41488Smckusick 	char *addr;
140*41488Smckusick {
141*41488Smckusick 	register int slave;
142*41488Smckusick 
143*41488Smckusick 	slave = hpibslave(unit);
144*41488Smckusick 	unit = hpibunit(unit);
145*41488Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
146*41488Smckusick 		if (flag == READ)
147*41488Smckusick 			fhpibrecv(unit, slave, sec, addr, count);
148*41488Smckusick 		else
149*41488Smckusick 			fhpibsend(unit, slave, sec, addr, count);
150*41488Smckusick 	else
151*41488Smckusick 		if (flag == READ)
152*41488Smckusick 			nhpibrecv(unit, slave, sec, addr, count);
153*41488Smckusick 		else
154*41488Smckusick 			nhpibsend(unit, slave, sec, addr, count);
155*41488Smckusick }
156