hil_gpib.c revision 1.6
11.6Sthorpej/*	$NetBSD: hil_gpib.c,v 1.6 2006/03/29 06:33:50 thorpej Exp $	*/
21.2Slukem
31.2Slukem#include <sys/cdefs.h>
41.6Sthorpej__KERNEL_RCSID(0, "$NetBSD: hil_gpib.c,v 1.6 2006/03/29 06:33:50 thorpej Exp $");
51.2Slukem
61.1Sgmcgarry#include <sys/param.h>
71.1Sgmcgarry#include <sys/systm.h>
81.1Sgmcgarry#include <sys/callout.h>
91.1Sgmcgarry#include <sys/conf.h>
101.1Sgmcgarry#include <sys/device.h>
111.1Sgmcgarry
121.1Sgmcgarry#include <dev/gpib/gpibvar.h>
131.1Sgmcgarry
141.1Sgmcgarry#ifdef DEBUG
151.1Sgmcgarryint     hildebug = 0;
161.1Sgmcgarry#define HDB_FOLLOW      0x01
171.1Sgmcgarry#define HDB_MMAP	0x02
181.1Sgmcgarry#define HDB_MASK	0x04
191.1Sgmcgarry#define HDB_CONFIG      0x08
201.1Sgmcgarry#define HDB_KEYBOARD    0x10
211.1Sgmcgarry#define HDB_IDMODULE    0x20
221.1Sgmcgarry#define HDB_EVENTS      0x80
231.1Sgmcgarry#define DPRINTF(mask, str)	if (hildebug & (mask)) printf str
241.1Sgmcgarry#else
251.1Sgmcgarry#define DPRINTF(mask, str)	/* nothing */
261.1Sgmcgarry#endif
271.1Sgmcgarry
281.1Sgmcgarrystruct  hil_softc {
291.1Sgmcgarry	struct device sc_dev;
301.1Sgmcgarry	gpib_chipset_tag_t sc_ic;
311.1Sgmcgarry	gpib_handle_t sc_hdl;
321.1Sgmcgarry
331.1Sgmcgarry	int	sc_address;		 /* GPIB address */
341.1Sgmcgarry	int     sc_flags;
351.3Sperry#define HILF_ALIVE	0x01
361.3Sperry#define HILF_OPEN	0x02
371.1Sgmcgarry#define HILF_UIO	0x04
381.1Sgmcgarry#define HILF_TIMO	0x08
391.1Sgmcgarry#define HILF_DELAY	0x10
401.1Sgmcgarry};
411.1Sgmcgarry
421.1Sgmcgarryint     hilmatch(struct device *, struct cfdata *, void *);
431.1Sgmcgarryvoid    hilattach(struct device *, struct device *, void *);
441.1Sgmcgarry
451.1Sgmcgarryconst struct cfattach hil_ca = {
461.1Sgmcgarry	sizeof(struct hil_softc), hilmatch, hilattach,
471.1Sgmcgarry};
481.1Sgmcgarry
491.1Sgmcgarryvoid	hilcallback(void *, int);
501.1Sgmcgarryvoid	hilstart(void *);
511.1Sgmcgarry
521.1Sgmcgarryint
531.1Sgmcgarryhilmatch(parent, match, aux)
541.1Sgmcgarry	struct device *parent;
551.1Sgmcgarry	struct cfdata *match;
561.1Sgmcgarry	void *aux;
571.1Sgmcgarry{
581.1Sgmcgarry	struct gpib_attach_args *ga = aux;
591.1Sgmcgarry	u_int8_t *cmd = "SE;";
601.1Sgmcgarry	u_int8_t stat;
611.1Sgmcgarry
621.1Sgmcgarry	if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3)
631.1Sgmcgarry		return (0);
641.1Sgmcgarry	if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1)
651.1Sgmcgarry		return (0);
661.1Sgmcgarry	printf("hilmatch: enable status byte 0x%x\n", stat);
671.1Sgmcgarry	return (1);
681.1Sgmcgarry}
691.1Sgmcgarry
701.1Sgmcgarryvoid
711.1Sgmcgarryhilattach(parent, self, aux)
721.1Sgmcgarry	struct device *parent, *self;
731.1Sgmcgarry	void *aux;
741.1Sgmcgarry{
751.6Sthorpej	struct hil_softc *sc = device_private(self);
761.1Sgmcgarry	struct gpib_attach_args *ga = aux;
771.1Sgmcgarry
781.1Sgmcgarry	printf("\n");
791.1Sgmcgarry
801.1Sgmcgarry	sc->sc_ic = ga->ga_ic;
811.1Sgmcgarry	sc->sc_address = ga->ga_address;
821.1Sgmcgarry
831.1Sgmcgarry	if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc,
841.1Sgmcgarry	    &sc->sc_hdl)) {
851.1Sgmcgarry		printf("%s: can't register callback\n", sc->sc_dev.dv_xname);
861.1Sgmcgarry		return;
871.1Sgmcgarry	}
881.1Sgmcgarry
891.1Sgmcgarry	sc->sc_flags = HILF_ALIVE;
901.1Sgmcgarry}
911.1Sgmcgarry
921.1Sgmcgarryvoid
931.1Sgmcgarryhilcallback(v, action)
941.1Sgmcgarry	void *v;
951.1Sgmcgarry	int action;
961.1Sgmcgarry{
971.1Sgmcgarry	struct hil_softc *sc = v;
981.1Sgmcgarry
991.1Sgmcgarry	DPRINTF(HDB_FOLLOW, ("hilcallback: v=%p, action=%d\n", v, action));
1001.1Sgmcgarry
1011.1Sgmcgarry	switch (action) {
1021.1Sgmcgarry	case GPIBCBF_START:
1031.1Sgmcgarry		hilstart(sc);
1041.1Sgmcgarry	case GPIBCBF_INTR:
1051.1Sgmcgarry		/* no-op */
1061.1Sgmcgarry		break;
1071.1Sgmcgarry#ifdef DEBUG
1081.1Sgmcgarry	default:
1091.1Sgmcgarry		DPRINTF(HDB_FOLLOW, ("hilcallback: unknown action %d\n",
1101.1Sgmcgarry		    action));
1111.1Sgmcgarry		break;
1121.1Sgmcgarry#endif
1131.1Sgmcgarry	}
1141.1Sgmcgarry}
1151.1Sgmcgarry
1161.1Sgmcgarryvoid
1171.1Sgmcgarryhilstart(v)
1181.1Sgmcgarry	void *v;
1191.1Sgmcgarry{
1201.1Sgmcgarry	struct hil_softc *sc = v;
1211.1Sgmcgarry
1221.5Sthorpej	DPRINTF(HDB_FOLLOW, ("hilstart(%x)\n", device_unit(&sc->sc_dev)));
1231.1Sgmcgarry
1241.1Sgmcgarry	sc->sc_flags &= ~HILF_DELAY;
1251.1Sgmcgarry}
126