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*56510Sbostic * @(#)nhpib.c 7.3 (Berkeley) 10/11/92 841488Smckusick */ 941488Smckusick 1041488Smckusick /* 1141488Smckusick * Internal/98624 HPIB driver 1241488Smckusick */ 1341488Smckusick 14*56510Sbostic #include <sys/param.h> 15*56510Sbostic #include <hp300/dev/nhpibreg.h> 16*56510Sbostic #include <hp300/stand/hpibvar.h> 1741488Smckusick 1841488Smckusick nhpibinit(unit) 1941488Smckusick { 2041488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 2141488Smckusick register struct nhpibdevice *hd = (struct nhpibdevice *)hs->sc_addr; 2241488Smckusick extern int internalhpib; 2341488Smckusick 2441488Smckusick if ((int)hd == internalhpib) { 2541488Smckusick hs->sc_type = HPIBA; 2641488Smckusick hs->sc_ba = HPIBA_BA; 2741488Smckusick } 2841488Smckusick else if (hd->hpib_cid == HPIBB) { 2941488Smckusick hs->sc_type = HPIBB; 3041488Smckusick hs->sc_ba = hd->hpib_csa & CSA_BA; 3141488Smckusick } 3241488Smckusick else 3341488Smckusick return(0); 3441488Smckusick nhpibreset(unit); 3541488Smckusick return(1); 3641488Smckusick } 3741488Smckusick 3841488Smckusick nhpibreset(unit) 3941488Smckusick { 4041488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 4141488Smckusick register struct nhpibdevice *hd; 4241488Smckusick 4341488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 4441488Smckusick hd->hpib_acr = AUX_SSWRST; 4541488Smckusick hd->hpib_ar = hs->sc_ba; 4641488Smckusick hd->hpib_lim = 0; 4741488Smckusick hd->hpib_mim = 0; 4841488Smckusick hd->hpib_acr = AUX_CDAI; 4941488Smckusick hd->hpib_acr = AUX_CSHDW; 5041488Smckusick hd->hpib_acr = AUX_SSTD1; 5141488Smckusick hd->hpib_acr = AUX_SVSTD1; 5241488Smckusick hd->hpib_acr = AUX_CPP; 5341488Smckusick hd->hpib_acr = AUX_CHDFA; 5441488Smckusick hd->hpib_acr = AUX_CHDFE; 5541488Smckusick hd->hpib_acr = AUX_RHDF; 5641488Smckusick hd->hpib_acr = AUX_CSWRST; 5741488Smckusick hd->hpib_acr = AUX_TCA; 5841488Smckusick hd->hpib_acr = AUX_CSRE; 5941488Smckusick hd->hpib_acr = AUX_SSIC; 6041488Smckusick DELAY(100); 6141488Smckusick hd->hpib_acr = AUX_CSIC; 6241488Smckusick hd->hpib_acr = AUX_SSRE; 6341488Smckusick hd->hpib_data = C_DCL; 6441488Smckusick DELAY(100000); 6541488Smckusick } 6641488Smckusick 6741488Smckusick nhpibsend(unit, slave, sec, buf, cnt) 6841488Smckusick register char *buf; 6941488Smckusick register int cnt; 7041488Smckusick { 7141488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 7241488Smckusick register struct nhpibdevice *hd; 7341488Smckusick register int origcnt = cnt; 7441488Smckusick 7541488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 7641488Smckusick hd->hpib_acr = AUX_TCA; 7741488Smckusick hd->hpib_data = C_UNL; 7841488Smckusick nhpibowait(hd); 7941488Smckusick hd->hpib_data = C_TAG + hs->sc_ba; 8041488Smckusick hd->hpib_acr = AUX_STON; 8141488Smckusick nhpibowait(hd); 8241488Smckusick hd->hpib_data = C_LAG + slave; 8341488Smckusick nhpibowait(hd); 8441488Smckusick if (sec != -1) { 8541488Smckusick hd->hpib_data = C_SCG + sec; 8641488Smckusick nhpibowait(hd); 8741488Smckusick } 8841488Smckusick hd->hpib_acr = AUX_GTS; 8941488Smckusick if (cnt) { 9041488Smckusick while (--cnt) { 9141488Smckusick hd->hpib_data = *buf++; 9241488Smckusick if (nhpibowait(hd) < 0) 9341488Smckusick break; 9441488Smckusick } 9541488Smckusick hd->hpib_acr = AUX_EOI; 9641488Smckusick hd->hpib_data = *buf; 9741488Smckusick if (nhpibowait(hd) < 0) 9841488Smckusick cnt++; 9941488Smckusick hd->hpib_acr = AUX_TCA; 10041488Smckusick } 10141488Smckusick return(origcnt - cnt); 10241488Smckusick } 10341488Smckusick 10441488Smckusick nhpibrecv(unit, slave, sec, buf, cnt) 10541488Smckusick register char *buf; 10641488Smckusick register int cnt; 10741488Smckusick { 10841488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 10941488Smckusick register struct nhpibdevice *hd; 11041488Smckusick register int origcnt = cnt; 11141488Smckusick 11241488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 11341488Smckusick hd->hpib_acr = AUX_TCA; 11441488Smckusick hd->hpib_data = C_UNL; 11541488Smckusick nhpibowait(hd); 11641488Smckusick hd->hpib_data = C_LAG + hs->sc_ba; 11741488Smckusick hd->hpib_acr = AUX_SLON; 11841488Smckusick nhpibowait(hd); 11941488Smckusick hd->hpib_data = C_TAG + slave; 12041488Smckusick nhpibowait(hd); 12141488Smckusick if (sec != -1) { 12241488Smckusick hd->hpib_data = C_SCG + sec; 12341488Smckusick nhpibowait(hd); 12441488Smckusick } 12541488Smckusick hd->hpib_acr = AUX_RHDF; 12641488Smckusick hd->hpib_acr = AUX_GTS; 12741488Smckusick if (cnt) { 12841488Smckusick while (--cnt >= 0) { 12941488Smckusick if (nhpibiwait(hd) < 0) 13041488Smckusick break; 13141488Smckusick *buf++ = hd->hpib_data; 13241488Smckusick } 13341488Smckusick cnt++; 13441488Smckusick hd->hpib_acr = AUX_TCA; 13541488Smckusick } 13641488Smckusick return(origcnt - cnt); 13741488Smckusick } 13841488Smckusick 13941488Smckusick nhpibppoll(unit) 14041488Smckusick register int unit; 14141488Smckusick { 14241488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 14341488Smckusick register struct nhpibdevice *hd; 14441488Smckusick register int ppoll; 14541488Smckusick 14641488Smckusick hd = (struct nhpibdevice *)hs->sc_addr; 14741488Smckusick hd->hpib_acr = AUX_SPP; 14841488Smckusick DELAY(25); 14941488Smckusick ppoll = hd->hpib_cpt; 15041488Smckusick hd->hpib_acr = AUX_CPP; 15141488Smckusick return(ppoll); 15241488Smckusick } 15341488Smckusick 15441488Smckusick nhpibowait(hd) 15541488Smckusick register struct nhpibdevice *hd; 15641488Smckusick { 15741488Smckusick register int timo = 100000; 15841488Smckusick 15941488Smckusick while ((hd->hpib_mis & MIS_BO) == 0 && --timo) 16041488Smckusick ; 16141488Smckusick if (timo == 0) 16241488Smckusick return(-1); 16341488Smckusick return(0); 16441488Smckusick } 16541488Smckusick 16641488Smckusick nhpibiwait(hd) 16741488Smckusick register struct nhpibdevice *hd; 16841488Smckusick { 16941488Smckusick register int timo = 100000; 17041488Smckusick 17141488Smckusick while ((hd->hpib_mis & MIS_BI) == 0 && --timo) 17241488Smckusick ; 17341488Smckusick if (timo == 0) 17441488Smckusick return(-1); 17541488Smckusick return(0); 17641488Smckusick } 177