141488Smckusick /*
2*63165Sbostic * Copyright (c) 1982, 1990, 1993
3*63165Sbostic * The Regents of the University of California. All rights reserved.
441488Smckusick *
541488Smckusick * %sccs.include.redist.c%
641488Smckusick *
7*63165Sbostic * @(#)nhpib.c 8.1 (Berkeley) 06/10/93
841488Smckusick */
941488Smckusick
1041488Smckusick /*
1141488Smckusick * Internal/98624 HPIB driver
1241488Smckusick */
1341488Smckusick
1456510Sbostic #include <sys/param.h>
1556510Sbostic #include <hp300/dev/nhpibreg.h>
1656510Sbostic #include <hp300/stand/hpibvar.h>
1741488Smckusick
nhpibinit(unit)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
nhpibreset(unit)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
nhpibsend(unit,slave,sec,buf,cnt)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
nhpibrecv(unit,slave,sec,buf,cnt)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
nhpibppoll(unit)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
nhpibowait(hd)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
nhpibiwait(hd)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