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 * @(#)nhpib.c 7.1 (Berkeley) 05/08/90 8*41488Smckusick */ 9*41488Smckusick 10*41488Smckusick /* 11*41488Smckusick * Internal/98624 HPIB driver 12*41488Smckusick */ 13*41488Smckusick 14*41488Smckusick #include "param.h" 15*41488Smckusick #include "../hpdev/nhpibreg.h" 16*41488Smckusick #include "hpibvar.h" 17*41488Smckusick 18*41488Smckusick nhpibinit(unit) 19*41488Smckusick { 20*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 21*41488Smckusick register struct nhpibdevice *hd = (struct nhpibdevice *)hs->sc_addr; 22*41488Smckusick extern int internalhpib; 23*41488Smckusick 24*41488Smckusick if ((int)hd == internalhpib) { 25*41488Smckusick hs->sc_type = HPIBA; 26*41488Smckusick hs->sc_ba = HPIBA_BA; 27*41488Smckusick } 28*41488Smckusick else if (hd->hpib_cid == HPIBB) { 29*41488Smckusick hs->sc_type = HPIBB; 30*41488Smckusick hs->sc_ba = hd->hpib_csa & CSA_BA; 31*41488Smckusick } 32*41488Smckusick else 33*41488Smckusick return(0); 34*41488Smckusick nhpibreset(unit); 35*41488Smckusick return(1); 36*41488Smckusick } 37*41488Smckusick 38*41488Smckusick nhpibreset(unit) 39*41488Smckusick { 40*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 41*41488Smckusick register struct nhpibdevice *hd; 42*41488Smckusick 43*41488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 44*41488Smckusick hd->hpib_acr = AUX_SSWRST; 45*41488Smckusick hd->hpib_ar = hs->sc_ba; 46*41488Smckusick hd->hpib_lim = 0; 47*41488Smckusick hd->hpib_mim = 0; 48*41488Smckusick hd->hpib_acr = AUX_CDAI; 49*41488Smckusick hd->hpib_acr = AUX_CSHDW; 50*41488Smckusick hd->hpib_acr = AUX_SSTD1; 51*41488Smckusick hd->hpib_acr = AUX_SVSTD1; 52*41488Smckusick hd->hpib_acr = AUX_CPP; 53*41488Smckusick hd->hpib_acr = AUX_CHDFA; 54*41488Smckusick hd->hpib_acr = AUX_CHDFE; 55*41488Smckusick hd->hpib_acr = AUX_RHDF; 56*41488Smckusick hd->hpib_acr = AUX_CSWRST; 57*41488Smckusick hd->hpib_acr = AUX_TCA; 58*41488Smckusick hd->hpib_acr = AUX_CSRE; 59*41488Smckusick hd->hpib_acr = AUX_SSIC; 60*41488Smckusick DELAY(100); 61*41488Smckusick hd->hpib_acr = AUX_CSIC; 62*41488Smckusick hd->hpib_acr = AUX_SSRE; 63*41488Smckusick hd->hpib_data = C_DCL; 64*41488Smckusick DELAY(100000); 65*41488Smckusick } 66*41488Smckusick 67*41488Smckusick nhpibsend(unit, slave, sec, buf, cnt) 68*41488Smckusick register char *buf; 69*41488Smckusick register int cnt; 70*41488Smckusick { 71*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 72*41488Smckusick register struct nhpibdevice *hd; 73*41488Smckusick register int origcnt = cnt; 74*41488Smckusick 75*41488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 76*41488Smckusick hd->hpib_acr = AUX_TCA; 77*41488Smckusick hd->hpib_data = C_UNL; 78*41488Smckusick nhpibowait(hd); 79*41488Smckusick hd->hpib_data = C_TAG + hs->sc_ba; 80*41488Smckusick hd->hpib_acr = AUX_STON; 81*41488Smckusick nhpibowait(hd); 82*41488Smckusick hd->hpib_data = C_LAG + slave; 83*41488Smckusick nhpibowait(hd); 84*41488Smckusick if (sec != -1) { 85*41488Smckusick hd->hpib_data = C_SCG + sec; 86*41488Smckusick nhpibowait(hd); 87*41488Smckusick } 88*41488Smckusick hd->hpib_acr = AUX_GTS; 89*41488Smckusick if (cnt) { 90*41488Smckusick while (--cnt) { 91*41488Smckusick hd->hpib_data = *buf++; 92*41488Smckusick if (nhpibowait(hd) < 0) 93*41488Smckusick break; 94*41488Smckusick } 95*41488Smckusick hd->hpib_acr = AUX_EOI; 96*41488Smckusick hd->hpib_data = *buf; 97*41488Smckusick if (nhpibowait(hd) < 0) 98*41488Smckusick cnt++; 99*41488Smckusick hd->hpib_acr = AUX_TCA; 100*41488Smckusick } 101*41488Smckusick return(origcnt - cnt); 102*41488Smckusick } 103*41488Smckusick 104*41488Smckusick nhpibrecv(unit, slave, sec, buf, cnt) 105*41488Smckusick register char *buf; 106*41488Smckusick register int cnt; 107*41488Smckusick { 108*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 109*41488Smckusick register struct nhpibdevice *hd; 110*41488Smckusick register int origcnt = cnt; 111*41488Smckusick 112*41488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 113*41488Smckusick hd->hpib_acr = AUX_TCA; 114*41488Smckusick hd->hpib_data = C_UNL; 115*41488Smckusick nhpibowait(hd); 116*41488Smckusick hd->hpib_data = C_LAG + hs->sc_ba; 117*41488Smckusick hd->hpib_acr = AUX_SLON; 118*41488Smckusick nhpibowait(hd); 119*41488Smckusick hd->hpib_data = C_TAG + slave; 120*41488Smckusick nhpibowait(hd); 121*41488Smckusick if (sec != -1) { 122*41488Smckusick hd->hpib_data = C_SCG + sec; 123*41488Smckusick nhpibowait(hd); 124*41488Smckusick } 125*41488Smckusick hd->hpib_acr = AUX_RHDF; 126*41488Smckusick hd->hpib_acr = AUX_GTS; 127*41488Smckusick if (cnt) { 128*41488Smckusick while (--cnt >= 0) { 129*41488Smckusick if (nhpibiwait(hd) < 0) 130*41488Smckusick break; 131*41488Smckusick *buf++ = hd->hpib_data; 132*41488Smckusick } 133*41488Smckusick cnt++; 134*41488Smckusick hd->hpib_acr = AUX_TCA; 135*41488Smckusick } 136*41488Smckusick return(origcnt - cnt); 137*41488Smckusick } 138*41488Smckusick 139*41488Smckusick nhpibppoll(unit) 140*41488Smckusick register int unit; 141*41488Smckusick { 142*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 143*41488Smckusick register struct nhpibdevice *hd; 144*41488Smckusick register int ppoll; 145*41488Smckusick 146*41488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 147*41488Smckusick hd->hpib_acr = AUX_SPP; 148*41488Smckusick DELAY(25); 149*41488Smckusick ppoll = hd->hpib_cpt; 150*41488Smckusick hd->hpib_acr = AUX_CPP; 151*41488Smckusick return(ppoll); 152*41488Smckusick } 153*41488Smckusick 154*41488Smckusick nhpibowait(hd) 155*41488Smckusick register struct nhpibdevice *hd; 156*41488Smckusick { 157*41488Smckusick register int timo = 100000; 158*41488Smckusick 159*41488Smckusick while ((hd->hpib_mis & MIS_BO) == 0 && --timo) 160*41488Smckusick ; 161*41488Smckusick if (timo == 0) 162*41488Smckusick return(-1); 163*41488Smckusick return(0); 164*41488Smckusick } 165*41488Smckusick 166*41488Smckusick nhpibiwait(hd) 167*41488Smckusick register struct nhpibdevice *hd; 168*41488Smckusick { 169*41488Smckusick register int timo = 100000; 170*41488Smckusick 171*41488Smckusick while ((hd->hpib_mis & MIS_BI) == 0 && --timo) 172*41488Smckusick ; 173*41488Smckusick if (timo == 0) 174*41488Smckusick return(-1); 175*41488Smckusick return(0); 176*41488Smckusick } 177