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