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