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