hil_gpib.c revision 1.8
11.8Sdsl/*	$NetBSD: hil_gpib.c,v 1.8 2009/03/14 15:36:17 dsl Exp $	*/
21.2Slukem
31.2Slukem#include <sys/cdefs.h>
41.8Sdsl__KERNEL_RCSID(0, "$NetBSD: hil_gpib.c,v 1.8 2009/03/14 15:36:17 dsl 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.8Sdslhilmatch(struct device *parent, struct cfdata *match, void *aux)
541.1Sgmcgarry{
551.1Sgmcgarry	struct gpib_attach_args *ga = aux;
561.1Sgmcgarry	u_int8_t *cmd = "SE;";
571.1Sgmcgarry	u_int8_t stat;
581.1Sgmcgarry
591.1Sgmcgarry	if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3)
601.1Sgmcgarry		return (0);
611.1Sgmcgarry	if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1)
621.1Sgmcgarry		return (0);
631.1Sgmcgarry	printf("hilmatch: enable status byte 0x%x\n", stat);
641.1Sgmcgarry	return (1);
651.1Sgmcgarry}
661.1Sgmcgarry
671.1Sgmcgarryvoid
681.1Sgmcgarryhilattach(parent, self, aux)
691.1Sgmcgarry	struct device *parent, *self;
701.1Sgmcgarry	void *aux;
711.1Sgmcgarry{
721.6Sthorpej	struct hil_softc *sc = device_private(self);
731.1Sgmcgarry	struct gpib_attach_args *ga = aux;
741.1Sgmcgarry
751.1Sgmcgarry	printf("\n");
761.1Sgmcgarry
771.1Sgmcgarry	sc->sc_ic = ga->ga_ic;
781.1Sgmcgarry	sc->sc_address = ga->ga_address;
791.1Sgmcgarry
801.1Sgmcgarry	if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc,
811.1Sgmcgarry	    &sc->sc_hdl)) {
821.7Scegger		aprint_error_dev(&sc->sc_dev, "can't register callback\n");
831.1Sgmcgarry		return;
841.1Sgmcgarry	}
851.1Sgmcgarry
861.1Sgmcgarry	sc->sc_flags = HILF_ALIVE;
871.1Sgmcgarry}
881.1Sgmcgarry
891.1Sgmcgarryvoid
901.8Sdslhilcallback(void *v, int action)
911.1Sgmcgarry{
921.1Sgmcgarry	struct hil_softc *sc = v;
931.1Sgmcgarry
941.1Sgmcgarry	DPRINTF(HDB_FOLLOW, ("hilcallback: v=%p, action=%d\n", v, action));
951.1Sgmcgarry
961.1Sgmcgarry	switch (action) {
971.1Sgmcgarry	case GPIBCBF_START:
981.1Sgmcgarry		hilstart(sc);
991.1Sgmcgarry	case GPIBCBF_INTR:
1001.1Sgmcgarry		/* no-op */
1011.1Sgmcgarry		break;
1021.1Sgmcgarry#ifdef DEBUG
1031.1Sgmcgarry	default:
1041.1Sgmcgarry		DPRINTF(HDB_FOLLOW, ("hilcallback: unknown action %d\n",
1051.1Sgmcgarry		    action));
1061.1Sgmcgarry		break;
1071.1Sgmcgarry#endif
1081.1Sgmcgarry	}
1091.1Sgmcgarry}
1101.1Sgmcgarry
1111.1Sgmcgarryvoid
1121.8Sdslhilstart(void *v)
1131.1Sgmcgarry{
1141.1Sgmcgarry	struct hil_softc *sc = v;
1151.1Sgmcgarry
1161.5Sthorpej	DPRINTF(HDB_FOLLOW, ("hilstart(%x)\n", device_unit(&sc->sc_dev)));
1171.1Sgmcgarry
1181.1Sgmcgarry	sc->sc_flags &= ~HILF_DELAY;
1191.1Sgmcgarry}
120