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