1 1.9 christos /* $NetBSD: hpib.c,v 1.9 2007/03/04 05:59:50 christos Exp $ */ 2 1.1 thorpej 3 1.1 thorpej /* 4 1.1 thorpej * Copyright (c) 1982, 1990, 1993 5 1.1 thorpej * The Regents of the University of California. All rights reserved. 6 1.1 thorpej * 7 1.1 thorpej * Redistribution and use in source and binary forms, with or without 8 1.1 thorpej * modification, are permitted provided that the following conditions 9 1.1 thorpej * are met: 10 1.1 thorpej * 1. Redistributions of source code must retain the above copyright 11 1.1 thorpej * notice, this list of conditions and the following disclaimer. 12 1.1 thorpej * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 thorpej * notice, this list of conditions and the following disclaimer in the 14 1.1 thorpej * documentation and/or other materials provided with the distribution. 15 1.3 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 thorpej * may be used to endorse or promote products derived from this software 17 1.1 thorpej * without specific prior written permission. 18 1.1 thorpej * 19 1.1 thorpej * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 thorpej * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 thorpej * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 thorpej * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 thorpej * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 thorpej * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 thorpej * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 thorpej * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 thorpej * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 thorpej * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 thorpej * SUCH DAMAGE. 30 1.1 thorpej * 31 1.1 thorpej * @(#)hpib.c 8.1 (Berkeley) 6/10/93 32 1.1 thorpej */ 33 1.1 thorpej 34 1.1 thorpej /* 35 1.1 thorpej * HPIB driver 36 1.1 thorpej */ 37 1.1 thorpej #include <sys/param.h> 38 1.1 thorpej #include <sys/reboot.h> 39 1.1 thorpej 40 1.1 thorpej #include <lib/libsa/stand.h> 41 1.1 thorpej 42 1.1 thorpej #include <hp300/stand/common/device.h> 43 1.1 thorpej #include <hp300/stand/common/hpibvar.h> 44 1.1 thorpej #include <hp300/stand/common/samachdep.h> 45 1.1 thorpej 46 1.2 thorpej #include <hp300/dev/dioreg.h> 47 1.2 thorpej 48 1.2 thorpej int internalhpib = IIOV(DIO_IHPIBADDR); 49 1.1 thorpej 50 1.1 thorpej struct hpib_softc hpib_softc[NHPIB]; 51 1.1 thorpej 52 1.4 tsutsui void 53 1.5 tsutsui hpibinit(void) 54 1.1 thorpej { 55 1.4 tsutsui struct hp_hw *hw; 56 1.4 tsutsui struct hpib_softc *hs; 57 1.4 tsutsui int i; 58 1.1 thorpej 59 1.1 thorpej i = 0; 60 1.1 thorpej for (hw = sc_table; i < NHPIB && hw < &sc_table[MAXCTLRS]; hw++) { 61 1.1 thorpej if (!HW_ISHPIB(hw)) 62 1.1 thorpej continue; 63 1.1 thorpej hs = &hpib_softc[i]; 64 1.1 thorpej hs->sc_addr = hw->hw_kva; 65 1.1 thorpej if (nhpibinit(i) == 0) 66 1.1 thorpej if (fhpibinit(i) == 0) 67 1.1 thorpej continue; 68 1.1 thorpej if (howto & RB_ASKNAME) 69 1.1 thorpej printf("hpib%d at sc%d\n", i, hw->hw_sc); 70 1.9 christos hw->hw_pa = (void *) i; /* XXX for autoconfig */ 71 1.1 thorpej hs->sc_alive = 1; 72 1.1 thorpej i++; 73 1.1 thorpej } 74 1.1 thorpej } 75 1.1 thorpej 76 1.4 tsutsui int 77 1.5 tsutsui hpibalive(int unit) 78 1.1 thorpej { 79 1.1 thorpej if (unit >= NHPIB || hpib_softc[unit].sc_alive == 0) 80 1.4 tsutsui return 0; 81 1.4 tsutsui return 1; 82 1.1 thorpej } 83 1.1 thorpej 84 1.4 tsutsui int 85 1.5 tsutsui hpibid(int unit, int slave) 86 1.1 thorpej { 87 1.1 thorpej short id; 88 1.1 thorpej int rv; 89 1.1 thorpej 90 1.1 thorpej if (hpib_softc[unit].sc_type == HPIBC) 91 1.7 tsutsui rv = fhpibrecv(unit, 31, slave, (uint8_t *)&id, 2); 92 1.1 thorpej else 93 1.7 tsutsui rv = nhpibrecv(unit, 31, slave, (uint8_t *)&id, 2); 94 1.1 thorpej if (rv != 2) 95 1.4 tsutsui return 0; 96 1.4 tsutsui return id; 97 1.1 thorpej } 98 1.1 thorpej 99 1.4 tsutsui int 100 1.7 tsutsui hpibsend(int unit, int slave, int sec, uint8_t *buf, int cnt) 101 1.1 thorpej { 102 1.5 tsutsui 103 1.1 thorpej if (hpib_softc[unit].sc_type == HPIBC) 104 1.1 thorpej return (fhpibsend(unit, slave, sec, buf, cnt)); 105 1.4 tsutsui return nhpibsend(unit, slave, sec, buf, cnt); 106 1.1 thorpej } 107 1.1 thorpej 108 1.4 tsutsui int 109 1.7 tsutsui hpibrecv(int unit, int slave, int sec, uint8_t *buf, int cnt) 110 1.1 thorpej { 111 1.5 tsutsui 112 1.1 thorpej if (hpib_softc[unit].sc_type == HPIBC) 113 1.1 thorpej return (fhpibrecv(unit, slave, sec, buf, cnt)); 114 1.4 tsutsui return nhpibrecv(unit, slave, sec, buf, cnt); 115 1.1 thorpej } 116 1.1 thorpej 117 1.4 tsutsui int 118 1.5 tsutsui hpibswait(int unit, int slave) 119 1.1 thorpej { 120 1.4 tsutsui int timo = 1000000; 121 1.4 tsutsui int (*poll)(int); 122 1.1 thorpej 123 1.1 thorpej slave = 0x80 >> slave; 124 1.1 thorpej if (hpib_softc[unit].sc_type == HPIBC) 125 1.1 thorpej poll = fhpibppoll; 126 1.1 thorpej else 127 1.1 thorpej poll = nhpibppoll; 128 1.1 thorpej while (((*poll)(unit) & slave) == 0) 129 1.1 thorpej if (--timo == 0) 130 1.1 thorpej break; 131 1.1 thorpej if (timo == 0) 132 1.4 tsutsui return -1; 133 1.4 tsutsui return 0; 134 1.1 thorpej } 135 1.1 thorpej 136 1.4 tsutsui void 137 1.7 tsutsui hpibgo(int unit, int slave, int sec, uint8_t *addr, int count, int flag) 138 1.1 thorpej { 139 1.4 tsutsui 140 1.1 thorpej if (hpib_softc[unit].sc_type == HPIBC) 141 1.1 thorpej if (flag == F_READ) 142 1.1 thorpej fhpibrecv(unit, slave, sec, addr, count); 143 1.1 thorpej else 144 1.1 thorpej fhpibsend(unit, slave, sec, addr, count); 145 1.1 thorpej else 146 1.1 thorpej if (flag == F_READ) 147 1.1 thorpej nhpibrecv(unit, slave, sec, addr, count); 148 1.1 thorpej else 149 1.1 thorpej nhpibsend(unit, slave, sec, addr, count); 150 1.1 thorpej } 151