summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2004-03-14 05:31:41 +0000
committerimp <imp@FreeBSD.org>2004-03-14 05:31:41 +0000
commitbf55e98e4f17d40a49030a2f11feed0e30bcb033 (patch)
treefe267dfc6b81794ff605b88186b8b1f2feb209a0 /sys/i386/isa
parent2edbbfbff4c8c0398be251a3bec0c6db1ec0d41c (diff)
downloadFreeBSD-src-bf55e98e4f17d40a49030a2f11feed0e30bcb033.zip
FreeBSD-src-bf55e98e4f17d40a49030a2f11feed0e30bcb033.tar.gz
Remove gp driver. It uses the old COMPAT_ISA shims.
If this driver is rewritten using newer APIs it can return.
Diffstat (limited to 'sys/i386/isa')
-rw-r--r--sys/i386/isa/gpib.c1121
-rw-r--r--sys/i386/isa/gpibreg.h88
2 files changed, 0 insertions, 1209 deletions
diff --git a/sys/i386/isa/gpib.c b/sys/i386/isa/gpib.c
deleted file mode 100644
index 0a653fe..0000000
--- a/sys/i386/isa/gpib.c
+++ /dev/null
@@ -1,1121 +0,0 @@
-/*
- * GPIB driver for FreeBSD.
- * Version 0.1 (No interrupts, no DMA)
- * Supports National Instruments AT-GPIB and AT-GPIB/TNT boards.
- * (AT-GPIB not tested, but it should work)
- *
- * Written by Fred Cawthorne (fcawth@delphi.umd.edu)
- * Some sections were based partly on the lpt driver.
- * (some remnants may remain)
- *
- * This software is distributed with NO WARRANTIES, not even the implied
- * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * The author grants any other persons or organizations permission to use
- * or modify this software as long as this message is kept with the software,
- * all derivative works or modified versions.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* Please read the README file for usage information */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/conf.h>
-#include <sys/uio.h>
-#include <sys/malloc.h>
-#include <sys/bus.h>
-#include <i386/isa/gpibreg.h>
-#include <i386/isa/gpib.h>
-#include <i386/isa/isa_device.h>
-
-#ifndef COMPAT_OLDISA
-#error "The gpib device requires the old isa compatibility shims"
-#endif
-
-#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);
-#if 0
-static void showregs(void);
-#endif
-static void enableremote(unsigned char device);
-static void gotolocal(unsigned char device);
-static void menableremote(unsigned char *device);
-static void mgotolocal(unsigned char *device);
-static void mtrigger(unsigned char *device);
-static void trigger(unsigned char device);
-static char spoll(unsigned char device);
-
-static int gpprobe(struct isa_device *dvp);
-static int gpattach(struct isa_device *dvp);
-
-struct isa_driver gpdriver = {
- INTR_TYPE_TTY,
- gpprobe,
- gpattach,
- "gp"
-};
-COMPAT_ISA_DRIVER(gp, gpdriver);
-
-static d_open_t gpopen;
-static d_close_t gpclose;
-static d_write_t gpwrite;
-static d_ioctl_t gpioctl;
-
-static struct cdevsw gp_cdevsw = {
- .d_version = D_VERSION,
- .d_flags = D_NEEDGIANT,
- .d_open = gpopen,
- .d_close = gpclose,
- .d_write = gpwrite,
- .d_ioctl = gpioctl,
- .d_name = "gp",
-};
-
-#define BUFSIZE 1024
-#define ATTACHED 0x08
-#define OPEN 0x04
-#define INIT 0x02
-
-static struct gpib_softc {
- char *sc_cp; /* current data to send */
- int sc_count; /* bytes queued in sc_inbuf */
- int sc_type; /* Type of gpib controller */
- 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? */
-
-static int oldcount;
-static char oldbytes[2];
-
-/*
- * Probe routine
- * This needs to be changed to be a bit more robust
- */
-static int
-gpprobe(struct isa_device *dvp)
-{
- int status;
- 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;
- return (status);
-}
-
-/*
- * gpattach()
- * Attach device and print the type of card to the screen.
- */
-static int
-gpattach(isdp)
- struct isa_device *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;
- make_dev(&gp_cdevsw, 0, 0, 0, 0600, "gp");
- return (1);
-}
-
-/*
- * gpopen()
- * New open on device.
- *
- * More than 1 open is not allowed on the entire device.
- * i.e. even if gpib5 is open, we can't open another minor device
- */
-static int
-gpopen(dev, flags, fmt, td)
- dev_t dev;
- int flags;
- int fmt;
- struct thread *td;
-{
- struct gpib_softc *sc = &gpib_sc;
- u_char unit;
- int status;
-
- unit = minor(dev);
-
- /* minor number out of limits ? */
- if (unit >= 32)
- return (ENXIO);
-
- /* Attached ? */
- if (!(sc->sc_flags&ATTACHED)) /* not attached */
- return (ENXIO);
-
- /* 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);
-
- 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);
-}
-
-
-/*
- * gpclose()
- * Close gpib device.
- */
-static int
-gpclose(dev, flags, fmt, td)
- dev_t dev;
- int flags;
- int fmt;
- struct thread *td;
-{
- struct gpib_softc *sc = &gpib_sc;
- 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);
-#if 0
- gotolocal(minor(dev));
-#endif
- }
- closegpib();
- sc->sc_flags = ATTACHED;
- free(sc->sc_inbuf, M_DEVBUF);
- sc->sc_inbuf = 0; /* Sanity */
- return (0);
-}
-
-/*
- * gpwrite()
- * Copy from user's buffer, then write to GPIB device referenced
- * by minor(dev).
- */
-static int
-gpwrite(dev, uio, ioflag)
- dev_t dev;
- struct uio *uio;
- int ioflag;
-{
- 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];
- }
- 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
- */
-
-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;
- error = 0;
-
- switch (cmd) {
- case GPIBWRITE:
- 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;
- break;
- case GPIBINIT:
- initgpib();
- error = 0;
- break;
- case GPIBTRIGGER:
- trigger(gd->address);
- error = 0;
- break;
- case GPIBREMOTE:
- enableremote(gd->address);
- error = 0;
- break;
- case GPIBLOCAL:
- gotolocal(gd->address);
- error = 0;
- break;
- case GPIBMTRIGGER:
- mtrigger(gd->data);
- error = 0;
- break;
- case GPIBMREMOTE:
- menableremote(gd->data);
- error = 0;
- break;
- case GPIBMLOCAL:
- mgotolocal(gd->data);
- error = 0;
- break;
- case GPIBSPOLL:
- *(gd->data) = spoll(gd->address);
- error = 0;
- break;
- default:
- error = ENODEV;
- }
-
- 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
- outb(AUXMR, 0x88) /* Transmit END with EOS */
- outb(AUXMR, 0x84) /* Set END on EOS received */
- outb(AUXMR, 0x8C) /* Do both of the above */
-#endif
-
-#if 0
- /* Not currently supported */
- outb(AUXMR, hldi); /* Perform RFD Holdoff for all data in */
-#endif
-
- 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);
-}
-
-/*
- * 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
- */
-
-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
- */
-
-static void
-gotolocal(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(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 */
-
- 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 */
-}
-
-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 */
-
-}
-
-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. */
-
-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 */
- }
-}
-
-/*
- * 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 */
- }
-}
-
-/*
- * 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
- */
-
-static int
-sendrawgpibfifo(unsigned char device, char *data, int count)
-{
- int status;
- int counter;
- int sleeptime;
-
- sleeptime = SLEEP_MIN;
- counter = 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);
-}
-
-static int
-sendgpibfifo(unsigned char device, char *data, int count)
-{
- int status;
- int counter;
- 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) */
-
- sleeptime = SLEEP_MIN;
- counter = 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 */
-
- 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--;
- }
-
- 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 */
-
- 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 */
-
- 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)
-{
- int status;
- int status2 = 0;
- int status1;
- int counter;
- unsigned inword;
-
- 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(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 */
-
- do {
- status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
- } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
-
- outb(AUXMR, gts); /* Set to Standby (Controller) */
-
- counter = 0;
-
- outb(CMDR, 0x04); /* Tell TURBO488 to GO */
-
- 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 */
-
-#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 */
-
- do {
- status = tsleep((caddr_t)&gpib_sc, GPIBPRI, "gpibpoll", 1);
- } while (!(inb(ISR2) & 8) && status == EWOULDBLOCK);
- outb(CDOR, 63); /* unlisten */
-
- 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);
-
- outb(CDOR, 32); /* Address controller (me) 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(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);
-
- /* 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(AUXMR, gts); /* Set to Standby (Controller) */
-
- 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(CDOR, 0x19); /* SPD (serial poll disable) */
-
- /* 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 */
-
- 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);
-}
diff --git a/sys/i386/isa/gpibreg.h b/sys/i386/isa/gpibreg.h
deleted file mode 100644
index f6b5c99..0000000
--- a/sys/i386/isa/gpibreg.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* $FreeBSD$ */
-
-static int gpib_port=0x2c0;
-#define IEEE gpib_port
-
-/*NAT4882 Registers*/
-
-#define DIR IEEE+0
-#define CDOR IEEE+0
-#define ISR1 IEEE+2
-#define IMR1 IEEE+2
-#define ISR2 IEEE+4
-#define IMR2 IEEE+4
-#define SPSR IEEE+6
-#define KSR IEEE+0x17
-#define KCR IEEE+0x17
-#define SPMR IEEE+6
-#define ADSR IEEE+8
-#define ADMR IEEE+8
-#define CPTR IEEE+0x0A
-#define SASR IEEE+0x1B
-#define AUXMR IEEE+0x0A
-#define ADR0 IEEE+0x0c
-#define ISR0 IEEE+0x1d
-#define IMR0 IEEE+0x1d
-#define ADR IEEE+0x0c
-#define ADR1 IEEE+0x0e
-#define BSR IEEE+0x1f
-#define BCR IEEE+0x1f
-#define EOSR IEEE+0x0e
-
-
-/*Turbo 488 Registers*/
-
-#define CNT2 IEEE+0x09
-#define CNT3 IEEE+0x0b
-#define HSSEL IEEE+0x0d
-#define STS1 IEEE+0x10
-#define CFG IEEE+0x10
-#define IMR3 IEEE+0x12
-#define CNT0 IEEE+0x14
-#define CNT1 IEEE+0x16
-#define FIFOB IEEE+0x18
-#define FIFOA IEEE+0x19
-#define ISR3 IEEE+0x1a
-#define CCRG IEEE+0x1a
-#define STS2 IEEE+0x1c
-#define CMDR IEEE+0x1c
-#define TIMER IEEE+0x1e
-#define ACCWR IEEE+0x05
-#define INTR IEEE+0x07
-
-
-
-#define pon 0
-#define chip_reset 2
-#define rhdf 3
-#define trig 4
-#define rtl_pulse 5
-#define rtl_off 5
-#define rtl_on 0x0d
-#define seoi 6
-#define ist_off 1
-#define ist_on 9
-#define rlc 0x0a
-#define rqc 8
-#define lut 0x0b
-#define lul 0x0c
-#define nbaf 0x0e
-#define gts 0x10
-#define tca 0x11
-#define tcs 0x12
-#define tcse 0x1a
-#define ltn 0x13
-#define ltn_cont 0x1b
-#define lun 0x1c
-#define rsc_off 0x14
-#define sic_rsc 0x1e
-#define sic_rsc_off 0x16
-#define sre_rsc 0x1f
-#define sre_rsc_off 0x17
-#define reqt 0x18
-#define reqf 0x19
-#define rppl 0x1d
-#define hldi 0x51
-
-
-
OpenPOWER on IntegriCloud