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