1*41488Smckusick /* 2*41488Smckusick * Copyright (c) 1982, 1990 The Regents of the University of California. 3*41488Smckusick * All rights reserved. 4*41488Smckusick * 5*41488Smckusick * %sccs.include.redist.c% 6*41488Smckusick * 7*41488Smckusick * @(#)hpib.c 7.1 (Berkeley) 05/08/90 8*41488Smckusick */ 9*41488Smckusick 10*41488Smckusick /* 11*41488Smckusick * HPIB driver 12*41488Smckusick */ 13*41488Smckusick #include "../h/reboot.h" 14*41488Smckusick #include "../hpdev/device.h" 15*41488Smckusick #include "hpibvar.h" 16*41488Smckusick 17*41488Smckusick #include "saio.h" 18*41488Smckusick #include "samachdep.h" 19*41488Smckusick 20*41488Smckusick int internalhpib = 0x478000; 21*41488Smckusick int fhpibppoll(), nhpibppoll(); 22*41488Smckusick 23*41488Smckusick struct hpib_softc hpib_softc[NHPIB]; 24*41488Smckusick 25*41488Smckusick #define hpibunit(x) ((x) >> 3) 26*41488Smckusick #define hpibslave(x) ((x) & 7) 27*41488Smckusick 28*41488Smckusick hpibinit() 29*41488Smckusick { 30*41488Smckusick extern struct hp_hw sc_table[]; 31*41488Smckusick register struct hp_hw *hw; 32*41488Smckusick register struct hpib_softc *hs; 33*41488Smckusick register int i, addr; 34*41488Smckusick static int first = 1; 35*41488Smckusick 36*41488Smckusick i = 0; 37*41488Smckusick for (hw = sc_table; i < NHPIB && hw < &sc_table[MAX_CTLR]; hw++) { 38*41488Smckusick if (hw->hw_type != HPIB) 39*41488Smckusick continue; 40*41488Smckusick hs = &hpib_softc[i]; 41*41488Smckusick hs->sc_addr = hw->hw_addr; 42*41488Smckusick if (nhpibinit(i) == 0) 43*41488Smckusick if (fhpibinit(i) == 0) 44*41488Smckusick continue; 45*41488Smckusick if (howto & RB_ASKNAME) 46*41488Smckusick printf("hpib%d at sc%d\n", i, hw->hw_sc); 47*41488Smckusick /* 48*41488Smckusick * Adjust devtype on first call. This routine assumes that 49*41488Smckusick * adaptor is in the high byte of devtype. 50*41488Smckusick */ 51*41488Smckusick if (first && ((devtype >> 24) & 0xff) == hw->hw_sc) { 52*41488Smckusick devtype = (devtype & 0x00ffffff) | (i << 24); 53*41488Smckusick first = 0; 54*41488Smckusick } 55*41488Smckusick hs->sc_alive = 1; 56*41488Smckusick i++; 57*41488Smckusick } 58*41488Smckusick } 59*41488Smckusick 60*41488Smckusick hpibalive(unit) 61*41488Smckusick register int unit; 62*41488Smckusick { 63*41488Smckusick unit = hpibunit(unit); 64*41488Smckusick if (unit >= NHPIB || hpib_softc[unit].sc_alive == 0) 65*41488Smckusick return (0); 66*41488Smckusick return (1); 67*41488Smckusick } 68*41488Smckusick 69*41488Smckusick hpibid(unit) 70*41488Smckusick register int unit; 71*41488Smckusick { 72*41488Smckusick register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)]; 73*41488Smckusick register int slave; 74*41488Smckusick short id; 75*41488Smckusick 76*41488Smckusick slave = hpibslave(unit); 77*41488Smckusick unit = hpibunit(unit); 78*41488Smckusick if (hs->sc_type == HPIBC) 79*41488Smckusick slave = fhpibrecv(unit, 31, slave, &id, 2); 80*41488Smckusick else 81*41488Smckusick slave = nhpibrecv(unit, 31, slave, &id, 2); 82*41488Smckusick if (slave != 2) 83*41488Smckusick return (0); 84*41488Smckusick return (id); 85*41488Smckusick } 86*41488Smckusick 87*41488Smckusick hpibsend(unit, sec, buf, cnt) 88*41488Smckusick register char *buf; 89*41488Smckusick register int cnt; 90*41488Smckusick { 91*41488Smckusick register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)]; 92*41488Smckusick register int slave; 93*41488Smckusick 94*41488Smckusick slave = hpibslave(unit); 95*41488Smckusick unit = hpibunit(unit); 96*41488Smckusick if (hs->sc_type == HPIBC) 97*41488Smckusick return (fhpibsend(unit, slave, sec, buf, cnt)); 98*41488Smckusick else 99*41488Smckusick return (nhpibsend(unit, slave, sec, buf, cnt)); 100*41488Smckusick } 101*41488Smckusick 102*41488Smckusick hpibrecv(unit, sec, buf, cnt) 103*41488Smckusick register char *buf; 104*41488Smckusick register int cnt; 105*41488Smckusick { 106*41488Smckusick register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)]; 107*41488Smckusick register int slave; 108*41488Smckusick 109*41488Smckusick slave = hpibslave(unit); 110*41488Smckusick unit = hpibunit(unit); 111*41488Smckusick if (hs->sc_type == HPIBC) 112*41488Smckusick return (fhpibrecv(unit, slave, sec, buf, cnt)); 113*41488Smckusick else 114*41488Smckusick return (nhpibrecv(unit, slave, sec, buf, cnt)); 115*41488Smckusick } 116*41488Smckusick 117*41488Smckusick hpibswait(unit) 118*41488Smckusick register int unit; 119*41488Smckusick { 120*41488Smckusick register int timo = 1000000; 121*41488Smckusick register int slave = 0x80 >> hpibslave(unit); 122*41488Smckusick register int (*poll)(); 123*41488Smckusick 124*41488Smckusick unit = hpibunit(unit); 125*41488Smckusick if (hpib_softc[unit].sc_type == HPIBC) 126*41488Smckusick poll = fhpibppoll; 127*41488Smckusick else 128*41488Smckusick poll = nhpibppoll; 129*41488Smckusick while (((*poll)(unit) & slave) == 0) 130*41488Smckusick if (--timo == 0) 131*41488Smckusick break; 132*41488Smckusick if (timo == 0) 133*41488Smckusick return (-1); 134*41488Smckusick return (0); 135*41488Smckusick } 136*41488Smckusick 137*41488Smckusick hpibgo(unit, sec, addr, count, flag) 138*41488Smckusick register int unit; 139*41488Smckusick char *addr; 140*41488Smckusick { 141*41488Smckusick register int slave; 142*41488Smckusick 143*41488Smckusick slave = hpibslave(unit); 144*41488Smckusick unit = hpibunit(unit); 145*41488Smckusick if (hpib_softc[unit].sc_type == HPIBC) 146*41488Smckusick if (flag == READ) 147*41488Smckusick fhpibrecv(unit, slave, sec, addr, count); 148*41488Smckusick else 149*41488Smckusick fhpibsend(unit, slave, sec, addr, count); 150*41488Smckusick else 151*41488Smckusick if (flag == READ) 152*41488Smckusick nhpibrecv(unit, slave, sec, addr, count); 153*41488Smckusick else 154*41488Smckusick nhpibsend(unit, slave, sec, addr, count); 155*41488Smckusick } 156