hil_gpib.c revision 1.12
11.12Schs/* $NetBSD: hil_gpib.c,v 1.12 2012/10/27 17:18:16 chs Exp $ */ 21.2Slukem 31.2Slukem#include <sys/cdefs.h> 41.12Schs__KERNEL_RCSID(0, "$NetBSD: hil_gpib.c,v 1.12 2012/10/27 17:18:16 chs 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 gpib_chipset_tag_t sc_ic; 301.1Sgmcgarry gpib_handle_t sc_hdl; 311.1Sgmcgarry 321.1Sgmcgarry int sc_address; /* GPIB address */ 331.1Sgmcgarry int sc_flags; 341.3Sperry#define HILF_ALIVE 0x01 351.3Sperry#define HILF_OPEN 0x02 361.1Sgmcgarry#define HILF_UIO 0x04 371.1Sgmcgarry#define HILF_TIMO 0x08 381.1Sgmcgarry#define HILF_DELAY 0x10 391.1Sgmcgarry}; 401.1Sgmcgarry 411.11Sceggerint hilmatch(device_t, cfdata_t, void *); 421.11Sceggervoid hilattach(device_t, device_t, void *); 431.1Sgmcgarry 441.1Sgmcgarryconst struct cfattach hil_ca = { 451.1Sgmcgarry sizeof(struct hil_softc), hilmatch, hilattach, 461.1Sgmcgarry}; 471.1Sgmcgarry 481.1Sgmcgarryvoid hilcallback(void *, int); 491.1Sgmcgarryvoid hilstart(void *); 501.1Sgmcgarry 511.1Sgmcgarryint 521.11Sceggerhilmatch(device_t parent, cfdata_t match, void *aux) 531.1Sgmcgarry{ 541.1Sgmcgarry struct gpib_attach_args *ga = aux; 551.1Sgmcgarry u_int8_t *cmd = "SE;"; 561.1Sgmcgarry u_int8_t stat; 571.1Sgmcgarry 581.1Sgmcgarry if (gpibsend(ga->ga_ic, ga->ga_address, -1, cmd, 3) != 3) 591.1Sgmcgarry return (0); 601.1Sgmcgarry if (gpibrecv(ga->ga_ic, ga->ga_address, -1, &stat, 1) != 1) 611.1Sgmcgarry return (0); 621.1Sgmcgarry printf("hilmatch: enable status byte 0x%x\n", stat); 631.1Sgmcgarry return (1); 641.1Sgmcgarry} 651.1Sgmcgarry 661.1Sgmcgarryvoid 671.11Sceggerhilattach(device_t parent, device_t self, void *aux) 681.1Sgmcgarry{ 691.6Sthorpej struct hil_softc *sc = device_private(self); 701.1Sgmcgarry struct gpib_attach_args *ga = aux; 711.1Sgmcgarry 721.1Sgmcgarry printf("\n"); 731.1Sgmcgarry 741.1Sgmcgarry sc->sc_ic = ga->ga_ic; 751.1Sgmcgarry sc->sc_address = ga->ga_address; 761.1Sgmcgarry 771.1Sgmcgarry if (gpibregister(sc->sc_ic, sc->sc_address, hilcallback, sc, 781.1Sgmcgarry &sc->sc_hdl)) { 791.12Schs aprint_error_dev(self, "can't register callback\n"); 801.1Sgmcgarry return; 811.1Sgmcgarry } 821.1Sgmcgarry 831.1Sgmcgarry sc->sc_flags = HILF_ALIVE; 841.1Sgmcgarry} 851.1Sgmcgarry 861.1Sgmcgarryvoid 871.8Sdslhilcallback(void *v, int action) 881.1Sgmcgarry{ 891.1Sgmcgarry struct hil_softc *sc = v; 901.1Sgmcgarry 911.1Sgmcgarry DPRINTF(HDB_FOLLOW, ("hilcallback: v=%p, action=%d\n", v, action)); 921.1Sgmcgarry 931.1Sgmcgarry switch (action) { 941.1Sgmcgarry case GPIBCBF_START: 951.1Sgmcgarry hilstart(sc); 961.1Sgmcgarry case GPIBCBF_INTR: 971.1Sgmcgarry /* no-op */ 981.1Sgmcgarry break; 991.1Sgmcgarry#ifdef DEBUG 1001.1Sgmcgarry default: 1011.1Sgmcgarry DPRINTF(HDB_FOLLOW, ("hilcallback: unknown action %d\n", 1021.1Sgmcgarry action)); 1031.1Sgmcgarry break; 1041.1Sgmcgarry#endif 1051.1Sgmcgarry } 1061.1Sgmcgarry} 1071.1Sgmcgarry 1081.1Sgmcgarryvoid 1091.8Sdslhilstart(void *v) 1101.1Sgmcgarry{ 1111.1Sgmcgarry struct hil_softc *sc = v; 1121.1Sgmcgarry 1131.12Schs DPRINTF(HDB_FOLLOW, ("hilstart\n")); 1141.1Sgmcgarry 1151.1Sgmcgarry sc->sc_flags &= ~HILF_DELAY; 1161.1Sgmcgarry} 117