hil_gpib.c revision 1.8
11.8Sdsl/* $NetBSD: hil_gpib.c,v 1.8 2009/03/14 15:36:17 dsl Exp $ */ 21.2Slukem 31.2Slukem#include <sys/cdefs.h> 41.8Sdsl__KERNEL_RCSID(0, "$NetBSD: hil_gpib.c,v 1.8 2009/03/14 15:36:17 dsl 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.8Sdslhilmatch(struct device *parent, struct cfdata *match, void *aux) 541.1Sgmcgarry{ 551.1Sgmcgarry struct gpib_attach_args *ga = aux; 561.1Sgmcgarry u_int8_t *cmd = "SE;"; 571.1Sgmcgarry u_int8_t stat; 581.1Sgmcgarry 591.1Sgmcgarry if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3) 601.1Sgmcgarry return (0); 611.1Sgmcgarry if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1) 621.1Sgmcgarry return (0); 631.1Sgmcgarry printf("hilmatch: enable status byte 0x%x\n", stat); 641.1Sgmcgarry return (1); 651.1Sgmcgarry} 661.1Sgmcgarry 671.1Sgmcgarryvoid 681.1Sgmcgarryhilattach(parent, self, aux) 691.1Sgmcgarry struct device *parent, *self; 701.1Sgmcgarry void *aux; 711.1Sgmcgarry{ 721.6Sthorpej struct hil_softc *sc = device_private(self); 731.1Sgmcgarry struct gpib_attach_args *ga = aux; 741.1Sgmcgarry 751.1Sgmcgarry printf("\n"); 761.1Sgmcgarry 771.1Sgmcgarry sc->sc_ic = ga->ga_ic; 781.1Sgmcgarry sc->sc_address = ga->ga_address; 791.1Sgmcgarry 801.1Sgmcgarry if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc, 811.1Sgmcgarry &sc->sc_hdl)) { 821.7Scegger aprint_error_dev(&sc->sc_dev, "can't register callback\n"); 831.1Sgmcgarry return; 841.1Sgmcgarry } 851.1Sgmcgarry 861.1Sgmcgarry sc->sc_flags = HILF_ALIVE; 871.1Sgmcgarry} 881.1Sgmcgarry 891.1Sgmcgarryvoid 901.8Sdslhilcallback(void *v, 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.8Sdslhilstart(void *v) 1131.1Sgmcgarry{ 1141.1Sgmcgarry struct hil_softc *sc = v; 1151.1Sgmcgarry 1161.5Sthorpej DPRINTF(HDB_FOLLOW, ("hilstart(%x)\n", device_unit(&sc->sc_dev))); 1171.1Sgmcgarry 1181.1Sgmcgarry sc->sc_flags &= ~HILF_DELAY; 1191.1Sgmcgarry} 120