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