1/* $NetBSD: gpibvar.h,v 1.3 2005/12/11 12:21:21 christos Exp $ */ 2 3/*- 4 * Copyright (c) 2003 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Gregory McGarry. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include <sys/queue.h> 33 34#define GPIB_NDEVS 30 /* max address */ 35#define GPIB_ADDRMASK 0x1f /* address mask */ 36#define GPIB_BROADCAST_ADDR 31 /* GPIB broadcast address */ 37 38/* 39 * GPIB commands 40 */ 41 42/* Universal command group (UCG) [0x10] */ 43#define GPIBCMD_LLO 0x11 /* local lockout */ 44#define GPIBCMD_DCL 0x14 /* universal device clear */ 45#define GPIBCMD_PPU 0x15 /* parallel poll unconfigure */ 46#define GPIBCMD_SPE 0x18 47#define GPIBCMD_SPD 0x19 48 49/* Addressed command group (ACG) [0x00] */ 50#define GPIBCMD_GTL 0x01 51#define GPIBCMD_SDC 0x04 /* selected device clear */ 52#define GPIBCMD_PPC 0x05 /* parallel poll clear */ 53#define GPIBCMD_GET 0x08 54#define GPIBCMD_TCT 0x09 55 56#define GPIBCMD_LAG 0x20 /* listener address group commands */ 57#define GPIBCMD_UNL 0x3f /* universal unlisten */ 58#define GPIBCMD_TAG 0x40 /* talker address group commands */ 59#define GPIBCMD_UNA 0x5e /* unaddress (master talk address?) */ 60#define GPIBCMD_UNT 0x5f /* universal untalk */ 61#define GPIBCMD_SCG 0x60 /* secondary group commands */ 62#define GPIBCMD_PPD 0x70 63#define GPIBCMD_DEL 0x7f 64 65struct gpib_softc; 66 67struct gpib_chipset_tag { 68 void (*reset)(void *); 69 int (*send)(void *, int, int, void *, int); 70 int (*recv)(void *, int, int, void *, int); 71 int (*pptest)(void *, int); 72 void (*ppwatch)(void *, int); 73 void (*ppclear)(void *); 74 void (*xfer)(void *, int, int, void *, int, int, int); 75 int (*tc)(void *, int); 76 int (*gts)(void *); 77 void (*ifc)(void *); 78 int (*sendcmds)(void *, void *, int); 79 int (*senddata)(void *, void *, int); 80 int (*recvdata)(void *, void *, int); 81 void *cookie; 82 struct gpib_softc *bus; 83}; 84typedef struct gpib_chipset_tag *gpib_chipset_tag_t; 85 86/* 87 * Wrapper functions that go directly to the hardware driver. 88 */ 89#define gpibreset(ic) \ 90 (*((ic)->reset))((ic)->cookie) 91#define gpibpptest(ic, slave) \ 92 (*((ic)->pptest))((ic)->cookie, (slave)) 93#define gpibppclear(ic) \ 94 (*((ic)->ppclear))((ic)->cookie) 95#define gpibxfer(ic, slave, sec, buf, cnt, rw, timo) \ 96 (*((ic)->xfer))((ic)->cookie, (slave), (sec), (buf), (cnt), \ 97 (rw), (timo)) 98 99/* 100 * An GPIB job queue entry. Slave drivers have one of these used 101 * to queue requests with the controller. 102 */ 103typedef void (*gpib_callback_t)(void *, int); 104struct gpibqueue { 105 TAILQ_ENTRY(gpibqueue) hq_list; /* entry on queue */ 106 void *hq_softc; /* slave's softc */ 107 int hq_slave; /* slave on bus */ 108 gpib_callback_t hq_callback; /* slave's callback function */ 109}; 110typedef struct gpibqueue *gpib_handle_t; 111 112int _gpibregister(struct gpib_softc *, int, void (*cb)(void *, int), 113 void *, gpib_handle_t *); 114int _gpibrequest(struct gpib_softc *, gpib_handle_t); 115void _gpibrelease(struct gpib_softc *, gpib_handle_t); 116int _gpibswait(struct gpib_softc *, int); 117void _gpibawait(struct gpib_softc *); 118int _gpibsend(struct gpib_softc *, int, int, void *, int); 119int _gpibrecv(struct gpib_softc *, int, int, void *, int); 120 121#define gpibsend(ic, slave, sec, addr, cnt) \ 122 _gpibsend((ic)->bus, (slave), (sec), (addr), (cnt)) 123#define gpibrecv(ic, slave, sec, addr, cnt) \ 124 _gpibrecv((ic)->bus, (slave), (sec), (addr), (cnt)) 125#define gpibregister(ic, slave, callback, arg, hdlp) \ 126 _gpibregister((ic)->bus, (slave), (callback), (arg), (hdlp)) 127#define gpibrequest(ic, hdl) \ 128 _gpibrequest((ic)->bus, hdl) 129#define gpibrelease(ic, hdl) \ 130 _gpibrelease((ic)->bus, hdl) 131#define gpibawait(ic) \ 132 _gpibawait((ic)->bus) 133#define gpibswait(ic, slave) \ 134 _gpibswait((ic)->bus, (slave)) 135 136int gpib_alloc(struct gpib_softc *, u_int8_t); 137int gpib_isalloc(struct gpib_softc *, u_int8_t); 138void gpib_dealloc(struct gpib_softc *, u_int8_t); 139 140/* called from controller drivers only */ 141int gpibintr(void *); 142int gpibdevprint(void *, const char *); 143 144/* callback flags */ 145#define GPIBCBF_START 1 146#define GPIBCBF_INTR 2 147 148/* gpibxfer dir(ection) parameter */ 149#define GPIB_READ 1 150#define GPIB_WRITE 2 151 152/* 153 * Attach devices 154 */ 155struct gpib_attach_args { 156 gpib_chipset_tag_t ga_ic; /* GPIB chipset tag */ 157 int ga_address; /* device GPIB address */ 158}; 159 160/* 161 * Attach a GPIB to controller. 162 */ 163struct gpibdev_attach_args { 164 gpib_chipset_tag_t ga_ic; /* GPIB chipset tag */ 165 int ga_address; /* host GPIB address */ 166}; 167 168/* 169 * Software state per GPIB bus. 170 */ 171struct gpib_softc { 172 struct device sc_dev; /* generic device glue */ 173 gpib_chipset_tag_t sc_ic; /* GPIB chipset tag */ 174 u_int8_t sc_myaddr; /* my (host) GPIB address */ 175 int sc_flags; 176#define GPIBF_ACTIVE 0x01 177 u_int32_t sc_rmap; /* resource map */ 178 TAILQ_HEAD(, gpibqueue) sc_queue; /* GPIB job queue */ 179}; 180