1 /* $NetBSD: gpibvar.h,v 1.3 2005/12/11 12:21:21 christos Exp $ */
4 * Copyright (c) 2003 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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.
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.
32 #include <sys/queue.h>
34 #define GPIB_NDEVS 30 /* max address */
35 #define GPIB_ADDRMASK 0x1f /* address mask */
36 #define GPIB_BROADCAST_ADDR 31 /* GPIB broadcast address */
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
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
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
67 struct 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);
78 int (*sendcmds
)(void *, void *, int);
79 int (*senddata
)(void *, void *, int);
80 int (*recvdata
)(void *, void *, int);
82 struct gpib_softc
*bus
;
84 typedef struct gpib_chipset_tag
*gpib_chipset_tag_t
;
87 * Wrapper functions that go directly to the hardware driver.
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), \
100 * An GPIB job queue entry. Slave drivers have one of these used
101 * to queue requests with the controller.
103 typedef void (*gpib_callback_t
)(void *, int);
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 */
110 typedef struct gpibqueue
*gpib_handle_t
;
112 int _gpibregister(struct gpib_softc
*, int, void (*cb
)(void *, int),
113 void *, gpib_handle_t
*);
114 int _gpibrequest(struct gpib_softc
*, gpib_handle_t
);
115 void _gpibrelease(struct gpib_softc
*, gpib_handle_t
);
116 int _gpibswait(struct gpib_softc
*, int);
117 void _gpibawait(struct gpib_softc
*);
118 int _gpibsend(struct gpib_softc
*, int, int, void *, int);
119 int _gpibrecv(struct gpib_softc
*, int, int, void *, int);
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))
136 int gpib_alloc(struct gpib_softc
*, u_int8_t
);
137 int gpib_isalloc(struct gpib_softc
*, u_int8_t
);
138 void gpib_dealloc(struct gpib_softc
*, u_int8_t
);
140 /* called from controller drivers only */
141 int gpibintr(void *);
142 int gpibdevprint(void *, const char *);
145 #define GPIBCBF_START 1
146 #define GPIBCBF_INTR 2
148 /* gpibxfer dir(ection) parameter */
155 struct gpib_attach_args
{
156 gpib_chipset_tag_t ga_ic
; /* GPIB chipset tag */
157 int ga_address
; /* device GPIB address */
161 * Attach a GPIB to controller.
163 struct gpibdev_attach_args
{
164 gpib_chipset_tag_t ga_ic
; /* GPIB chipset tag */
165 int ga_address
; /* host GPIB address */
169 * Software state per GPIB bus.
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 */
176 #define GPIBF_ACTIVE 0x01
177 u_int32_t sc_rmap
; /* resource map */
178 TAILQ_HEAD(, gpibqueue
) sc_queue
; /* GPIB job queue */