xref: /csrg-svn/sys/hp300/stand/hpib.c (revision 49155)
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*49155Sbostic  *	@(#)hpib.c	7.4 (Berkeley) 05/05/91
841488Smckusick  */
941488Smckusick 
1041488Smckusick /*
1141488Smckusick  * HPIB driver
1241488Smckusick  */
13*49155Sbostic #include <sys/param.h>
14*49155Sbostic #include <sys/reboot.h>
1545790Sbostic #include "../dev/device.h"
1641488Smckusick #include "hpibvar.h"
1741488Smckusick 
1841488Smckusick #include "saio.h"
1941488Smckusick #include "samachdep.h"
2041488Smckusick 
2141488Smckusick int	internalhpib = 0x478000;
2241488Smckusick int	fhpibppoll(), nhpibppoll();
2341488Smckusick 
2441488Smckusick struct	hpib_softc hpib_softc[NHPIB];
2541488Smckusick 
2641488Smckusick #define	hpibunit(x)	((x) >> 3)
2741488Smckusick #define	hpibslave(x)	((x) & 7)
2841488Smckusick 
2941488Smckusick hpibinit()
3041488Smckusick {
3141488Smckusick 	extern struct hp_hw sc_table[];
3241488Smckusick 	register struct hp_hw *hw;
3341488Smckusick 	register struct hpib_softc *hs;
3441488Smckusick 	register int i, addr;
3541488Smckusick 	static int first = 1;
3641488Smckusick 
3741488Smckusick 	i = 0;
3841488Smckusick 	for (hw = sc_table; i < NHPIB && hw < &sc_table[MAX_CTLR]; hw++) {
3941488Smckusick 		if (hw->hw_type != HPIB)
4041488Smckusick 			continue;
4141488Smckusick 		hs = &hpib_softc[i];
4241488Smckusick 		hs->sc_addr = hw->hw_addr;
4341488Smckusick 		if (nhpibinit(i) == 0)
4441488Smckusick 			if (fhpibinit(i) == 0)
4541488Smckusick 				continue;
4641488Smckusick 		if (howto & RB_ASKNAME)
4741488Smckusick 			printf("hpib%d at sc%d\n", i, hw->hw_sc);
4841488Smckusick 		/*
4941488Smckusick 		 * Adjust devtype on first call.  This routine assumes that
5041488Smckusick 		 * adaptor is in the high byte of devtype.
5141488Smckusick 		 */
5241488Smckusick 		if (first && ((devtype >> 24) & 0xff) == hw->hw_sc) {
5341488Smckusick 			devtype = (devtype & 0x00ffffff) | (i << 24);
5441488Smckusick 			first = 0;
5541488Smckusick 		}
5641488Smckusick 		hs->sc_alive = 1;
5741488Smckusick 		i++;
5841488Smckusick 	}
5941488Smckusick }
6041488Smckusick 
6141488Smckusick hpibalive(unit)
6241488Smckusick 	register int unit;
6341488Smckusick {
6441488Smckusick 	unit = hpibunit(unit);
6541488Smckusick 	if (unit >= NHPIB || hpib_softc[unit].sc_alive == 0)
6641488Smckusick 		return (0);
6741488Smckusick 	return (1);
6841488Smckusick }
6941488Smckusick 
7041488Smckusick hpibid(unit)
7141488Smckusick 	register int unit;
7241488Smckusick {
7341488Smckusick 	register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
7441488Smckusick 	register int slave;
7541488Smckusick 	short id;
7641488Smckusick 
7741488Smckusick 	slave = hpibslave(unit);
7841488Smckusick 	unit = hpibunit(unit);
7941488Smckusick 	if (hs->sc_type == HPIBC)
8041488Smckusick 		slave = fhpibrecv(unit, 31, slave, &id, 2);
8141488Smckusick 	else
8241488Smckusick 		slave = nhpibrecv(unit, 31, slave, &id, 2);
8341488Smckusick 	if (slave != 2)
8441488Smckusick 		return (0);
8541488Smckusick 	return (id);
8641488Smckusick }
8741488Smckusick 
8841488Smckusick hpibsend(unit, sec, buf, cnt)
8941488Smckusick 	register char *buf;
9041488Smckusick 	register int cnt;
9141488Smckusick {
9241488Smckusick 	register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
9341488Smckusick 	register int slave;
9441488Smckusick 
9541488Smckusick 	slave = hpibslave(unit);
9641488Smckusick 	unit = hpibunit(unit);
9741488Smckusick 	if (hs->sc_type == HPIBC)
9841488Smckusick 		return (fhpibsend(unit, slave, sec, buf, cnt));
9941488Smckusick 	else
10041488Smckusick 		return (nhpibsend(unit, slave, sec, buf, cnt));
10141488Smckusick }
10241488Smckusick 
10341488Smckusick hpibrecv(unit, sec, buf, cnt)
10441488Smckusick 	register char *buf;
10541488Smckusick 	register int cnt;
10641488Smckusick {
10741488Smckusick 	register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
10841488Smckusick 	register int slave;
10941488Smckusick 
11041488Smckusick 	slave = hpibslave(unit);
11141488Smckusick 	unit = hpibunit(unit);
11241488Smckusick 	if (hs->sc_type == HPIBC)
11341488Smckusick 		return (fhpibrecv(unit, slave, sec, buf, cnt));
11441488Smckusick 	else
11541488Smckusick 		return (nhpibrecv(unit, slave, sec, buf, cnt));
11641488Smckusick }
11741488Smckusick 
11841488Smckusick hpibswait(unit)
11941488Smckusick 	register int unit;
12041488Smckusick {
12141488Smckusick 	register int timo = 1000000;
12241488Smckusick 	register int slave = 0x80 >> hpibslave(unit);
12341488Smckusick 	register int (*poll)();
12441488Smckusick 
12541488Smckusick 	unit = hpibunit(unit);
12641488Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
12741488Smckusick 		poll = fhpibppoll;
12841488Smckusick 	else
12941488Smckusick 		poll = nhpibppoll;
13041488Smckusick 	while (((*poll)(unit) & slave) == 0)
13141488Smckusick 		if (--timo == 0)
13241488Smckusick 			break;
13341488Smckusick 	if (timo == 0)
13441488Smckusick 		return (-1);
13541488Smckusick 	return (0);
13641488Smckusick }
13741488Smckusick 
13841488Smckusick hpibgo(unit, sec, addr, count, flag)
13941488Smckusick 	register int unit;
14041488Smckusick 	char *addr;
14141488Smckusick {
14241488Smckusick 	register int slave;
14341488Smckusick 
14441488Smckusick 	slave = hpibslave(unit);
14541488Smckusick 	unit = hpibunit(unit);
14641488Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
147*49155Sbostic 		if (flag == F_READ)
14841488Smckusick 			fhpibrecv(unit, slave, sec, addr, count);
14941488Smckusick 		else
15041488Smckusick 			fhpibsend(unit, slave, sec, addr, count);
15141488Smckusick 	else
152*49155Sbostic 		if (flag == F_READ)
15341488Smckusick 			nhpibrecv(unit, slave, sec, addr, count);
15441488Smckusick 		else
15541488Smckusick 			nhpibsend(unit, slave, sec, addr, count);
15641488Smckusick }
157