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*54073Shibler * @(#)hpib.c 7.6 (Berkeley) 06/18/92 841488Smckusick */ 941488Smckusick 1041488Smckusick /* 1141488Smckusick * HPIB driver 1241488Smckusick */ 13*54073Shibler #include "sys/param.h" 14*54073Shibler #include "sys/reboot.h" 15*54073Shibler #include "hp/dev/device.h" 1641488Smckusick #include "hpibvar.h" 1741488Smckusick 1841488Smckusick #include "saio.h" 1941488Smckusick #include "samachdep.h" 2041488Smckusick 2149334Shibler int internalhpib = IIOV(0x478000); 2241488Smckusick int fhpibppoll(), nhpibppoll(); 2341488Smckusick 2441488Smckusick struct hpib_softc hpib_softc[NHPIB]; 2541488Smckusick 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; 32*54073Shibler 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); 44*54073Shibler hw->hw_pa = (caddr_t) i; /* XXX for autoconfig */ 4541488Smckusick hs->sc_alive = 1; 4641488Smckusick i++; 4741488Smckusick } 4841488Smckusick } 4941488Smckusick 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 58*54073Shibler hpibid(unit, slave) 59*54073Shibler int unit, slave; 6041488Smckusick { 6141488Smckusick short id; 62*54073Shibler int rv; 6341488Smckusick 64*54073Shibler if (hpib_softc[unit].sc_type == HPIBC) 65*54073Shibler rv = fhpibrecv(unit, 31, slave, &id, 2); 6641488Smckusick else 67*54073Shibler rv = nhpibrecv(unit, 31, slave, &id, 2); 68*54073Shibler if (rv != 2) 6941488Smckusick return (0); 7041488Smckusick return (id); 7141488Smckusick } 7241488Smckusick 73*54073Shibler hpibsend(unit, slave, sec, buf, cnt) 74*54073Shibler int unit, slave; 75*54073Shibler char *buf; 76*54073Shibler int cnt; 7741488Smckusick { 78*54073Shibler if (hpib_softc[unit].sc_type == HPIBC) 7941488Smckusick return (fhpibsend(unit, slave, sec, buf, cnt)); 80*54073Shibler return (nhpibsend(unit, slave, sec, buf, cnt)); 8141488Smckusick } 8241488Smckusick 83*54073Shibler hpibrecv(unit, slave, sec, buf, cnt) 84*54073Shibler int unit, slave; 85*54073Shibler char *buf; 86*54073Shibler int cnt; 8741488Smckusick { 88*54073Shibler if (hpib_softc[unit].sc_type == HPIBC) 8941488Smckusick return (fhpibrecv(unit, slave, sec, buf, cnt)); 90*54073Shibler return (nhpibrecv(unit, slave, sec, buf, cnt)); 9141488Smckusick } 9241488Smckusick 93*54073Shibler hpibswait(unit, slave) 94*54073Shibler register int unit, slave; 9541488Smckusick { 9641488Smckusick register int timo = 1000000; 9741488Smckusick register int (*poll)(); 9841488Smckusick 99*54073Shibler 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 112*54073Shibler hpibgo(unit, slave, sec, addr, count, flag) 113*54073Shibler 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