home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / hp300 / stand / hpib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  4.8 KB  |  183 lines

  1. /*
  2.  * Copyright (c) 1982, 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  *    @(#)hpib.c    7.5 (Berkeley) 5/7/91
  34.  */
  35.  
  36. /*
  37.  * HPIB driver
  38.  */
  39. #include <sys/param.h>
  40. #include <sys/reboot.h>
  41. #include "../dev/device.h"
  42. #include "hpibvar.h"
  43.  
  44. #include "saio.h"
  45. #include "samachdep.h"
  46.  
  47. int    internalhpib = IIOV(0x478000);
  48. int    fhpibppoll(), nhpibppoll();
  49.  
  50. struct    hpib_softc hpib_softc[NHPIB];
  51.  
  52. #define    hpibunit(x)    ((x) >> 3)
  53. #define    hpibslave(x)    ((x) & 7)
  54.  
  55. hpibinit()
  56. {
  57.     extern struct hp_hw sc_table[];
  58.     register struct hp_hw *hw;
  59.     register struct hpib_softc *hs;
  60.     register int i, addr;
  61.     static int first = 1;
  62.     
  63.     i = 0;
  64.     for (hw = sc_table; i < NHPIB && hw < &sc_table[MAXCTLRS]; hw++) {
  65.         if (!HW_ISHPIB(hw))
  66.             continue;
  67.         hs = &hpib_softc[i];
  68.         hs->sc_addr = hw->hw_kva;
  69.         if (nhpibinit(i) == 0)
  70.             if (fhpibinit(i) == 0)
  71.                 continue;
  72.         if (howto & RB_ASKNAME)
  73.             printf("hpib%d at sc%d\n", i, hw->hw_sc);
  74.         /*
  75.          * Adjust devtype on first call.  This routine assumes that
  76.          * adaptor is in the high byte of devtype.
  77.          */
  78.         if (first && ((devtype >> 24) & 0xff) == hw->hw_sc) {
  79.             devtype = (devtype & 0x00ffffff) | (i << 24);
  80.             first = 0;
  81.         }
  82.         hs->sc_alive = 1;
  83.         i++;
  84.     }
  85. }
  86.  
  87. hpibalive(unit)
  88.     register int unit;
  89. {
  90.     unit = hpibunit(unit);
  91.     if (unit >= NHPIB || hpib_softc[unit].sc_alive == 0)
  92.         return (0);
  93.     return (1);
  94. }
  95.  
  96. hpibid(unit)
  97.     register int unit;
  98. {
  99.     register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
  100.     register int slave;
  101.     short id;
  102.  
  103.     slave = hpibslave(unit);
  104.     unit = hpibunit(unit);
  105.     if (hs->sc_type == HPIBC)
  106.         slave = fhpibrecv(unit, 31, slave, &id, 2);
  107.     else
  108.         slave = nhpibrecv(unit, 31, slave, &id, 2);
  109.     if (slave != 2)
  110.         return (0);
  111.     return (id);
  112. }
  113.  
  114. hpibsend(unit, sec, buf, cnt)
  115.     register char *buf;
  116.     register int cnt;
  117. {
  118.     register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
  119.     register int slave;
  120.  
  121.     slave = hpibslave(unit);
  122.     unit = hpibunit(unit);
  123.     if (hs->sc_type == HPIBC)
  124.         return (fhpibsend(unit, slave, sec, buf, cnt));
  125.     else
  126.         return (nhpibsend(unit, slave, sec, buf, cnt));
  127. }
  128.  
  129. hpibrecv(unit, sec, buf, cnt)
  130.     register char *buf;
  131.     register int cnt;
  132. {
  133.     register struct hpib_softc *hs = &hpib_softc[hpibunit(unit)];
  134.     register int slave;
  135.  
  136.     slave = hpibslave(unit);
  137.     unit = hpibunit(unit);
  138.     if (hs->sc_type == HPIBC)
  139.         return (fhpibrecv(unit, slave, sec, buf, cnt));
  140.     else
  141.         return (nhpibrecv(unit, slave, sec, buf, cnt));
  142. }
  143.  
  144. hpibswait(unit)
  145.     register int unit;
  146. {
  147.     register int timo = 1000000;
  148.     register int slave = 0x80 >> hpibslave(unit);
  149.     register int (*poll)();
  150.  
  151.     unit = hpibunit(unit);
  152.     if (hpib_softc[unit].sc_type == HPIBC)
  153.         poll = fhpibppoll;
  154.     else
  155.         poll = nhpibppoll;
  156.     while (((*poll)(unit) & slave) == 0)
  157.         if (--timo == 0)
  158.             break;
  159.     if (timo == 0)
  160.         return (-1);
  161.     return (0);
  162. }
  163.  
  164. hpibgo(unit, sec, addr, count, flag)
  165.     register int unit;
  166.     char *addr;
  167. {
  168.     register int slave;
  169.  
  170.     slave = hpibslave(unit);
  171.     unit = hpibunit(unit);
  172.     if (hpib_softc[unit].sc_type == HPIBC)
  173.         if (flag == F_READ)
  174.             fhpibrecv(unit, slave, sec, addr, count);
  175.         else
  176.             fhpibsend(unit, slave, sec, addr, count);
  177.     else
  178.         if (flag == F_READ)
  179.             nhpibrecv(unit, slave, sec, addr, count);
  180.         else
  181.             nhpibsend(unit, slave, sec, addr, count);
  182. }
  183.