xref: /csrg-svn/sys/hp300/stand/hpib.c (revision 63163)
141488Smckusick /*
2*63163Sbostic  * Copyright (c) 1982, 1990, 1993
3*63163Sbostic  *	The Regents of the University of California.  All rights reserved.
441488Smckusick  *
541488Smckusick  * %sccs.include.redist.c%
641488Smckusick  *
7*63163Sbostic  *	@(#)hpib.c	8.1 (Berkeley) 06/10/93
841488Smckusick  */
941488Smckusick 
1041488Smckusick /*
1141488Smckusick  * HPIB driver
1241488Smckusick  */
1356510Sbostic #include <sys/param.h>
1456510Sbostic #include <sys/reboot.h>
1556510Sbostic #include <hp/dev/device.h>
1656510Sbostic #include <hp300/stand/hpibvar.h>
1741488Smckusick 
1860329Smckusick #include <stand.att/saio.h>
1956510Sbostic #include <hp300/stand/samachdep.h>
2041488Smckusick 
2149334Shibler int	internalhpib = IIOV(0x478000);
2241488Smckusick int	fhpibppoll(), nhpibppoll();
2341488Smckusick 
2441488Smckusick struct	hpib_softc hpib_softc[NHPIB];
2541488Smckusick 
hpibinit()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;
3254073Shibler 
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);
4454073Shibler 		hw->hw_pa = (caddr_t) i;	/* XXX for autoconfig */
4541488Smckusick 		hs->sc_alive = 1;
4641488Smckusick 		i++;
4741488Smckusick 	}
4841488Smckusick }
4941488Smckusick 
hpibalive(unit)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 
hpibid(unit,slave)5854073Shibler hpibid(unit, slave)
5954073Shibler 	int unit, slave;
6041488Smckusick {
6141488Smckusick 	short id;
6254073Shibler 	int rv;
6341488Smckusick 
6454073Shibler 	if (hpib_softc[unit].sc_type == HPIBC)
6554073Shibler 		rv = fhpibrecv(unit, 31, slave, &id, 2);
6641488Smckusick 	else
6754073Shibler 		rv = nhpibrecv(unit, 31, slave, &id, 2);
6854073Shibler 	if (rv != 2)
6941488Smckusick 		return (0);
7041488Smckusick 	return (id);
7141488Smckusick }
7241488Smckusick 
hpibsend(unit,slave,sec,buf,cnt)7354073Shibler hpibsend(unit, slave, sec, buf, cnt)
7454073Shibler 	int unit, slave;
7554073Shibler 	char *buf;
7654073Shibler 	int cnt;
7741488Smckusick {
7854073Shibler 	if (hpib_softc[unit].sc_type == HPIBC)
7941488Smckusick 		return (fhpibsend(unit, slave, sec, buf, cnt));
8054073Shibler 	return (nhpibsend(unit, slave, sec, buf, cnt));
8141488Smckusick }
8241488Smckusick 
hpibrecv(unit,slave,sec,buf,cnt)8354073Shibler hpibrecv(unit, slave, sec, buf, cnt)
8454073Shibler 	int unit, slave;
8554073Shibler 	char *buf;
8654073Shibler 	int cnt;
8741488Smckusick {
8854073Shibler 	if (hpib_softc[unit].sc_type == HPIBC)
8941488Smckusick 		return (fhpibrecv(unit, slave, sec, buf, cnt));
9054073Shibler 	return (nhpibrecv(unit, slave, sec, buf, cnt));
9141488Smckusick }
9241488Smckusick 
hpibswait(unit,slave)9354073Shibler hpibswait(unit, slave)
9454073Shibler 	register int unit, slave;
9541488Smckusick {
9641488Smckusick 	register int timo = 1000000;
9741488Smckusick 	register int (*poll)();
9841488Smckusick 
9954073Shibler 	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 
hpibgo(unit,slave,sec,addr,count,flag)11254073Shibler hpibgo(unit, slave, sec, addr, count, flag)
11354073Shibler 	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