hil_gpib.c revision 1.12
11.12Schs/*	$NetBSD: hil_gpib.c,v 1.12 2012/10/27 17:18:16 chs Exp $	*/
21.2Slukem
31.2Slukem#include <sys/cdefs.h>
41.12Schs__KERNEL_RCSID(0, "$NetBSD: hil_gpib.c,v 1.12 2012/10/27 17:18:16 chs 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	gpib_chipset_tag_t sc_ic;
301.1Sgmcgarry	gpib_handle_t sc_hdl;
311.1Sgmcgarry
321.1Sgmcgarry	int	sc_address;		 /* GPIB address */
331.1Sgmcgarry	int     sc_flags;
341.3Sperry#define HILF_ALIVE	0x01
351.3Sperry#define HILF_OPEN	0x02
361.1Sgmcgarry#define HILF_UIO	0x04
371.1Sgmcgarry#define HILF_TIMO	0x08
381.1Sgmcgarry#define HILF_DELAY	0x10
391.1Sgmcgarry};
401.1Sgmcgarry
411.11Sceggerint     hilmatch(device_t, cfdata_t, void *);
421.11Sceggervoid    hilattach(device_t, device_t, void *);
431.1Sgmcgarry
441.1Sgmcgarryconst struct cfattach hil_ca = {
451.1Sgmcgarry	sizeof(struct hil_softc), hilmatch, hilattach,
461.1Sgmcgarry};
471.1Sgmcgarry
481.1Sgmcgarryvoid	hilcallback(void *, int);
491.1Sgmcgarryvoid	hilstart(void *);
501.1Sgmcgarry
511.1Sgmcgarryint
521.11Sceggerhilmatch(device_t parent, cfdata_t match, void *aux)
531.1Sgmcgarry{
541.1Sgmcgarry	struct gpib_attach_args *ga = aux;
551.1Sgmcgarry	u_int8_t *cmd = "SE;";
561.1Sgmcgarry	u_int8_t stat;
571.1Sgmcgarry
581.1Sgmcgarry	if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3)
591.1Sgmcgarry		return (0);
601.1Sgmcgarry	if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1)
611.1Sgmcgarry		return (0);
621.1Sgmcgarry	printf("hilmatch: enable status byte 0x%x\n", stat);
631.1Sgmcgarry	return (1);
641.1Sgmcgarry}
651.1Sgmcgarry
661.1Sgmcgarryvoid
671.11Sceggerhilattach(device_t parent, device_t self, void *aux)
681.1Sgmcgarry{
691.6Sthorpej	struct hil_softc *sc = device_private(self);
701.1Sgmcgarry	struct gpib_attach_args *ga = aux;
711.1Sgmcgarry
721.1Sgmcgarry	printf("\n");
731.1Sgmcgarry
741.1Sgmcgarry	sc->sc_ic = ga->ga_ic;
751.1Sgmcgarry	sc->sc_address = ga->ga_address;
761.1Sgmcgarry
771.1Sgmcgarry	if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc,
781.1Sgmcgarry	    &sc->sc_hdl)) {
791.12Schs		aprint_error_dev(self, "can't register callback\n");
801.1Sgmcgarry		return;
811.1Sgmcgarry	}
821.1Sgmcgarry
831.1Sgmcgarry	sc->sc_flags = HILF_ALIVE;
841.1Sgmcgarry}
851.1Sgmcgarry
861.1Sgmcgarryvoid
871.8Sdslhilcallback(void *v, int action)
881.1Sgmcgarry{
891.1Sgmcgarry	struct hil_softc *sc = v;
901.1Sgmcgarry
911.1Sgmcgarry	DPRINTF(HDB_FOLLOW, ("hilcallback: v=%p, action=%d\n", v, action));
921.1Sgmcgarry
931.1Sgmcgarry	switch (action) {
941.1Sgmcgarry	case GPIBCBF_START:
951.1Sgmcgarry		hilstart(sc);
961.1Sgmcgarry	case GPIBCBF_INTR:
971.1Sgmcgarry		/* no-op */
981.1Sgmcgarry		break;
991.1Sgmcgarry#ifdef DEBUG
1001.1Sgmcgarry	default:
1011.1Sgmcgarry		DPRINTF(HDB_FOLLOW, ("hilcallback: unknown action %d\n",
1021.1Sgmcgarry		    action));
1031.1Sgmcgarry		break;
1041.1Sgmcgarry#endif
1051.1Sgmcgarry	}
1061.1Sgmcgarry}
1071.1Sgmcgarry
1081.1Sgmcgarryvoid
1091.8Sdslhilstart(void *v)
1101.1Sgmcgarry{
1111.1Sgmcgarry	struct hil_softc *sc = v;
1121.1Sgmcgarry
1131.12Schs	DPRINTF(HDB_FOLLOW, ("hilstart\n"));
1141.1Sgmcgarry
1151.1Sgmcgarry	sc->sc_flags &= ~HILF_DELAY;
1161.1Sgmcgarry}
117