summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/i386/isa/gpib.c1621
1 files changed, 797 insertions, 824 deletions
diff --git a/sys/i386/isa/gpib.c b/sys/i386/isa/gpib.c
index 8225877..ce4824e 100644
--- a/sys/i386/isa/gpib.c
+++ b/sys/i386/isa/gpib.c
@@ -1,5 +1,4 @@
-
-/*
+/*
* GPIB driver for FreeBSD.
* Version 0.1 (No interrupts, no DMA)
* Supports National Instruments AT-GPIB and AT-GPIB/TNT boards.
@@ -17,9 +16,9 @@
* all derivative works or modified versions.
*
* $FreeBSD$
- *
*/
-/*Please read the README file for usage information*/
+
+/* Please read the README file for usage information */
#include <sys/param.h>
#include <sys/systm.h>
@@ -36,19 +35,17 @@
#error "The gpib device requires the old isa compatibility shims"
#endif
-#define MIN(a,b) ((a < b) ? a : b)
+#define MIN(a, b) ((a < b) ? a : b)
-#define GPIBPRI (PZERO+8)|PCATCH
+#define GPIBPRI (PZERO + 8) | PCATCH
#define SLEEP_MAX 1000
#define SLEEP_MIN 4
-
-
static int initgpib(void);
static void closegpib(void);
-static int sendgpibfifo(unsigned char device,char *data,int count);
-static int sendrawgpibfifo(unsigned char device,char *data,int count);
-static int readgpibfifo(unsigned char device,char *data,int count);
+static int sendgpibfifo(unsigned char device, char *data, int count);
+static int sendrawgpibfifo(unsigned char device, char *data, int count);
+static int readgpibfifo(unsigned char device, char *data, int count);
#if 0
static void showregs(void);
#endif
@@ -93,11 +90,10 @@ static struct cdevsw gp_cdevsw = {
/* flags */ 0,
};
-#define BUFSIZE 1024
-#define ATTACHED 0x08
-#define OPEN 0x04
-#define INIT 0x02
-
+#define BUFSIZE 1024
+#define ATTACHED 0x08
+#define OPEN 0x04
+#define INIT 0x02
static struct gpib_softc {
char *sc_cp; /* current data to send */
@@ -106,11 +102,15 @@ static struct gpib_softc {
u_char sc_flags; /* flags (open and internal) */
char sc_unit; /* gpib device number */
char *sc_inbuf; /* buffer for data */
-} gpib_sc; /* only support one of these? */
+} gpib_sc; /* only support one of these? */
+
static int oldcount;
static char oldbytes[2];
-/*Probe routine*/
-/*This needs to be changed to be a bit more robust*/
+
+/*
+ * Probe routine
+ * This needs to be changed to be a bit more robust
+ */
static int
gpprobe(struct isa_device *dvp)
{
@@ -118,17 +118,20 @@ gpprobe(struct isa_device *dvp)
struct gpib_softc *sc = &gpib_sc;
gpib_port = dvp->id_iobase;
- status=1;
- sc->sc_type=3;
-if ((inb(KSR)&0xF7)==0x34) sc->sc_type=3;
-else if ((inb(KSR)&0xF7)==0x24) sc->sc_type=2;
-else if ((inb(KSR)&0xF7)==0x14) sc->sc_type=1;
- else status=0;
-
+ status = 1;
+ sc->sc_type = 3;
+ if ((inb(KSR) & 0xF7) == 0x34)
+ sc->sc_type = 3;
+ else if ((inb(KSR) & 0xF7) == 0x24)
+ sc->sc_type = 2;
+ else if ((inb(KSR) & 0xF7) == 0x14)
+ sc->sc_type = 1;
+ else
+ status = 0;
return (status);
}
-/*
+/*
* gpattach()
* Attach device and print the type of card to the screen.
*/
@@ -139,19 +142,18 @@ gpattach(isdp)
struct gpib_softc *sc = &gpib_sc;
sc->sc_unit = isdp->id_unit;
- if (sc->sc_type==3)
- printf ("gp%d: type AT-GPIB/TNT\n",sc->sc_unit);
- if (sc->sc_type==2)
- printf ("gp%d: type AT-GPIB chip NAT4882B\n",sc->sc_unit);
- if (sc->sc_type==1)
- printf ("gp%d: type AT-GPIB chip NAT4882A\n",sc->sc_unit);
- sc->sc_flags |=ATTACHED;
-
+ if (sc->sc_type == 3)
+ printf ("gp%d: type AT-GPIB/TNT\n", sc->sc_unit);
+ if (sc->sc_type == 2)
+ printf ("gp%d: type AT-GPIB chip NAT4882B\n", sc->sc_unit);
+ if (sc->sc_type == 1)
+ printf ("gp%d: type AT-GPIB chip NAT4882A\n", sc->sc_unit);
+ sc->sc_flags |= ATTACHED;
make_dev(&gp_cdevsw, 0, 0, 0, 0600, "gp");
return (1);
}
-/*
+/*
* gpopen()
* New open on device.
*
@@ -169,70 +171,72 @@ gpopen(dev, flags, fmt, td)
u_char unit;
int status;
- unit= minor(dev);
+ unit = minor(dev);
/* minor number out of limits ? */
if (unit >= 32)
return (ENXIO);
/* Attached ? */
- if (!(sc->sc_flags&ATTACHED)) { /* not attached */
- return(ENXIO);
- }
+ if (!(sc->sc_flags&ATTACHED)) /* not attached */
+ return (ENXIO);
- /* Already open */
- if (sc->sc_flags&OPEN) { /* too late .. */
- return(EBUSY);
- }
+ /* Already open */
+ if (sc->sc_flags&OPEN) /* too late .. */
+ return (EBUSY);
/* Have memory for buffer? */
sc->sc_inbuf = malloc(BUFSIZE, M_DEVBUF, M_WAITOK);
if (sc->sc_inbuf == 0)
- return(ENOMEM);
+ return (ENOMEM);
- if (initgpib()) return(EBUSY);
+ if (initgpib()) return (EBUSY);
sc->sc_flags |= OPEN;
sc->sc_count = 0;
- oldcount=0;
-if (unit!=0) { /*Someone is trying to access an actual device*/
- /*So.. we'll address it to listen*/
-enableremote(unit);
- do {
- status=inb(ISR2);
- }
- while (!(status&8)&&tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1)==EWOULDBLOCK);
-
- outb(CDOR,(unit&31)+32);/*address device to listen*/
-
- do
- status=inb(ISR2);
- while (!(status&8)&&tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1)==EWOULDBLOCK);
- outb (CDOR,64); /*Address controller (me) to talk*/
- do status=inb(ISR2);
-
- while (!(status&8)&&tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1)==EWOULDBLOCK);
- outb(AUXMR,gts); /*Set to Standby (Controller)*/
-
-
- do
- status=inb(ISR1);
- while (!(status&2)&&tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1)==EWOULDBLOCK);
-/*Set up the TURBO488 registers*/
- outb(IMR2,0x30); /*we have to enable DMA (0x30) for turbo488 to work*/
- outb(CNT0,0); /*NOTE this does not enable DMA to the host computer!!*/
- outb(CNT1,0);
- outb(CNT2,0);
- outb(CNT3,0);
- outb(CMDR,0x20);
- outb(CFG,0x47); /* 16 bit, write, fifo B first, TMOE TIM */
- outb(CMDR,0x10); /*RESET fifos*/
- outb(CMDR,0x04); /*Tell TURBO488 to GO*/
-}
- return(0);
+ oldcount = 0;
+ if (unit != 0) { /* Someone is trying to access an actual device */
+ /* So.. we'll address it to listen */
+ enableremote(unit);
+ do {
+ status = inb(ISR2);
+ } while (!(status & 8) && tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1) == EWOULDBLOCK);
+
+ outb(CDOR, (unit & 31) + 32); /* address device to listen */
+
+ do
+ status = inb(ISR2);
+ while (!(status & 8) && tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1) == EWOULDBLOCK);
+ outb(CDOR, 64); /* Address controller (me) to talk */
+ do {
+ status = inb(ISR2);
+ } while (!(status & 8) && tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1) == EWOULDBLOCK);
+ outb(AUXMR, gts); /* Set to Standby (Controller) */
+
+
+ do {
+ status = inb(ISR1);
+ } while (!(status & 2) && tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1) == EWOULDBLOCK);
+
+ /* Set up the TURBO488 registers */
+ outb(IMR2, 0x30); /* we have to enable DMA (0x30) for turbo488 to work */
+ outb(CNT0, 0); /* NOTE this does not enable DMA to the host computer!! */
+ outb(CNT1, 0);
+ outb(CNT2, 0);
+ outb(CNT3, 0);
+ outb(CMDR, 0x20);
+ outb(CFG, 0x47); /* 16 bit, write, fifo B first, TMOE TIM */
+ outb(CMDR, 0x10); /* RESET fifos */
+ outb(CMDR, 0x04); /* Tell TURBO488 to GO */
+ }
+ return (0);
}
-/*
+/*
* gpclose()
* Close gpib device.
*/
@@ -247,94 +251,93 @@ gpclose(dev, flags, fmt, td)
unsigned char unit;
unsigned char status;
- unit=minor(dev);
-if (unit!=0) { /*Here we need to send the last character with EOS*/
- /*and unaddress the listening device*/
-
-
- status=EWOULDBLOCK;
-
- /*Wait for fifo to become empty*/
- do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while ((inb(ISR3)&0x04)&&status==EWOULDBLOCK); /*Fifo is not empty*/
-
- outb(CMDR,0x08); /*Issue STOP to TURBO488*/
-
- /*Wait for DONE and STOP*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR3)&0x11)&&status==EWOULDBLOCK); /*not done and stop*/
-
-/*Shut down TURBO488 */
- outb(IMR2,0x00); /*DISABLE DMA to turbo488*/
- outb(CMDR,0x20); /*soft reset turbo488*/
- outb(CMDR,0x10); /*reset fifos*/
-
-
-/*Send last byte with EOI set*/
-/*Send second to last byte if there are 2 bytes left*/
-if (status==EWOULDBLOCK) {
-
-do
- if (!(inb(ISR1)&2)) status=tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1);
-while (!(inb(ISR1)&2)&&(status==EWOULDBLOCK));
-if (oldcount==2){
- outb(CDOR,oldbytes[0]); /*Send second to last byte*/
- while (!(inb(ISR1)&2)&&(status==EWOULDBLOCK));
- status=tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1);
- }
-
- outb(AUXMR,seoi); /*Set EOI for the last byte*/
- outb(AUXMR,0x5E); /*Clear SYNC*/
- if (oldcount==1)
- outb(CDOR,oldbytes[0]);
- else
- if (oldcount==2)
- outb(CDOR,oldbytes[1]);
- else {
- outb (CDOR,13); /*Send a CR.. we've got trouble*/
- printf("gpib: Warning: gpclose called with nothing left in buffer\n");
- }
-}
-
-do
- if (!(inb(ISR1)&2)) status=tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1);
-while (!(inb(ISR1)&2)&&(status==EWOULDBLOCK));
-
-
- if (!(inb(ISR1)&2)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR1)&2)&&status==EWOULDBLOCK);
-
-
- outb(AUXMR,tca); /* Regain full control of the bus*/
-
-
- do
- status=inb(ISR2);
- while (!(status&8)&&tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1)==EWOULDBLOCK);
- outb(CDOR,63); /*unlisten*/
- do
- status=inb(ISR2);
- while (!(status&8)&&tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1)==EWOULDBLOCK);
- outb(AUXMR,0x5E); /*Clear SYNC*/
- outb (CDOR,95);/*untalk*/
- do
- status=inb(ISR2);
- while (!(status&8)&&tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1)==EWOULDBLOCK);
-/*gotolocal(minor(dev));*/
-}
+ unit = minor(dev);
+ if (unit != 0) { /* Here we need to send the last character with EOS */
+ /* and unaddress the listening device */
+
+ status = EWOULDBLOCK;
+
+ /* Wait for fifo to become empty */
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while ((inb(ISR3) & 0x04) && status == EWOULDBLOCK); /* Fifo is not empty */
+
+ outb(CMDR, 0x08); /* Issue STOP to TURBO488 */
+
+ /* Wait for DONE and STOP */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR3) & 0x11) && status == EWOULDBLOCK); /* not done and stop */
+
+ /* Shut down TURBO488 */
+ outb(IMR2, 0x00); /* DISABLE DMA to turbo488 */
+ outb(CMDR, 0x20); /* soft reset turbo488 */
+ outb(CMDR, 0x10); /* reset fifos */
+
+ /* Send last byte with EOI set */
+ /* Send second to last byte if there are 2 bytes left */
+ if (status == EWOULDBLOCK) {
+ do {
+ if (!(inb(ISR1) & 2)) status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 2) && (status == EWOULDBLOCK));
+ if (oldcount == 2) {
+ outb(CDOR, oldbytes[0]); /* Send second to last byte */
+ while (!(inb(ISR1) & 2) && (status == EWOULDBLOCK));
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1);
+ }
+
+ outb(AUXMR, seoi); /* Set EOI for the last byte */
+ outb(AUXMR, 0x5E); /* Clear SYNC */
+ if (oldcount == 1)
+ outb(CDOR, oldbytes[0]);
+ else
+ if (oldcount == 2)
+ outb(CDOR, oldbytes[1]);
+ else {
+ outb(CDOR, 13); /* Send a CR.. we've got trouble */
+ printf("gpib: Warning: gpclose called with nothing left in buffer\n");
+ }
+ }
+
+ do {
+ if (!(inb(ISR1) & 2)) status = tsleep((caddr_t)&gpib_sc,
+ GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 2) && (status == EWOULDBLOCK));
+
+ if (!(inb(ISR1) & 2) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 2) && status == EWOULDBLOCK);
+
+ outb(AUXMR, tca); /* Regain full control of the bus */
+
+ do {
+ status = inb(ISR2);
+ } while (!(status & 8) && tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1) == EWOULDBLOCK);
+ outb(CDOR, 63); /* unlisten */
+ do {
+ status = inb(ISR2);
+ } while (!(status & 8) && tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1) == EWOULDBLOCK);
+ outb(AUXMR, 0x5E); /* Clear SYNC */
+ outb(CDOR, 95); /* untalk */
+ do {
+ status = inb(ISR2);
+ } while (!(status & 8) && tsleep((caddr_t)&gpib_sc, GPIBPRI,
+ "gpibpoll", 1) == EWOULDBLOCK);
+#if 0
+ gotolocal(minor(dev));
+#endif
+ }
closegpib();
sc->sc_flags = ATTACHED;
free(sc->sc_inbuf, M_DEVBUF);
sc->sc_inbuf = 0; /* Sanity */
- return(0);
+ return (0);
}
-/*
+/*
* gpwrite()
* Copy from user's buffer, then write to GPIB device referenced
* by minor(dev).
@@ -345,821 +348,791 @@ gpwrite(dev, uio, ioflag)
struct uio *uio;
int ioflag;
{
- int err,count;
+ int err, count;
/* main loop */
while ((gpib_sc.sc_count = MIN(BUFSIZE-1, uio->uio_resid)) > 0) {
- /* If there were >1 bytes left over, send them */
- if (oldcount==2)
- sendrawgpibfifo(minor(dev),oldbytes,2);
-
- /*If there was 1 character left, put it at the beginning
- of the new buffer*/
- if (oldcount==1){
- (gpib_sc.sc_inbuf)[0]=oldbytes[0];
- gpib_sc.sc_cp = gpib_sc.sc_inbuf;
- /* get from user-space */
- uiomove(gpib_sc.sc_inbuf+1, gpib_sc.sc_count, uio);
- gpib_sc.sc_count++;
- }
- else {
- gpib_sc.sc_cp = gpib_sc.sc_inbuf;
- /* get from user-space */
- uiomove(gpib_sc.sc_inbuf, gpib_sc.sc_count, uio);
- }
-
-/*NOTE we always leave one byte in case this is the last write
- so close can send EOI with the last byte There may be 2 bytes
- since we are doing 16 bit transfers.(note the -1 in the count below)*/
- /*If count<=2 we'll either pick it up on the next write or on close*/
- if (gpib_sc.sc_count>2) {
- count = sendrawgpibfifo(minor(dev),gpib_sc.sc_cp,gpib_sc.sc_count-1);
- err=!count;
- if (err)
- return(1);
- oldcount=gpib_sc.sc_count-count; /*Set # of remaining bytes*/
- gpib_sc.sc_count-=count;
- gpib_sc.sc_cp+=count; /*point char pointer to remaining bytes*/
- }
- else oldcount=gpib_sc.sc_count;
- oldbytes[0]=gpib_sc.sc_cp[0];
- if (oldcount==2)
- oldbytes[1]=gpib_sc.sc_cp[1];
+ /* If there were >1 bytes left over, send them */
+ if (oldcount == 2)
+ sendrawgpibfifo(minor(dev), oldbytes, 2);
+
+ /* If there was 1 character left, put it at the beginning
+ of the new buffer */
+ if (oldcount == 1) {
+ (gpib_sc.sc_inbuf)[0] = oldbytes[0];
+ gpib_sc.sc_cp = gpib_sc.sc_inbuf;
+ /* get from user-space */
+ uiomove(gpib_sc.sc_inbuf + 1, gpib_sc.sc_count, uio);
+ gpib_sc.sc_count++;
+ } else {
+ gpib_sc.sc_cp = gpib_sc.sc_inbuf;
+ /* get from user-space */
+ uiomove(gpib_sc.sc_inbuf, gpib_sc.sc_count, uio);
+ }
+
+ /*
+ * NOTE we always leave one byte in case this is the last write
+ * so close can send EOI with the last byte There may be 2 bytes
+ * since we are doing 16 bit transfers.(note the -1 in the count below)
+ */
+
+ /* If count <= 2 we'll either pick it up on the next write or on close */
+ if (gpib_sc.sc_count>2) {
+ count = sendrawgpibfifo(minor(dev), gpib_sc.sc_cp, gpib_sc.sc_count-1);
+ err = !count;
+ if (err)
+ return (1);
+ oldcount = gpib_sc.sc_count-count; /* Set # of remaining bytes */
+ gpib_sc.sc_count -= count;
+ gpib_sc.sc_cp += count; /* point char pointer to remaining bytes */
+ }
+ else
+ oldcount = gpib_sc.sc_count;
+ oldbytes[0] = gpib_sc.sc_cp[0];
+ if (oldcount == 2)
+ oldbytes[1] = gpib_sc.sc_cp[1];
}
- return(0);
+ return (0);
}
-/* Here is how you would usually access a GPIB device
- An exception would be a plotter or printer that you can just
- write to using a minor device = its GPIB address */
+
+/*
+ * Here is how you would usually access a GPIB device
+ * An exception would be a plotter or printer that you can just
+ * write to using a minor device = its GPIB address
+ */
static int
gpioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
{
struct gpibdata *gd = (struct gpibdata *)data;
- int error,result;
+ int error, result;
error = 0;
switch (cmd) {
case GPIBWRITE:
- sendgpibfifo(gd->address,gd->data,*(gd->count));
- error=0;
+ sendgpibfifo(gd->address, gd->data, *(gd->count));
+ error = 0;
break;
case GPIBREAD:
- result=readgpibfifo(gd->address,gd->data,*(gd->count));
- *(gd->count)=result;
- error=0;
+ result = readgpibfifo(gd->address, gd->data, *(gd->count));
+ *(gd->count) = result;
+ error = 0;
break;
case GPIBINIT:
initgpib();
- error=0;
+ error = 0;
break;
case GPIBTRIGGER:
trigger(gd->address);
- error=0;
+ error = 0;
break;
case GPIBREMOTE:
enableremote(gd->address);
- error=0;
+ error = 0;
break;
case GPIBLOCAL:
gotolocal(gd->address);
- error=0;
+ error = 0;
break;
-
case GPIBMTRIGGER:
mtrigger(gd->data);
- error=0;
+ error = 0;
break;
case GPIBMREMOTE:
menableremote(gd->data);
- error=0;
+ error = 0;
break;
case GPIBMLOCAL:
mgotolocal(gd->data);
- error=0;
+ error = 0;
break;
case GPIBSPOLL:
- *(gd->data)=spoll(gd->address);
- error=0;
+ *(gd->data) = spoll(gd->address);
+ error = 0;
break;
default:
error = ENODEV;
}
- return(error);
+ return (error);
}
+#if 0
+/* Just in case you want a dump of the registers... */
+static void showregs() {
+ printf ("NAT4882:\n");
+ printf ("ISR1=%X\t", inb(ISR1));
+ printf ("ISR2=%X\t", inb(ISR2));
+ printf ("SPSR=%X\t", inb(SPSR));
+ printf ("KSR =%X\t", inb(KSR));
+ printf ("ADSR=%X\t", inb(ADSR));
+ printf ("CPTR=%X\t", inb(CPTR));
+ printf ("SASR=%X\t", inb(SASR));
+ printf ("ADR0=%X\t", inb(ADR0));
+ printf ("ISR0=%X\t", inb(ISR0));
+ printf ("ADR1=%X\t", inb(ADR1));
+ printf ("BSR =%X\n", inb(BSR));
+
+ printf ("Turbo488\n");
+ printf ("STS1=%X ", inb(STS1));
+ printf ("STS2=%X ", inb(STS2));
+ printf ("ISR3=%X ", inb(ISR3));
+ printf ("CNT0=%X ", inb(CNT0));
+ printf ("CNT1=%X ", inb(CNT1));
+ printf ("CNT2=%X ", inb(CNT2));
+ printf ("CNT3=%X ", inb(CNT3));
+ printf ("IMR3=%X ", inb(IMR3));
+ printf ("TIMER=%X\n", inb(TIMER));
+}
+#endif
+/*
+ * Set up the NAT4882 and TURBO488 registers
+ * This will be nonsense to you unless you have a data sheet from
+ * National Instruments. They should give you one if you call them
+ */
+static int
+initgpib()
+{
+ outb(CMDR, 0x20);
+ outb(CFG, 0x16);
+ outb(IMR3, 0);
+ outb(CMDR, 0x10);
+ outb(CNT0, 0);
+ outb(CNT1, 0);
+ outb(CNT2, 0);
+ outb(CNT3, 0);
+ outb(INTR, 0); /* Put interrupt line in tri-state mode?? */
+ outb(AUXMR, chip_reset);
+
+ outb(IMR1, 0x10); /* send interrupt to TURBO488 when END received */
+ outb(IMR2, 0);
+ outb(IMR0, 0x90); /* Do we want nba here too??? */
+ outb(ADMR, 1);
+ outb(ADR, 0);
+ outb(ADR, 128);
+ outb(AUXMR, 0xE9);
+ outb(AUXMR, 0x49);
+ outb(AUXMR, 0x70);
+ outb(AUXMR, 0xD0);
+ outb(AUXMR, 0xA0);
+
+ outb(EOSR, 10); /* set EOS message to newline */
+ /* should I make the default to interpret END as EOS? */
+ /* It isn't now. The following changes this */
+ outb(AUXMR, 0x80); /* No special EOS handling */
#if 0
-/*Just in case you want a dump of the registers...*/
+ outb(AUXMR, 0x88) /* Transmit END with EOS */
+ outb(AUXMR, 0x84) /* Set END on EOS received */
+ outb(AUXMR, 0x8C) /* Do both of the above */
+#endif
-static void showregs() {
- printf ("NAT4882:\n");
- printf ("ISR1=%X\t",inb(ISR1));
- printf ("ISR2=%X\t",inb(ISR2));
- printf ("SPSR=%X\t",inb(SPSR));
- printf ("KSR =%X\t",inb(KSR));
- printf ("ADSR=%X\t",inb(ADSR));
- printf ("CPTR=%X\t",inb(CPTR));
- printf ("SASR=%X\t",inb(SASR));
- printf ("ADR0=%X\t",inb(ADR0));
- printf ("ISR0=%X\t",inb(ISR0));
- printf ("ADR1=%X\t",inb(ADR1));
- printf ("BSR =%X\n",inb(BSR));
-
- printf ("Turbo488\n");
- printf ("STS1=%X ",inb(STS1));
- printf ("STS2=%X ",inb(STS2));
- printf ("ISR3=%X ",inb(ISR3));
- printf ("CNT0=%X ",inb(CNT0));
- printf ("CNT1=%X ",inb(CNT1));
- printf ("CNT2=%X ",inb(CNT2));
- printf ("CNT3=%X ",inb(CNT3));
- printf ("IMR3=%X ",inb(IMR3));
- printf ("TIMER=%X\n",inb(TIMER));
-
-
- }
+#if 0
+ /* Not currently supported */
+ outb(AUXMR, hldi); /* Perform RFD Holdoff for all data in */
#endif
-/*Set up the NAT4882 and TURBO488 registers */
-/*This will be nonsense to you unless you have a data sheet from
- National Instruments. They should give you one if you call them*/
-static int
-initgpib() {
- outb(CMDR,0x20);
- outb(CFG,0x16);
- outb(IMR3,0);
- outb(CMDR,0x10);
- outb(CNT0,0);
- outb(CNT1,0);
- outb(CNT2,0);
- outb(CNT3,0);
- outb(INTR,0); /* Put interrupt line in tri-state mode??*/
- outb(AUXMR,chip_reset);
-
- outb(IMR1,0x10); /* send interrupt to TURBO488 when END received*/
- outb(IMR2,0);
- outb(IMR0,0x90); /* Do we want nba here too??? */
- outb(ADMR,1);
- outb(ADR,0);
- outb(ADR,128);
- outb(AUXMR,0xE9);
- outb(AUXMR,0x49);
- outb(AUXMR,0x70);
- outb(AUXMR,0xD0);
- outb(AUXMR,0xA0);
-
- outb(EOSR,10); /*set EOS message to newline*/
- /*should I make the default to interpret END as EOS?*/
- /*It isn't now. The following changes this*/
- outb(AUXMR,0x80); /*No special EOS handling*/
- /*outb(AUXMR,0x88) */ /* Transmit END with EOS*/
- /*outb(AUXMR,0x84) */ /* Set END on EOS received*/
- /*outb(AUXMR,0x8C) */ /* Do both of the above*/
-
-
- /* outb(AUXMR,hldi); */ /*Perform RFD Holdoff for all data in*/
- /*Not currently supported*/
-
- outb(AUXMR,pon);
- outb(AUXMR,sic_rsc);
- tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
-
- outb(AUXMR,sic_rsc_off);
-
-return(0);
-
-
- }
-
-/*This is kind of Brute force.. But it works*/
+ outb(AUXMR, pon);
+ outb(AUXMR, sic_rsc);
+ tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+
+ outb(AUXMR, sic_rsc_off);
+
+ return (0);
+}
+
+/* This is kind of Brute force.. But it works */
static void
closegpib()
{
- outb(AUXMR,chip_reset);
+ outb(AUXMR, chip_reset);
}
-/*GPIB ROUTINES:
- These will also make little sense unless you have a data sheet.
- Note that the routines with an "m" in the beginning are for
- accessing multiple devices in one call*/
-
+/*
+ * GPIB ROUTINES:
+ * These will also make little sense unless you have a data sheet.
+ * Note that the routines with an "m" in the beginning are for
+ * accessing multiple devices in one call
+ */
-/*This is one thing I could not figure out how to do correctly.
- I tried to use the auxilary command to enable remote, but it
- never worked. Here, I bypass everything and write to the BSR
- to enable the remote line. NOTE that these lines are effectively
- "OR'ed" with the actual lines, so writing a 1 to the bit in the BSR
- forces the GPIB line true, no matter what the fancy circuitry of the
- NAT4882 wants to do with it*/
+/*
+ * This is one thing I could not figure out how to do correctly.
+ * I tried to use the auxilary command to enable remote, but it
+ * never worked. Here, I bypass everything and write to the BSR
+ * to enable the remote line. NOTE that these lines are effectively
+ * "OR'ed" with the actual lines, so writing a 1 to the bit in the BSR
+ * forces the GPIB line true, no matter what the fancy circuitry of the
+ * NAT4882 wants to do with it
+ */
static void
enableremote(unsigned char device)
{
- int status;
-
-status=EWOULDBLOCK;
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
- outb(BSR,1); /*Set REN bit on GPIB*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb(CDOR,(device&31)+32); /*address device to listen*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb (CDOR,63); /*Unaddress device*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
- }
-/*This does not release the REM line on the gpib port, because if it did,
- all the remote devices would go to local mode. This only sends the
- gotolocal message to one device. Currently, REM is always held true
- after enableremote is called, and is reset only on a close of the
- gpib device */
+ int status;
-static void
-gotolocal(unsigned char device)
-{ int status;
- status=EWOULDBLOCK;
+ status = EWOULDBLOCK;
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+
+ outb(BSR, 1); /* Set REN bit on GPIB */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(CDOR, (device & 31) + 32); /* address device to listen */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(CDOR, 63); /* Unaddress device */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+
+}
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
+/*
+ * This does not release the REM line on the gpib port, because if it did,
+ * all the remote devices would go to local mode. This only sends the
+ * gotolocal message to one device. Currently, REM is always held true
+ * after enableremote is called, and is reset only on a close of the
+ * gpib device
+ */
-outb(CDOR,(device&31)+32);
+static void
+gotolocal(unsigned char device)
+{
+ int status;
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
+ status = EWOULDBLOCK;
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
-outb(AUXMR,0x5E); /*Clear SYNC*/
- outb (CDOR,1);
+ outb(CDOR, (device & 31) + 32);
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
- outb(AUXMR,0x5E);
- outb (CDOR,63);/*unaddress device*/
+ outb(AUXMR, 0x5E); /* Clear SYNC */
+ outb(CDOR, 1);
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
- }
+ outb(AUXMR, 0x5E);
+ outb(CDOR, 63); /* unaddress device */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+}
static void
menableremote(unsigned char *device)
{
- int status, counter = 0;
-
-status=EWOULDBLOCK;
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
- outb(BSR,1); /*Set REN bit on GPIB*/
- do
- {
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb(CDOR,(device[counter]&31)+32); /*address device to listen*/
- counter++;
- }
- while (device[counter]<32);
-
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
- outb (CDOR,63); /*Unaddress device*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
- }
+ int status, counter = 0;
+
+ status = EWOULDBLOCK;
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+
+ outb(BSR, 1); /* Set REN bit on GPIB */
+ do {
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(CDOR, (device[counter] & 31) + 32); /* address device to listen */
+ counter++;
+ } while (device[counter] < 32);
+
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+
+ outb(CDOR, 63); /* Unaddress device */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+
+}
static void
mgotolocal(unsigned char *device)
-{ int status;
- int counter=0;
-status=EWOULDBLOCK;
- if (device[counter]<32) do {
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb(CDOR,(device[counter]&31)+32);
- counter++;
- } while (device[counter]<32);
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
- outb(AUXMR,0x5E); /*Clear SYNC*/
- outb (CDOR,1);
-
-
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb(AUXMR,0x5E);
- outb (CDOR,63);/*unaddress device*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",2);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
-
- }
-/*Trigger a device. What happens depends on how the device is
- configured. */
+{
+ int status;
+ int counter = 0;
+
+ status = EWOULDBLOCK;
+ if (device[counter] < 32) do {
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(CDOR, (device[counter] & 31) + 32);
+ counter++;
+ } while (device[counter] < 32);
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+
+ outb(AUXMR, 0x5E); /* Clear SYNC */
+ outb(CDOR, 1);
+
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(AUXMR, 0x5E);
+ outb(CDOR, 63); /* unaddress device */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 2);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+}
+
+/* Trigger a device. What happens depends on how the device is configured. */
static void
trigger(unsigned char device)
-{ int status;
-
-status=EWOULDBLOCK;
- if (device<32) {
- if (!(inb(ISR2)&0x08)) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb(CDOR,(device&31)+32); /*address device to listen*/
- if (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
- outb (CDOR,8); /*send GET*/
-
- if (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb (AUXMR,0x5E);
- outb (CDOR,63);/*unaddress device*/
- if (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
-
- }
+{
+ int status;
+
+ status = EWOULDBLOCK;
+ if (device < 32) {
+ if (!(inb(ISR2) & 0x08)) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(CDOR, (device & 31) + 32); /* address device to listen */
+ if (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+
+ outb(CDOR, 8); /* send GET */
+
+ if (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(AUXMR, 0x5E);
+ outb(CDOR, 63); /* unaddress device */
+ if (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ }
}
-/*Trigger multiple devices by addressing them all to listen, and then
- sending GET*/
+/*
+ * Trigger multiple devices by addressing them all to listen, and then
+ * sending GET
+ */
static void
mtrigger(unsigned char *device)
-{ int status=EWOULDBLOCK;
- int counter=0;
- if(device[0]<32){
- do {
- if (device[counter]<32)
- if (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb(CDOR,(device[counter]&31)+32); /*address device to listen*/
- counter++;
- }
- while (device[counter]<32);
- if (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb (CDOR,8); /*send GET*/
-
- if (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
- outb (AUXMR,0x5E);
- outb (CDOR,63);/*unaddress device*/
- if (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR2)&0x08)&&status==EWOULDBLOCK); /*Wait to send next cmd*/
-
-
- }
+{
+ int status = EWOULDBLOCK;
+ int counter = 0;
+ if (device[0] < 32) {
+ do {
+ if (device[counter] < 32)
+ if (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(CDOR, (device[counter] & 31) + 32); /* address device to listen */
+ counter++;
+ } while (device[counter] < 32);
+ if (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(CDOR, 8); /* send GET */
+
+ if (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ outb(AUXMR, 0x5E);
+ outb(CDOR, 63); /* unaddress device */
+ if (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 0x08) && status == EWOULDBLOCK); /* Wait to send next cmd */
+ }
}
-/*This is not used now, but it should work with NI's 8 bit gpib board
- since it does not use the TURBO488 registers at all */
-
+/*
+ * This is not used now, but it should work with NI's 8 bit gpib board
+ * since it does not use the TURBO488 registers at all
+ */
-/*Send data through the TURBO488 FIFOS to a device that is already
- addressed to listen. This is used by the write call when someone is
- writing to a printer or plotter, etc... */
-/*The last byte of each write is held off until either the next
- write or close, so it can be sent with EOI set*/
+/*
+ * Send data through the TURBO488 FIFOS to a device that is already
+ * addressed to listen. This is used by the write call when someone is
+ * writing to a printer or plotter, etc...
+ *
+ * The last byte of each write is held off until either the next
+ * write or close, so it can be sent with EOI set
+ */
static int
-sendrawgpibfifo(unsigned char device,char *data,int count)
- {
- int status;
- int counter;
- int fifopos;
- int sleeptime;
-
-
- sleeptime=SLEEP_MIN;
- counter=0;
-
-
- fifopos=0;
-
-status=EWOULDBLOCK;
- do {
- /*Wait for fifo to become not full if it is full */
- sleeptime=SLEEP_MIN;
- if (!(inb(ISR3)&0x08)) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",sleeptime);
- if (sleeptime<SLEEP_MAX) sleeptime=sleeptime*2;
- }
- while (!(inb(ISR3)&0x08)&&(status==EWOULDBLOCK)); /*Fifo is full*/
-
- if((count>1)&&(inb(ISR3)&0x08)){
- outw(FIFOB,*(unsigned*)(data+counter));
- /* printf ("gpib: sent:%c,%c\n",data[counter],data[counter+1]);*/
-
- counter+=2;
- count-=2;
- }
- }
- while ((count>1)&&(status==EWOULDBLOCK));
-/*The write routine and close routine must check if there is 1
- byte left and handle it accordingly*/
+sendrawgpibfifo(unsigned char device, char *data, int count)
+{
+ int status;
+ int counter;
+ int fifopos;
+ int sleeptime;
+
+ sleeptime = SLEEP_MIN;
+ counter = 0;
+
+ fifopos = 0;
+
+ status = EWOULDBLOCK;
+ do {
+ /* Wait for fifo to become not full if it is full */
+ sleeptime = SLEEP_MIN;
+ if (!(inb(ISR3) & 0x08)) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", sleeptime);
+ if (sleeptime < SLEEP_MAX) sleeptime = sleeptime * 2;
+ } while (!(inb(ISR3) & 0x08) && (status == EWOULDBLOCK)); /* Fifo is full */
+
+ if ((count>1) && (inb(ISR3) & 0x08)) {
+ outw(FIFOB, *(unsigned *)(data + counter));
+#if 0
+ printf ("gpib: sent:%c, %c\n", data[counter], data[counter + 1]);
+#endif
+ counter += 2;
+ count -= 2;
+ }
+ }
+ while ((count>1) && (status == EWOULDBLOCK));
+ /*
+ * The write routine and close routine must check if there is 1
+ * byte left and handle it accordingly
+ */
-/*Return the number of bytes written to the device*/
- return(counter);
+ /* Return the number of bytes written to the device */
+ return (counter);
+}
+static int
+sendgpibfifo(unsigned char device, char *data, int count)
+{
+ int status;
+ int counter;
+ int fifopos;
+ int sleeptime;
+
+ outb(IMR2, 0x30); /* we have to enable DMA (0x30) for turbo488 to work */
+ outb(CNT0, 0);
+ outb(CNT1, 0);
+ outb(CNT2, 0);
+ outb(CNT3, 0);
+ status = EWOULDBLOCK;
+ if (!(inb(ISR2) & 8)) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+
+ outb(CDOR, (device & 31) + 32); /* address device to listen */
+
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(CDOR, 64); /* Address controller (me) to talk */
+
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+
+ outb(AUXMR, gts); /* Set to Standby (Controller) */
+ fifopos = 0;
+
+ sleeptime = SLEEP_MIN;
+ counter = 0;
+
+ fifopos = 0;
+
+ outb(CMDR, 0x20);
+ outb(CFG, 0x47); /* 16 bit, write, fifo B first, TMOE TIM */
+ outb(CMDR, 0x10); /* RESET fifos */
+ outb(CCRG, seoi); /* program to send EOI at end */
+ outb(CMDR, 0x04); /* Tell TURBO488 to GO */
+ status = EWOULDBLOCK;
+ do {
+ /* Wait for fifo to become not full if it is full */
+ sleeptime = SLEEP_MIN;
+ if (!(inb(ISR3) & 0x08)) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", sleeptime);
+ if (sleeptime < SLEEP_MAX) sleeptime = sleeptime * 2;
+ } while (!(inb(ISR3) & 0x08) && (status == EWOULDBLOCK)); /* Fifo is full */
+
+ if ((count>1) && (inb(ISR3) & 0x08)) {
+#if 0
+ if (count == 2) outb(CFG, 15 + 0x40); /* send eoi when done */
+#endif
+ outw(FIFOB, *(unsigned *)(data + counter));
+
+ counter += 2;
+ count -= 2;
+ }
+ } while ((count>2) && (status == EWOULDBLOCK));
+
+ if (count == 2 && status == EWOULDBLOCK) {
+ /* Wait for fifo to become not full */
+ if (status == EWOULDBLOCK && !(inb(ISR3) & 0x08)) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", SLEEP_MIN);
+ } while (!(inb(ISR3) & 0x08) && status == EWOULDBLOCK); /* Fifo is full */
+#if 0
+ outb(CFG, 0x40 + 15); /* send eoi when done */
+#endif
+ outb(FIFOB, data[counter]);
+ counter++;
+ count--;
+ }
+#if 0
+ outb(CMDR, 0x04);
+#endif
-}
+ /* Wait for fifo to become empty */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while ((inb(ISR3) & 0x04) && status == EWOULDBLOCK); /* Fifo is not empty */
-static int
-sendgpibfifo(unsigned char device,char *data,int count)
- {
- int status;
- int counter;
- int fifopos;
- int sleeptime;
-
-outb(IMR2,0x30); /*we have to enable DMA (0x30) for turbo488 to work*/
- outb(CNT0,0);
- outb(CNT1,0);
- outb(CNT2,0);
- outb(CNT3,0);
-status=EWOULDBLOCK;
- if (!(inb(ISR2)&8)) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
-
- outb(CDOR,(device&31)+32);/*address device to listen*/
-
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
- outb (CDOR,64); /*Address controller (me) to talk*/
-
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
-
- outb(AUXMR,gts); /*Set to Standby (Controller)*/
- fifopos=0;
-
- sleeptime=SLEEP_MIN;
- counter=0;
-
-
- fifopos=0;
-
- outb(CMDR,0x20);
- outb(CFG,0x47); /* 16 bit, write, fifo B first, TMOE TIM */
- outb(CMDR,0x10); /*RESET fifos*/
- outb(CCRG,seoi); /*program to send EOI at end*/
- outb(CMDR,0x04); /*Tell TURBO488 to GO*/
-status=EWOULDBLOCK;
- do {
- /*Wait for fifo to become not full if it is full */
- sleeptime=SLEEP_MIN;
- if (!(inb(ISR3)&0x08)) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",sleeptime);
- if (sleeptime<SLEEP_MAX) sleeptime=sleeptime*2;
- }
- while (!(inb(ISR3)&0x08)&&(status==EWOULDBLOCK)); /*Fifo is full*/
-
- if((count>1)&&(inb(ISR3)&0x08)){
- /*if(count==2) outb(CFG,15+0x40); *//*send eoi when done*/
- outw(FIFOB,*(unsigned*)(data+counter));
-
- counter+=2;
- count-=2;
- }
- }
- while ((count>2)&&(status==EWOULDBLOCK));
-
- if (count==2&&status==EWOULDBLOCK) {
- /*Wait for fifo to become not full*/
- if(status==EWOULDBLOCK&&!(inb(ISR3)&0x08)) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",SLEEP_MIN);
- }
- while (!(inb(ISR3)&0x08)&&status==EWOULDBLOCK); /*Fifo is full*/
- /*outb(CFG,0x40+15);*//*send eoi when done*/
- outb(FIFOB,data[counter]);
- counter++;
- count--;
- }
-
-
- /*outb(CMDR,0x04);*/
-
- /*Wait for fifo to become empty*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while ((inb(ISR3)&0x04)&&status==EWOULDBLOCK); /*Fifo is not empty*/
-
- outb(CMDR,0x08); /*Issue STOP to TURBO488*/
-
- /*Wait for DONE and STOP*/
- if (status==EWOULDBLOCK) do {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while (!(inb(ISR3)&0x11)&&status==EWOULDBLOCK); /*not done and stop*/
-
- outb(IMR2,0x00); /*we have to enable DMA (0x30) for turbo488 to work*/
- outb(CMDR,0x20); /*soft reset turbo488*/
- outb(CMDR,0x10); /*reset fifos*/
-
-
-/*Send last byte with EOI set*/
-/*Here EOI is handled correctly since the string to be sent */
-/*is actually all sent during the ioctl. (See above)*/
-
-if (count==1&&status==EWOULDBLOCK) { /*Count should always=1 here*/
-
-do
- if (!(inb(ISR1)&2)) status=tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1);
-while (!(inb(ISR1)&2)&&(status==EWOULDBLOCK));
-
- outb(AUXMR,seoi); /*Set EOI for the last byte*/
- outb(AUXMR,0x5E); /*Clear SYNC*/
- outb(CDOR,data[counter]);
- counter++;
- count--;
-}
+ outb(CMDR, 0x08); /* Issue STOP to TURBO488 */
-do
- if (!(inb(ISR1)&2)) status=tsleep((caddr_t)&gpib_sc, GPIBPRI,"gpibpoll",1);
-while (!(inb(ISR1)&2)&&(status==EWOULDBLOCK));
+ /* Wait for DONE and STOP */
+ if (status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR3) & 0x11) && status == EWOULDBLOCK); /* not done and stop */
+ outb(IMR2, 0x00); /* we have to enable DMA (0x30) for turbo488 to work */
+ outb(CMDR, 0x20); /* soft reset turbo488 */
+ outb(CMDR, 0x10); /* reset fifos */
- if (!(inb(ISR1)&2)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR1)&2)&&status==EWOULDBLOCK);
- outb(AUXMR,tca); /* Regain full control of the bus*/
+ /*
+ * Send last byte with EOI set
+ * Here EOI is handled correctly since the string to be sent
+ * is actually all sent during the ioctl. (See above)
+ */
+ if (count == 1 && status == EWOULDBLOCK) { /* Count should always=1 here */
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ do {
+ if (!(inb(ISR1) & 2)) status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 2) && (status == EWOULDBLOCK));
- outb(CDOR,63); /*unlisten*/
+ outb(AUXMR, seoi); /* Set EOI for the last byte */
+ outb(AUXMR, 0x5E); /* Clear SYNC */
+ outb(CDOR, data[counter]);
+ counter++;
+ count--;
+ }
+ do {
+ if (!(inb(ISR1) & 2)) status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 2) && (status == EWOULDBLOCK));
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ if (!(inb(ISR1) & 2) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 2) && status == EWOULDBLOCK);
+ outb(AUXMR, tca); /* Regain full control of the bus */
-outb(AUXMR,0x5E); /*Clear SYNC*/
- outb (CDOR,95);/*untalk*/
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(CDOR, 63); /* unlisten */
- return(counter);
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(AUXMR, 0x5E); /* Clear SYNC */
+ outb(CDOR, 95); /* untalk */
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ return (counter);
}
static int
-readgpibfifo(unsigned char device,char *data,int count)
+readgpibfifo(unsigned char device, char *data, int count)
{
- int status;
- int status2 = 0;
- int status1;
- int counter;
- int fifopos;
- unsigned inword;
-
- outb(IMR2,0x30); /*we have to enable DMA (0x30) for turbo488 to work*/
- /*outb(IMR3,0x1F);
- outb(INTR,1); */
- outb(CMDR,0x20);
-
- outb(CFG,14+0x60+1); /* Halt on int,read, fifo B first, CCEN TMOE TIM */
- outb(CMDR,0x10); /*RESET fifos*/
- outb(CCRG,tcs); /*program to tcs at end*/
- outb(CMDR,0x08);/*STOP??*/
-
-
-
-status=EWOULDBLOCK;
-do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
-
- outb (CDOR,32); /*Address controller (me) to listen*/
-
- do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
-
- outb(CDOR,(device&31)+64);/*address device to talk*/
-
+ int status;
+ int status2 = 0;
+ int status1;
+ int counter;
+ int fifopos;
+ unsigned inword;
- do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ outb(IMR2, 0x30); /* we have to enable DMA (0x30) for turbo488 to work */
+#if 0
+ outb(IMR3, 0x1F);
+ outb(INTR, 1);
+#endif
+ outb(CMDR, 0x20);
- outb(AUXMR,gts); /*Set to Standby (Controller)*/
+ outb(CFG, 14 + 0x60 + 1); /* Halt on int, read, fifo B first, CCEN TMOE TIM */
+ outb(CMDR, 0x10); /* RESET fifos */
+ outb(CCRG, tcs); /* program to tcs at end */
+ outb(CMDR, 0x08); /* STOP?? */
- counter=0;
- fifopos=0;
+ status = EWOULDBLOCK;
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- outb(CMDR,0x04); /*Tell TURBO488 to GO*/
+ outb(CDOR, 32); /* Address controller (me) to listen */
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- do {
- status1=inb(ISR3);
- if (!(status1&0x01)&&(status1&0x04)){
- status2=inb(STS2);
- inword=inw(FIFOB);
- *(unsigned*)(data+counter)=inword;
- /* printf ("Read:%c,%c\n",data[counter],data[counter+1]);*/
- counter+=2;
- }
- else {
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",4);
- }
- }
- while (!(status1&0x01)&&status==EWOULDBLOCK);
- if(!(status2 & 0x04)){ /*Only 1 byte came in on last 16 bit transfer*/
- data[counter-1]=0;
- counter--; }
- else
- data[counter]=0;
- outb(CMDR,0x08); /*send STOP*/
+ outb(CDOR, (device & 31) + 64); /* address device to talk */
- do{
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- }
- while(!(inb(ISR3)&0x11)&&status==EWOULDBLOCK); /*wait for DONE and STOP*/
- outb(AUXMR,0x55);
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- outb(IMR2,0x00); /*we have to enable DMA (0x30) for turbo488 to work*/
- outb(CMDR,0x20); /*soft reset turbo488*/
- outb(CMDR,0x10); /*reset fifos*/
+ outb(AUXMR, gts); /* Set to Standby (Controller) */
-/* do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR1)&2));*/
- outb(AUXMR,tca); /* Regain full control of the bus*/
+ counter = 0;
+ fifopos = 0;
+ outb(CMDR, 0x04); /* Tell TURBO488 to GO */
- do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
- outb(CDOR,63); /*unlisten*/
+ do {
+ status1 = inb(ISR3);
+ if (!(status1 & 0x01) && (status1 & 0x04)) {
+ status2 = inb(STS2);
+ inword = inw(FIFOB);
+ *(unsigned *)(data + counter) = inword;
+#if 0
+ printf ("Read:%c, %c\n", data[counter], data[counter + 1]);
+#endif
+ counter += 2;
+ } else {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 4);
+ }
+ } while (!(status1 & 0x01) && status == EWOULDBLOCK);
+ if (!(status2 & 0x04)) { /* Only 1 byte came in on last 16 bit transfer */
+ data[counter-1] = 0;
+ counter--;
+ } else
+ data[counter] = 0;
+ outb(CMDR, 0x08); /* send STOP */
+
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR3) & 0x11) && status == EWOULDBLOCK); /* wait for DONE and STOP */
+ outb(AUXMR, 0x55);
+
+ outb(IMR2, 0x00); /* we have to enable DMA (0x30) for turbo488 to work */
+ outb(CMDR, 0x20); /* soft reset turbo488 */
+ outb(CMDR, 0x10); /* reset fifos */
- do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+#if 0
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 2));
+#endif
+ outb(AUXMR, tca); /* Regain full control of the bus */
-outb(AUXMR,0x5E); /*Clear SYNC*/
- outb (CDOR,95);/*untalk*/
- do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(CDOR, 63); /* unlisten */
- return(counter);
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(AUXMR, 0x5E); /* Clear SYNC */
+ outb(CDOR, 95); /* untalk */
+ do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ return (counter);
}
/* Return the status byte from device */
static char
spoll(unsigned char device)
- {
- int status=EWOULDBLOCK;
- unsigned int statusbyte;
-
- if (!(inb(ISR2)&8)) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
-
- outb(CDOR,(device&31)+64);/*address device to talk*/
-
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+{
+ int status = EWOULDBLOCK;
+ unsigned int statusbyte;
- outb (CDOR,32); /*Address controller (me) to listen*/
+ if (!(inb(ISR2) & 8)) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
- outb(AUXMR,0x5E);
- outb (CDOR,0x18); /*Send SPE (serial poll enable)*/
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ outb(CDOR, (device & 31) + 64); /* address device to talk */
- /*wait for bus to be synced*/
- if (!(inb(ISR0)&1)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR0)&1)&&status==EWOULDBLOCK);
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- outb(AUXMR,gts); /*Set to Standby (Controller)*/
+ outb(CDOR, 32); /* Address controller (me) to listen */
- if (!(inb(ISR1)&1)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR1)&1)&&status==EWOULDBLOCK);
- outb(AUXMR,0x5E);
- outb(AUXMR,tcs); /* Take control after next read*/
- statusbyte=inb(DIR);
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(AUXMR, 0x5E);
+ outb(CDOR, 0x18); /* Send SPE (serial poll enable) */
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ /* wait for bus to be synced */
+ if (!(inb(ISR0) & 1) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR0) & 1) && status == EWOULDBLOCK);
- outb(CDOR,0x19); /*SPD (serial poll disable)*/
+ outb(AUXMR, gts); /* Set to Standby (Controller) */
- /*wait for bus to be synced*/
- if (!(inb(ISR0)&1)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR0)&1)&&status==EWOULDBLOCK);
+ if (!(inb(ISR1) & 1) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR1) & 1) && status == EWOULDBLOCK);
+ outb(AUXMR, 0x5E);
+ outb(AUXMR, tcs); /* Take control after next read */
+ statusbyte = inb(DIR);
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
+ outb(CDOR, 0x19); /* SPD (serial poll disable) */
-outb(CDOR,95); /*untalk*/
+ /* wait for bus to be synced */
+ if (!(inb(ISR0) & 1) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR0) & 1) && status == EWOULDBLOCK);
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
- outb(AUXMR,0x5E);
- outb (CDOR,63);/*unlisten*/
- if (!(inb(ISR2)&8)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR2)&8)&&status==EWOULDBLOCK);
- /*wait for bus to be synced*/
- if (!(inb(ISR0)&1)&&status==EWOULDBLOCK) do
- status=tsleep((caddr_t)&gpib_sc,GPIBPRI,"gpibpoll",1);
- while (!(inb(ISR0)&1)&&status==EWOULDBLOCK);
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(CDOR, 95); /* untalk */
- return(statusbyte);
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ outb(AUXMR, 0x5E);
+ outb(CDOR, 63); /* unlisten */
+ if (!(inb(ISR2) & 8) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
+ /* wait for bus to be synced */
+ if (!(inb(ISR0) & 1) && status == EWOULDBLOCK) do {
+ status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
+ } while (!(inb(ISR0) & 1) && status == EWOULDBLOCK);
+ return (statusbyte);
}
OpenPOWER on IntegriCloud