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