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 * @(#)fhpib.c 7.1 (Berkeley) 05/08/90 8*41488Smckusick */ 9*41488Smckusick 10*41488Smckusick /* 11*41488Smckusick * 98625A/B HPIB driver 12*41488Smckusick */ 13*41488Smckusick 14*41488Smckusick #include "param.h" 15*41488Smckusick #include "../hpdev/fhpibreg.h" 16*41488Smckusick #include "hpibvar.h" 17*41488Smckusick 18*41488Smckusick fhpibinit(unit) 19*41488Smckusick register int unit; 20*41488Smckusick { 21*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 22*41488Smckusick register struct fhpibdevice *hd = (struct fhpibdevice *)hs->sc_addr; 23*41488Smckusick 24*41488Smckusick if (hd->hpib_cid != HPIBC) 25*41488Smckusick return(0); 26*41488Smckusick hs->sc_type = HPIBC; 27*41488Smckusick hs->sc_ba = HPIBC_BA; 28*41488Smckusick fhpibreset(unit); 29*41488Smckusick return(1); 30*41488Smckusick } 31*41488Smckusick 32*41488Smckusick fhpibreset(unit) 33*41488Smckusick { 34*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 35*41488Smckusick register struct fhpibdevice *hd; 36*41488Smckusick 37*41488Smckusick hd = (struct fhpibdevice *)hs->sc_addr; 38*41488Smckusick hd->hpib_cid = 0xFF; 39*41488Smckusick DELAY(100); 40*41488Smckusick hd->hpib_cmd = CT_8BIT; 41*41488Smckusick hd->hpib_ar = AR_ARONC; 42*41488Smckusick hd->hpib_cmd |= CT_IFC; 43*41488Smckusick hd->hpib_cmd |= CT_INITFIFO; 44*41488Smckusick DELAY(100); 45*41488Smckusick hd->hpib_cmd &= ~CT_IFC; 46*41488Smckusick hd->hpib_cmd |= CT_REN; 47*41488Smckusick hd->hpib_stat = ST_ATN; 48*41488Smckusick hd->hpib_data = C_DCL; 49*41488Smckusick DELAY(100000); 50*41488Smckusick } 51*41488Smckusick 52*41488Smckusick fhpibsend(unit, slave, sec, buf, cnt) 53*41488Smckusick register char *buf; 54*41488Smckusick register int cnt; 55*41488Smckusick { 56*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 57*41488Smckusick register struct fhpibdevice *hd; 58*41488Smckusick int origcnt = cnt; 59*41488Smckusick 60*41488Smckusick hd = (struct fhpibdevice *)hs->sc_addr; 61*41488Smckusick hd->hpib_stat = 0; 62*41488Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 63*41488Smckusick fhpibwait(hd, IM_IDLE); 64*41488Smckusick hd->hpib_stat = ST_ATN; 65*41488Smckusick hd->hpib_data = C_UNL; 66*41488Smckusick hd->hpib_data = C_TAG + hs->sc_ba; 67*41488Smckusick hd->hpib_data = C_LAG + slave; 68*41488Smckusick if (sec != -1) 69*41488Smckusick hd->hpib_data = C_SCG + sec; 70*41488Smckusick fhpibwait(hd, IM_IDLE); 71*41488Smckusick hd->hpib_stat = ST_WRITE; 72*41488Smckusick if (cnt) { 73*41488Smckusick while (--cnt) { 74*41488Smckusick hd->hpib_data = *buf++; 75*41488Smckusick if (fhpibwait(hd, IM_ROOM) < 0) 76*41488Smckusick break; 77*41488Smckusick } 78*41488Smckusick hd->hpib_stat = ST_EOI; 79*41488Smckusick hd->hpib_data = *buf; 80*41488Smckusick if (fhpibwait(hd, IM_ROOM) < 0) 81*41488Smckusick cnt++; 82*41488Smckusick hd->hpib_stat = ST_ATN; 83*41488Smckusick /* XXX: HP-UX claims bug with CS80 transparent messages */ 84*41488Smckusick if (sec == 0x12) 85*41488Smckusick DELAY(150); 86*41488Smckusick hd->hpib_data = C_UNL; 87*41488Smckusick fhpibwait(hd, IM_IDLE); 88*41488Smckusick } 89*41488Smckusick hd->hpib_imask = 0; 90*41488Smckusick return(origcnt - cnt); 91*41488Smckusick } 92*41488Smckusick 93*41488Smckusick fhpibrecv(unit, slave, sec, buf, cnt) 94*41488Smckusick register char *buf; 95*41488Smckusick register int cnt; 96*41488Smckusick { 97*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 98*41488Smckusick register struct fhpibdevice *hd; 99*41488Smckusick int origcnt = cnt; 100*41488Smckusick 101*41488Smckusick hd = (struct fhpibdevice *)hs->sc_addr; 102*41488Smckusick hd->hpib_stat = 0; 103*41488Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE; 104*41488Smckusick fhpibwait(hd, IM_IDLE); 105*41488Smckusick hd->hpib_stat = ST_ATN; 106*41488Smckusick hd->hpib_data = C_UNL; 107*41488Smckusick hd->hpib_data = C_LAG + hs->sc_ba; 108*41488Smckusick hd->hpib_data = C_TAG + slave; 109*41488Smckusick if (sec != -1) 110*41488Smckusick hd->hpib_data = C_SCG + sec; 111*41488Smckusick fhpibwait(hd, IM_IDLE); 112*41488Smckusick hd->hpib_stat = ST_READ0; 113*41488Smckusick hd->hpib_data = 0; 114*41488Smckusick if (cnt) { 115*41488Smckusick while (--cnt >= 0) { 116*41488Smckusick if (fhpibwait(hd, IM_BYTE) < 0) 117*41488Smckusick break; 118*41488Smckusick *buf++ = hd->hpib_data; 119*41488Smckusick } 120*41488Smckusick cnt++; 121*41488Smckusick fhpibwait(hd, IM_ROOM); 122*41488Smckusick hd->hpib_stat = ST_ATN; 123*41488Smckusick hd->hpib_data = (slave == 31) ? C_UNA : C_UNT; 124*41488Smckusick fhpibwait(hd, IM_IDLE); 125*41488Smckusick } 126*41488Smckusick hd->hpib_imask = 0; 127*41488Smckusick return(origcnt - cnt); 128*41488Smckusick } 129*41488Smckusick 130*41488Smckusick fhpibppoll(unit) 131*41488Smckusick register int unit; 132*41488Smckusick { 133*41488Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 134*41488Smckusick register struct fhpibdevice *hd; 135*41488Smckusick register int ppoll; 136*41488Smckusick 137*41488Smckusick hd = (struct fhpibdevice *)hs->sc_addr; 138*41488Smckusick hd->hpib_stat = 0; 139*41488Smckusick hd->hpib_psense = 0; 140*41488Smckusick hd->hpib_pmask = 0xFF; 141*41488Smckusick hd->hpib_imask = IM_PPRESP | IM_PABORT; 142*41488Smckusick DELAY(25); 143*41488Smckusick hd->hpib_intr = IM_PABORT; 144*41488Smckusick ppoll = hd->hpib_data; 145*41488Smckusick if (hd->hpib_intr & IM_PABORT) 146*41488Smckusick ppoll = 0; 147*41488Smckusick hd->hpib_imask = 0; 148*41488Smckusick hd->hpib_pmask = 0; 149*41488Smckusick hd->hpib_stat = ST_IENAB; 150*41488Smckusick return(ppoll); 151*41488Smckusick } 152*41488Smckusick 153*41488Smckusick fhpibwait(hd, x) 154*41488Smckusick register struct fhpibdevice *hd; 155*41488Smckusick { 156*41488Smckusick register int timo = 100000; 157*41488Smckusick 158*41488Smckusick while ((hd->hpib_intr & x) == 0 && --timo) 159*41488Smckusick ; 160*41488Smckusick if (timo == 0) 161*41488Smckusick return(-1); 162*41488Smckusick return(0); 163*41488Smckusick } 164