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