hil_gpib.c revision 1.1
11.1Sgmcgarry#include <sys/param.h>
21.1Sgmcgarry#include <sys/systm.h>
31.1Sgmcgarry#include <sys/callout.h>
41.1Sgmcgarry#include <sys/conf.h>
51.1Sgmcgarry#include <sys/device.h>
61.1Sgmcgarry
71.1Sgmcgarry#include <dev/gpib/gpibvar.h>
81.1Sgmcgarry
91.1Sgmcgarry#ifdef DEBUG
101.1Sgmcgarryint     hildebug = 0;
111.1Sgmcgarry#define HDB_FOLLOW      0x01
121.1Sgmcgarry#define HDB_MMAP	0x02
131.1Sgmcgarry#define HDB_MASK	0x04
141.1Sgmcgarry#define HDB_CONFIG      0x08
151.1Sgmcgarry#define HDB_KEYBOARD    0x10
161.1Sgmcgarry#define HDB_IDMODULE    0x20
171.1Sgmcgarry#define HDB_EVENTS      0x80
181.1Sgmcgarry#define DPRINTF(mask, str)	if (hildebug & (mask)) printf str
191.1Sgmcgarry#else
201.1Sgmcgarry#define DPRINTF(mask, str)	/* nothing */
211.1Sgmcgarry#endif
221.1Sgmcgarry
231.1Sgmcgarrystruct  hil_softc {
241.1Sgmcgarry	struct device sc_dev;
251.1Sgmcgarry	gpib_chipset_tag_t sc_ic;
261.1Sgmcgarry	gpib_handle_t sc_hdl;
271.1Sgmcgarry
281.1Sgmcgarry	int	sc_address;		 /* GPIB address */
291.1Sgmcgarry	int     sc_flags;
301.1Sgmcgarry#define HILF_ALIVE	0x01
311.1Sgmcgarry#define HILF_OPEN	0x02
321.1Sgmcgarry#define HILF_UIO	0x04
331.1Sgmcgarry#define HILF_TIMO	0x08
341.1Sgmcgarry#define HILF_DELAY	0x10
351.1Sgmcgarry};
361.1Sgmcgarry
371.1Sgmcgarryint     hilmatch(struct device *, struct cfdata *, void *);
381.1Sgmcgarryvoid    hilattach(struct device *, struct device *, void *);
391.1Sgmcgarry
401.1Sgmcgarryconst struct cfattach hil_ca = {
411.1Sgmcgarry	sizeof(struct hil_softc), hilmatch, hilattach,
421.1Sgmcgarry};
431.1Sgmcgarry
441.1Sgmcgarryvoid	hilcallback(void *, int);
451.1Sgmcgarryvoid	hilstart(void *);
461.1Sgmcgarry
471.1Sgmcgarryint
481.1Sgmcgarryhilmatch(parent, match, aux)
491.1Sgmcgarry	struct device *parent;
501.1Sgmcgarry	struct cfdata *match;
511.1Sgmcgarry	void *aux;
521.1Sgmcgarry{
531.1Sgmcgarry	struct gpib_attach_args *ga = aux;
541.1Sgmcgarry	u_int8_t *cmd = "SE;";
551.1Sgmcgarry	u_int8_t stat;
561.1Sgmcgarry
571.1Sgmcgarry	if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3)
581.1Sgmcgarry		return (0);
591.1Sgmcgarry	if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1)
601.1Sgmcgarry		return (0);
611.1Sgmcgarry	printf("hilmatch: enable status byte 0x%x\n", stat);
621.1Sgmcgarry	return (1);
631.1Sgmcgarry}
641.1Sgmcgarry
651.1Sgmcgarryvoid
661.1Sgmcgarryhilattach(parent, self, aux)
671.1Sgmcgarry	struct device *parent, *self;
681.1Sgmcgarry	void *aux;
691.1Sgmcgarry{
701.1Sgmcgarry	struct hil_softc *sc = (struct hil_softc *)self;
711.1Sgmcgarry	struct gpib_attach_args *ga = aux;
721.1Sgmcgarry
731.1Sgmcgarry	printf("\n");
741.1Sgmcgarry
751.1Sgmcgarry	sc->sc_ic = ga->ga_ic;
761.1Sgmcgarry	sc->sc_address = ga->ga_address;
771.1Sgmcgarry
781.1Sgmcgarry	if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc,
791.1Sgmcgarry	    &sc->sc_hdl)) {
801.1Sgmcgarry		printf("%s: can't register callback\n", sc->sc_dev.dv_xname);
811.1Sgmcgarry		return;
821.1Sgmcgarry	}
831.1Sgmcgarry
841.1Sgmcgarry	sc->sc_flags = HILF_ALIVE;
851.1Sgmcgarry}
861.1Sgmcgarry
871.1Sgmcgarryvoid
881.1Sgmcgarryhilcallback(v, action)
891.1Sgmcgarry	void *v;
901.1Sgmcgarry	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.1Sgmcgarryhilstart(v)
1131.1Sgmcgarry	void *v;
1141.1Sgmcgarry{
1151.1Sgmcgarry	struct hil_softc *sc = v;
1161.1Sgmcgarry
1171.1Sgmcgarry	DPRINTF(HDB_FOLLOW, ("hilstart(%x)\n", sc->sc_dev.dv_unit));
1181.1Sgmcgarry
1191.1Sgmcgarry	sc->sc_flags &= ~HILF_DELAY;
1201.1Sgmcgarry}
121