hil_gpib.c revision 1.6
11.6Sthorpej/* $NetBSD: hil_gpib.c,v 1.6 2006/03/29 06:33:50 thorpej Exp $ */ 21.2Slukem 31.2Slukem#include <sys/cdefs.h> 41.6Sthorpej__KERNEL_RCSID(0, "$NetBSD: hil_gpib.c,v 1.6 2006/03/29 06:33:50 thorpej 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 struct device sc_dev; 301.1Sgmcgarry gpib_chipset_tag_t sc_ic; 311.1Sgmcgarry gpib_handle_t sc_hdl; 321.1Sgmcgarry 331.1Sgmcgarry int sc_address; /* GPIB address */ 341.1Sgmcgarry int sc_flags; 351.3Sperry#define HILF_ALIVE 0x01 361.3Sperry#define HILF_OPEN 0x02 371.1Sgmcgarry#define HILF_UIO 0x04 381.1Sgmcgarry#define HILF_TIMO 0x08 391.1Sgmcgarry#define HILF_DELAY 0x10 401.1Sgmcgarry}; 411.1Sgmcgarry 421.1Sgmcgarryint hilmatch(struct device *, struct cfdata *, void *); 431.1Sgmcgarryvoid hilattach(struct device *, struct device *, void *); 441.1Sgmcgarry 451.1Sgmcgarryconst struct cfattach hil_ca = { 461.1Sgmcgarry sizeof(struct hil_softc), hilmatch, hilattach, 471.1Sgmcgarry}; 481.1Sgmcgarry 491.1Sgmcgarryvoid hilcallback(void *, int); 501.1Sgmcgarryvoid hilstart(void *); 511.1Sgmcgarry 521.1Sgmcgarryint 531.1Sgmcgarryhilmatch(parent, match, aux) 541.1Sgmcgarry struct device *parent; 551.1Sgmcgarry struct cfdata *match; 561.1Sgmcgarry void *aux; 571.1Sgmcgarry{ 581.1Sgmcgarry struct gpib_attach_args *ga = aux; 591.1Sgmcgarry u_int8_t *cmd = "SE;"; 601.1Sgmcgarry u_int8_t stat; 611.1Sgmcgarry 621.1Sgmcgarry if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3) 631.1Sgmcgarry return (0); 641.1Sgmcgarry if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1) 651.1Sgmcgarry return (0); 661.1Sgmcgarry printf("hilmatch: enable status byte 0x%x\n", stat); 671.1Sgmcgarry return (1); 681.1Sgmcgarry} 691.1Sgmcgarry 701.1Sgmcgarryvoid 711.1Sgmcgarryhilattach(parent, self, aux) 721.1Sgmcgarry struct device *parent, *self; 731.1Sgmcgarry void *aux; 741.1Sgmcgarry{ 751.6Sthorpej struct hil_softc *sc = device_private(self); 761.1Sgmcgarry struct gpib_attach_args *ga = aux; 771.1Sgmcgarry 781.1Sgmcgarry printf("\n"); 791.1Sgmcgarry 801.1Sgmcgarry sc->sc_ic = ga->ga_ic; 811.1Sgmcgarry sc->sc_address = ga->ga_address; 821.1Sgmcgarry 831.1Sgmcgarry if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc, 841.1Sgmcgarry &sc->sc_hdl)) { 851.1Sgmcgarry printf("%s: can't register callback\n", sc->sc_dev.dv_xname); 861.1Sgmcgarry return; 871.1Sgmcgarry } 881.1Sgmcgarry 891.1Sgmcgarry sc->sc_flags = HILF_ALIVE; 901.1Sgmcgarry} 911.1Sgmcgarry 921.1Sgmcgarryvoid 931.1Sgmcgarryhilcallback(v, action) 941.1Sgmcgarry void *v; 951.1Sgmcgarry int action; 961.1Sgmcgarry{ 971.1Sgmcgarry struct hil_softc *sc = v; 981.1Sgmcgarry 991.1Sgmcgarry DPRINTF(HDB_FOLLOW, ("hilcallback: v=%p, action=%d\n", v, action)); 1001.1Sgmcgarry 1011.1Sgmcgarry switch (action) { 1021.1Sgmcgarry case GPIBCBF_START: 1031.1Sgmcgarry hilstart(sc); 1041.1Sgmcgarry case GPIBCBF_INTR: 1051.1Sgmcgarry /* no-op */ 1061.1Sgmcgarry break; 1071.1Sgmcgarry#ifdef DEBUG 1081.1Sgmcgarry default: 1091.1Sgmcgarry DPRINTF(HDB_FOLLOW, ("hilcallback: unknown action %d\n", 1101.1Sgmcgarry action)); 1111.1Sgmcgarry break; 1121.1Sgmcgarry#endif 1131.1Sgmcgarry } 1141.1Sgmcgarry} 1151.1Sgmcgarry 1161.1Sgmcgarryvoid 1171.1Sgmcgarryhilstart(v) 1181.1Sgmcgarry void *v; 1191.1Sgmcgarry{ 1201.1Sgmcgarry struct hil_softc *sc = v; 1211.1Sgmcgarry 1221.5Sthorpej DPRINTF(HDB_FOLLOW, ("hilstart(%x)\n", device_unit(&sc->sc_dev))); 1231.1Sgmcgarry 1241.1Sgmcgarry sc->sc_flags &= ~HILF_DELAY; 1251.1Sgmcgarry} 126