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