xref: /csrg-svn/sys/hp300/stand/nhpib.c (revision 63165)
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