#include <sys/queue.h>
#define GPIB_NDEVS 30
#define GPIB_ADDRMASK 0x1f
#define GPIB_BROADCAST_ADDR 31
#define GPIBCMD_LLO 0x11
#define GPIBCMD_DCL 0x14
#define GPIBCMD_PPU 0x15
#define GPIBCMD_SPE 0x18
#define GPIBCMD_SPD 0x19
#define GPIBCMD_GTL 0x01
#define GPIBCMD_SDC 0x04
#define GPIBCMD_PPC 0x05
#define GPIBCMD_GET 0x08
#define GPIBCMD_TCT 0x09
#define GPIBCMD_LAG 0x20
#define GPIBCMD_UNL 0x3f
#define GPIBCMD_TAG 0x40
#define GPIBCMD_UNA 0x5e
#define GPIBCMD_UNT 0x5f
#define GPIBCMD_SCG 0x60
#define GPIBCMD_PPD 0x70
#define GPIBCMD_DEL 0x7f
struct gpib_softc;
struct gpib_chipset_tag {
void (*reset)(void *);
int (*send)(void *, int, int, void *, int);
int (*recv)(void *, int, int, void *, int);
int (*pptest)(void *, int);
void (*ppwatch)(void *, int);
void (*ppclear)(void *);
void (*xfer)(void *, int, int, void *, int, int, int);
int (*tc)(void *, int);
int (*gts)(void *);
void (*ifc)(void *);
int (*sendcmds)(void *, void *, int);
int (*senddata)(void *, void *, int);
int (*recvdata)(void *, void *, int);
void *cookie;
struct gpib_softc *bus;
};
typedef struct gpib_chipset_tag *gpib_chipset_tag_t;
#define gpibreset(ic) \
(*((ic)->reset))((ic)->cookie)
#define gpibpptest(ic, slave) \
(*((ic)->pptest))((ic)->cookie, (slave))
#define gpibppclear(ic) \
(*((ic)->ppclear))((ic)->cookie)
#define gpibxfer(ic, slave, sec, buf, cnt, rw, timo) \
(*((ic)->xfer))((ic)->cookie, (slave), (sec), (buf), (cnt), \
(rw), (timo))
typedef void (*gpib_callback_t)(void *, int);
struct gpibqueue {
TAILQ_ENTRY(gpibqueue) hq_list;
void *hq_softc;
int hq_slave;
gpib_callback_t hq_callback;
};
typedef struct gpibqueue *gpib_handle_t;
int _gpibregister(struct gpib_softc *, int, void (*cb)(void *, int),
void *, gpib_handle_t *);
int _gpibrequest(struct gpib_softc *, gpib_handle_t);
void _gpibrelease(struct gpib_softc *, gpib_handle_t);
int _gpibswait(struct gpib_softc *, int);
void _gpibawait(struct gpib_softc *);
int _gpibsend(struct gpib_softc *, int, int, void *, int);
int _gpibrecv(struct gpib_softc *, int, int, void *, int);
#define gpibsend(ic, slave, sec, addr, cnt) \
_gpibsend((ic)->bus, (slave), (sec), (addr), (cnt))
#define gpibrecv(ic, slave, sec, addr, cnt) \
_gpibrecv((ic)->bus, (slave), (sec), (addr), (cnt))
#define gpibregister(ic, slave, callback, arg, hdlp) \
_gpibregister((ic)->bus, (slave), (callback), (arg), (hdlp))
#define gpibrequest(ic, hdl) \
_gpibrequest((ic)->bus, hdl)
#define gpibrelease(ic, hdl) \
_gpibrelease((ic)->bus, hdl)
#define gpibawait(ic) \
_gpibawait((ic)->bus)
#define gpibswait(ic, slave) \
_gpibswait((ic)->bus, (slave))
int gpib_alloc(struct gpib_softc *, u_int8_t);
int gpib_isalloc(struct gpib_softc *, u_int8_t);
void gpib_dealloc(struct gpib_softc *, u_int8_t);
int gpibintr(void *);
int gpibdevprint(void *, const char *);
#define GPIBCBF_START 1
#define GPIBCBF_INTR 2
#define GPIB_READ 1
#define GPIB_WRITE 2
struct gpib_attach_args {
gpib_chipset_tag_t ga_ic;
int ga_address;
};
struct gpibdev_attach_args {
gpib_chipset_tag_t ga_ic;
int ga_address;
};
struct gpib_softc {
device_t sc_dev;
gpib_chipset_tag_t sc_ic;
u_int8_t sc_myaddr;
int sc_flags;
#define GPIBF_ACTIVE 0x01
u_int32_t sc_rmap;
TAILQ_HEAD(, gpibqueue) sc_queue;
};