xref: /csrg-svn/sys/hp300/stand/hpib.c (revision 54073)
141488Smckusick /*
241488Smckusick  * Copyright (c) 1982, 1990 The Regents of the University of California.
341488Smckusick  * All rights reserved.
441488Smckusick  *
541488Smckusick  * %sccs.include.redist.c%
641488Smckusick  *
7*54073Shibler  *	@(#)hpib.c	7.6 (Berkeley) 06/18/92
841488Smckusick  */
941488Smckusick 
1041488Smckusick /*
1141488Smckusick  * HPIB driver
1241488Smckusick  */
13*54073Shibler #include "sys/param.h"
14*54073Shibler #include "sys/reboot.h"
15*54073Shibler #include "hp/dev/device.h"
1641488Smckusick #include "hpibvar.h"
1741488Smckusick 
1841488Smckusick #include "saio.h"
1941488Smckusick #include "samachdep.h"
2041488Smckusick 
2149334Shibler int	internalhpib = IIOV(0x478000);
2241488Smckusick int	fhpibppoll(), nhpibppoll();
2341488Smckusick 
2441488Smckusick struct	hpib_softc hpib_softc[NHPIB];
2541488Smckusick 
2641488Smckusick hpibinit()
2741488Smckusick {
2841488Smckusick 	extern struct hp_hw sc_table[];
2941488Smckusick 	register struct hp_hw *hw;
3041488Smckusick 	register struct hpib_softc *hs;
3141488Smckusick 	register int i, addr;
32*54073Shibler 
3341488Smckusick 	i = 0;
3449334Shibler 	for (hw = sc_table; i < NHPIB && hw < &sc_table[MAXCTLRS]; hw++) {
3549334Shibler 		if (!HW_ISHPIB(hw))
3641488Smckusick 			continue;
3741488Smckusick 		hs = &hpib_softc[i];
3849334Shibler 		hs->sc_addr = hw->hw_kva;
3941488Smckusick 		if (nhpibinit(i) == 0)
4041488Smckusick 			if (fhpibinit(i) == 0)
4141488Smckusick 				continue;
4241488Smckusick 		if (howto & RB_ASKNAME)
4341488Smckusick 			printf("hpib%d at sc%d\n", i, hw->hw_sc);
44*54073Shibler 		hw->hw_pa = (caddr_t) i;	/* XXX for autoconfig */
4541488Smckusick 		hs->sc_alive = 1;
4641488Smckusick 		i++;
4741488Smckusick 	}
4841488Smckusick }
4941488Smckusick 
5041488Smckusick hpibalive(unit)
5141488Smckusick 	register int unit;
5241488Smckusick {
5341488Smckusick 	if (unit >= NHPIB || hpib_softc[unit].sc_alive == 0)
5441488Smckusick 		return (0);
5541488Smckusick 	return (1);
5641488Smckusick }
5741488Smckusick 
58*54073Shibler hpibid(unit, slave)
59*54073Shibler 	int unit, slave;
6041488Smckusick {
6141488Smckusick 	short id;
62*54073Shibler 	int rv;
6341488Smckusick 
64*54073Shibler 	if (hpib_softc[unit].sc_type == HPIBC)
65*54073Shibler 		rv = fhpibrecv(unit, 31, slave, &id, 2);
6641488Smckusick 	else
67*54073Shibler 		rv = nhpibrecv(unit, 31, slave, &id, 2);
68*54073Shibler 	if (rv != 2)
6941488Smckusick 		return (0);
7041488Smckusick 	return (id);
7141488Smckusick }
7241488Smckusick 
73*54073Shibler hpibsend(unit, slave, sec, buf, cnt)
74*54073Shibler 	int unit, slave;
75*54073Shibler 	char *buf;
76*54073Shibler 	int cnt;
7741488Smckusick {
78*54073Shibler 	if (hpib_softc[unit].sc_type == HPIBC)
7941488Smckusick 		return (fhpibsend(unit, slave, sec, buf, cnt));
80*54073Shibler 	return (nhpibsend(unit, slave, sec, buf, cnt));
8141488Smckusick }
8241488Smckusick 
83*54073Shibler hpibrecv(unit, slave, sec, buf, cnt)
84*54073Shibler 	int unit, slave;
85*54073Shibler 	char *buf;
86*54073Shibler 	int cnt;
8741488Smckusick {
88*54073Shibler 	if (hpib_softc[unit].sc_type == HPIBC)
8941488Smckusick 		return (fhpibrecv(unit, slave, sec, buf, cnt));
90*54073Shibler 	return (nhpibrecv(unit, slave, sec, buf, cnt));
9141488Smckusick }
9241488Smckusick 
93*54073Shibler hpibswait(unit, slave)
94*54073Shibler 	register int unit, slave;
9541488Smckusick {
9641488Smckusick 	register int timo = 1000000;
9741488Smckusick 	register int (*poll)();
9841488Smckusick 
99*54073Shibler 	slave = 0x80 >> slave;
10041488Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
10141488Smckusick 		poll = fhpibppoll;
10241488Smckusick 	else
10341488Smckusick 		poll = nhpibppoll;
10441488Smckusick 	while (((*poll)(unit) & slave) == 0)
10541488Smckusick 		if (--timo == 0)
10641488Smckusick 			break;
10741488Smckusick 	if (timo == 0)
10841488Smckusick 		return (-1);
10941488Smckusick 	return (0);
11041488Smckusick }
11141488Smckusick 
112*54073Shibler hpibgo(unit, slave, sec, addr, count, flag)
113*54073Shibler 	int unit, slave;
11441488Smckusick 	char *addr;
11541488Smckusick {
11641488Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
11749155Sbostic 		if (flag == F_READ)
11841488Smckusick 			fhpibrecv(unit, slave, sec, addr, count);
11941488Smckusick 		else
12041488Smckusick 			fhpibsend(unit, slave, sec, addr, count);
12141488Smckusick 	else
12249155Sbostic 		if (flag == F_READ)
12341488Smckusick 			nhpibrecv(unit, slave, sec, addr, count);
12441488Smckusick 		else
12541488Smckusick 			nhpibsend(unit, slave, sec, addr, count);
12641488Smckusick }
127