xref: /csrg-svn/sys/hp300/stand/fhpib.c (revision 63163)
141488Smckusick /*
2*63163Sbostic  * Copyright (c) 1982, 1990, 1993
3*63163Sbostic  *	The Regents of the University of California.  All rights reserved.
441488Smckusick  *
541488Smckusick  * %sccs.include.redist.c%
641488Smckusick  *
7*63163Sbostic  *	@(#)fhpib.c	8.1 (Berkeley) 06/10/93
841488Smckusick  */
941488Smckusick 
1041488Smckusick /*
1141488Smckusick  * 98625A/B HPIB driver
1241488Smckusick  */
1341488Smckusick 
1456510Sbostic #include <sys/param.h>
1556510Sbostic #include <hp300/dev/fhpibreg.h>
1656510Sbostic #include <hp300/stand/hpibvar.h>
1741488Smckusick 
fhpibinit(unit)1841488Smckusick fhpibinit(unit)
1941488Smckusick 	register int unit;
2041488Smckusick {
2141488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
2241488Smckusick 	register struct fhpibdevice *hd = (struct fhpibdevice *)hs->sc_addr;
2341488Smckusick 
2441488Smckusick 	if (hd->hpib_cid != HPIBC)
2541488Smckusick 		return(0);
2641488Smckusick 	hs->sc_type = HPIBC;
2741488Smckusick 	hs->sc_ba = HPIBC_BA;
2841488Smckusick 	fhpibreset(unit);
2941488Smckusick 	return(1);
3041488Smckusick }
3141488Smckusick 
fhpibreset(unit)3241488Smckusick fhpibreset(unit)
3341488Smckusick {
3441488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
3541488Smckusick 	register struct fhpibdevice *hd;
3641488Smckusick 
3741488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
3841488Smckusick 	hd->hpib_cid = 0xFF;
3941488Smckusick 	DELAY(100);
4041488Smckusick 	hd->hpib_cmd = CT_8BIT;
4141488Smckusick 	hd->hpib_ar = AR_ARONC;
4241488Smckusick 	hd->hpib_cmd |= CT_IFC;
4341488Smckusick 	hd->hpib_cmd |= CT_INITFIFO;
4441488Smckusick 	DELAY(100);
4541488Smckusick 	hd->hpib_cmd &= ~CT_IFC;
4641488Smckusick 	hd->hpib_cmd |= CT_REN;
4741488Smckusick 	hd->hpib_stat = ST_ATN;
4841488Smckusick 	hd->hpib_data = C_DCL;
4941488Smckusick 	DELAY(100000);
5041488Smckusick }
5141488Smckusick 
fhpibsend(unit,slave,sec,buf,cnt)5241488Smckusick fhpibsend(unit, slave, sec, buf, cnt)
5341488Smckusick 	register char *buf;
5441488Smckusick 	register int cnt;
5541488Smckusick {
5641488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
5741488Smckusick 	register struct fhpibdevice *hd;
5841488Smckusick 	int origcnt = cnt;
5941488Smckusick 
6041488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
6141488Smckusick 	hd->hpib_stat = 0;
6241488Smckusick 	hd->hpib_imask = IM_IDLE | IM_ROOM;
6341488Smckusick 	fhpibwait(hd, IM_IDLE);
6441488Smckusick 	hd->hpib_stat = ST_ATN;
6541488Smckusick 	hd->hpib_data = C_UNL;
6641488Smckusick 	hd->hpib_data = C_TAG + hs->sc_ba;
6741488Smckusick 	hd->hpib_data = C_LAG + slave;
6841488Smckusick 	if (sec != -1)
6941488Smckusick 		hd->hpib_data = C_SCG + sec;
7041488Smckusick 	fhpibwait(hd, IM_IDLE);
7141488Smckusick 	hd->hpib_stat = ST_WRITE;
7241488Smckusick 	if (cnt) {
7341488Smckusick 		while (--cnt) {
7441488Smckusick 			hd->hpib_data = *buf++;
7541488Smckusick 			if (fhpibwait(hd, IM_ROOM) < 0)
7641488Smckusick 				break;
7741488Smckusick 		}
7841488Smckusick 		hd->hpib_stat = ST_EOI;
7941488Smckusick 		hd->hpib_data = *buf;
8041488Smckusick 		if (fhpibwait(hd, IM_ROOM) < 0)
8141488Smckusick 			cnt++;
8241488Smckusick 		hd->hpib_stat = ST_ATN;
8341488Smckusick 		/* XXX: HP-UX claims bug with CS80 transparent messages */
8441488Smckusick 		if (sec == 0x12)
8541488Smckusick 			DELAY(150);
8641488Smckusick 		hd->hpib_data = C_UNL;
8741488Smckusick 		fhpibwait(hd, IM_IDLE);
8841488Smckusick 	}
8941488Smckusick 	hd->hpib_imask = 0;
9041488Smckusick 	return(origcnt - cnt);
9141488Smckusick }
9241488Smckusick 
fhpibrecv(unit,slave,sec,buf,cnt)9341488Smckusick fhpibrecv(unit, slave, sec, buf, cnt)
9441488Smckusick 	register char *buf;
9541488Smckusick 	register int cnt;
9641488Smckusick {
9741488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
9841488Smckusick 	register struct fhpibdevice *hd;
9941488Smckusick 	int origcnt = cnt;
10041488Smckusick 
10141488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
10241488Smckusick 	hd->hpib_stat = 0;
10341488Smckusick 	hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE;
10441488Smckusick 	fhpibwait(hd, IM_IDLE);
10541488Smckusick 	hd->hpib_stat = ST_ATN;
10641488Smckusick 	hd->hpib_data = C_UNL;
10741488Smckusick 	hd->hpib_data = C_LAG + hs->sc_ba;
10841488Smckusick 	hd->hpib_data = C_TAG + slave;
10941488Smckusick 	if (sec != -1)
11041488Smckusick 		hd->hpib_data = C_SCG + sec;
11141488Smckusick 	fhpibwait(hd, IM_IDLE);
11241488Smckusick 	hd->hpib_stat = ST_READ0;
11341488Smckusick 	hd->hpib_data = 0;
11441488Smckusick 	if (cnt) {
11541488Smckusick 		while (--cnt >= 0) {
11641488Smckusick 			if (fhpibwait(hd, IM_BYTE) < 0)
11741488Smckusick 				break;
11841488Smckusick 			*buf++ = hd->hpib_data;
11941488Smckusick 		}
12041488Smckusick 		cnt++;
12141488Smckusick 		fhpibwait(hd, IM_ROOM);
12241488Smckusick 		hd->hpib_stat = ST_ATN;
12341488Smckusick 		hd->hpib_data = (slave == 31) ? C_UNA : C_UNT;
12441488Smckusick 		fhpibwait(hd, IM_IDLE);
12541488Smckusick 	}
12641488Smckusick 	hd->hpib_imask = 0;
12741488Smckusick 	return(origcnt - cnt);
12841488Smckusick }
12941488Smckusick 
fhpibppoll(unit)13041488Smckusick fhpibppoll(unit)
13141488Smckusick 	register int unit;
13241488Smckusick {
13341488Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
13441488Smckusick 	register struct fhpibdevice *hd;
13541488Smckusick 	register int ppoll;
13641488Smckusick 
13741488Smckusick 	hd = (struct fhpibdevice *)hs->sc_addr;
13841488Smckusick 	hd->hpib_stat = 0;
13941488Smckusick 	hd->hpib_psense = 0;
14041488Smckusick 	hd->hpib_pmask = 0xFF;
14141488Smckusick 	hd->hpib_imask = IM_PPRESP | IM_PABORT;
14241488Smckusick 	DELAY(25);
14341488Smckusick 	hd->hpib_intr = IM_PABORT;
14441488Smckusick 	ppoll = hd->hpib_data;
14541488Smckusick 	if (hd->hpib_intr & IM_PABORT)
14641488Smckusick 		ppoll = 0;
14741488Smckusick 	hd->hpib_imask = 0;
14841488Smckusick 	hd->hpib_pmask = 0;
14941488Smckusick 	hd->hpib_stat = ST_IENAB;
15041488Smckusick 	return(ppoll);
15141488Smckusick }
15241488Smckusick 
fhpibwait(hd,x)15341488Smckusick fhpibwait(hd, x)
15441488Smckusick 	register struct fhpibdevice *hd;
15541488Smckusick {
15641488Smckusick 	register int timo = 100000;
15741488Smckusick 
15841488Smckusick 	while ((hd->hpib_intr & x) == 0 && --timo)
15941488Smckusick 		;
16041488Smckusick 	if (timo == 0)
16141488Smckusick 		return(-1);
16241488Smckusick 	return(0);
16341488Smckusick }
164