hil_gpib.c revision 1.2
1/*	$NetBSD: hil_gpib.c,v 1.2 2003/07/14 15:40:04 lukem Exp $	*/
2
3#include <sys/cdefs.h>
4__KERNEL_RCSID(0, "$NetBSD: hil_gpib.c,v 1.2 2003/07/14 15:40:04 lukem Exp $");
5
6#include <sys/param.h>
7#include <sys/systm.h>
8#include <sys/callout.h>
9#include <sys/conf.h>
10#include <sys/device.h>
11
12#include <dev/gpib/gpibvar.h>
13
14#ifdef DEBUG
15int     hildebug = 0;
16#define HDB_FOLLOW      0x01
17#define HDB_MMAP	0x02
18#define HDB_MASK	0x04
19#define HDB_CONFIG      0x08
20#define HDB_KEYBOARD    0x10
21#define HDB_IDMODULE    0x20
22#define HDB_EVENTS      0x80
23#define DPRINTF(mask, str)	if (hildebug & (mask)) printf str
24#else
25#define DPRINTF(mask, str)	/* nothing */
26#endif
27
28struct  hil_softc {
29	struct device sc_dev;
30	gpib_chipset_tag_t sc_ic;
31	gpib_handle_t sc_hdl;
32
33	int	sc_address;		 /* GPIB address */
34	int     sc_flags;
35#define HILF_ALIVE	0x01
36#define HILF_OPEN	0x02
37#define HILF_UIO	0x04
38#define HILF_TIMO	0x08
39#define HILF_DELAY	0x10
40};
41
42int     hilmatch(struct device *, struct cfdata *, void *);
43void    hilattach(struct device *, struct device *, void *);
44
45const struct cfattach hil_ca = {
46	sizeof(struct hil_softc), hilmatch, hilattach,
47};
48
49void	hilcallback(void *, int);
50void	hilstart(void *);
51
52int
53hilmatch(parent, match, aux)
54	struct device *parent;
55	struct cfdata *match;
56	void *aux;
57{
58	struct gpib_attach_args *ga = aux;
59	u_int8_t *cmd = "SE;";
60	u_int8_t stat;
61
62	if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3)
63		return (0);
64	if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1)
65		return (0);
66	printf("hilmatch: enable status byte 0x%x\n", stat);
67	return (1);
68}
69
70void
71hilattach(parent, self, aux)
72	struct device *parent, *self;
73	void *aux;
74{
75	struct hil_softc *sc = (struct hil_softc *)self;
76	struct gpib_attach_args *ga = aux;
77
78	printf("\n");
79
80	sc->sc_ic = ga->ga_ic;
81	sc->sc_address = ga->ga_address;
82
83	if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc,
84	    &sc->sc_hdl)) {
85		printf("%s: can't register callback\n", sc->sc_dev.dv_xname);
86		return;
87	}
88
89	sc->sc_flags = HILF_ALIVE;
90}
91
92void
93hilcallback(v, action)
94	void *v;
95	int action;
96{
97	struct hil_softc *sc = v;
98
99	DPRINTF(HDB_FOLLOW, ("hilcallback: v=%p, action=%d\n", v, action));
100
101	switch (action) {
102	case GPIBCBF_START:
103		hilstart(sc);
104	case GPIBCBF_INTR:
105		/* no-op */
106		break;
107#ifdef DEBUG
108	default:
109		DPRINTF(HDB_FOLLOW, ("hilcallback: unknown action %d\n",
110		    action));
111		break;
112#endif
113	}
114}
115
116void
117hilstart(v)
118	void *v;
119{
120	struct hil_softc *sc = v;
121
122	DPRINTF(HDB_FOLLOW, ("hilstart(%x)\n", sc->sc_dev.dv_unit));
123
124	sc->sc_flags &= ~HILF_DELAY;
125}
126