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