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

  1. /*
  2.  * Copyright (c) 1988 University of Utah.
  3.  * Copyright (c) 1990 The Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * This code is derived from software contributed to Berkeley by
  7.  * the Systems Programming Group of the University of Utah Computer
  8.  * Science Department.
  9.  *
  10.  * Redistribution and use in source and binary forms, with or without
  11.  * modification, are permitted provided that the following conditions
  12.  * are met:
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in the
  17.  *    documentation and/or other materials provided with the distribution.
  18.  * 3. All advertising materials mentioning features or use of this software
  19.  *    must display the following acknowledgement:
  20.  *    This product includes software developed by the University of
  21.  *    California, Berkeley and its contributors.
  22.  * 4. Neither the name of the University nor the names of its contributors
  23.  *    may be used to endorse or promote products derived from this software
  24.  *    without specific prior written permission.
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  27.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  30.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36.  * SUCH DAMAGE.
  37.  *
  38.  *    @(#)dcm.c    7.3 (Berkeley) 5/7/91
  39.  */
  40.  
  41. #ifdef DCMCONSOLE
  42. #include "sys/param.h"
  43. #include "../hp300/cons.h"
  44. #include "../dev/device.h"
  45. #include "../dev/dcmreg.h"
  46.  
  47. struct dcmdevice *dcmcnaddr = NULL;
  48.  
  49. dcmprobe(cp)
  50.     struct consdev *cp;
  51. {
  52.     extern struct hp_hw sc_table[];
  53.     register struct hp_hw *hw;
  54.     register struct dcmdevice *dcm;
  55.  
  56.     for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++)
  57.             if (HW_ISDEV(hw, D_COMMDCM) && !badaddr((caddr_t)hw->hw_kva))
  58.             break;
  59.     if (!HW_ISDEV(hw, D_COMMDCM)) {
  60.         cp->cn_pri = CN_DEAD;
  61.         return;
  62.     }
  63.     dcmcnaddr = (struct dcmdevice *) hw->hw_kva;
  64.  
  65.     dcm = dcmcnaddr;
  66.     switch (dcm->dcm_rsid) {
  67.     case DCMID:
  68.         cp->cn_pri = CN_NORMAL;
  69.         break;
  70.     case DCMID|DCMCON:
  71.         cp->cn_pri = CN_REMOTE;
  72.         break;
  73.     default:
  74.         cp->cn_pri = CN_DEAD;
  75.         break;
  76.     }
  77. }
  78.  
  79. dcminit(cp)
  80.     struct consdev *cp;
  81. {
  82.     register struct dcmdevice *dcm = dcmcnaddr;
  83.     register int port = CONUNIT;
  84.  
  85.     dcm->dcm_ic = IC_ID;
  86.     while (dcm->dcm_thead[port].ptr != dcm->dcm_ttail[port].ptr)
  87.         ;
  88.     dcm->dcm_data[port].dcm_baud = BR_9600;
  89.     dcm->dcm_data[port].dcm_conf = LC_8BITS | LC_1STOP;
  90.     SEM_LOCK(dcm);
  91.     dcm->dcm_cmdtab[port].dcm_data |= CT_CON;
  92.     dcm->dcm_cr |= (1 << port);
  93.     SEM_UNLOCK(dcm);
  94.     DELAY(15000);
  95. }
  96.  
  97. #ifndef SMALL
  98. dcmgetchar()
  99. {
  100.     register struct dcmdevice *dcm = dcmcnaddr;
  101.     register struct dcmrfifo *fifo;
  102.     register struct dcmpreg *pp;
  103.     register unsigned head;
  104.     int c, stat, port;
  105.  
  106.     port = CONUNIT;
  107.     pp = dcm_preg(dcm, port);
  108.     head = pp->r_head & RX_MASK;
  109.     if (head == (pp->r_tail & RX_MASK))
  110.         return(0);
  111.     fifo = &dcm->dcm_rfifos[3-port][head>>1];
  112.     c = fifo->data_char;
  113.     stat = fifo->data_stat;
  114.     pp->r_head = (head + 2) & RX_MASK;
  115.     SEM_LOCK(dcm);
  116.     stat = dcm->dcm_iir;
  117.     SEM_UNLOCK(dcm);
  118.     return(c);
  119. }
  120. #else
  121. dcmgetchar()
  122. {
  123.     return(0);
  124. }
  125. #endif
  126.  
  127. dcmputchar(c)
  128.     register int c;
  129. {
  130.     register struct dcmdevice *dcm = dcmcnaddr;
  131.     register struct dcmpreg *pp;
  132.     register int timo;
  133.     unsigned tail;
  134.     int port, stat;
  135.  
  136.     port = CONUNIT;
  137.     pp = dcm_preg(dcm, port);
  138.     tail = pp->t_tail & TX_MASK;
  139.     timo = 50000;
  140.     while (tail != (pp->t_head & TX_MASK) && --timo)
  141.         ;
  142.     dcm->dcm_tfifos[3-port][tail].data_char = c;
  143.     pp->t_tail = tail = (tail + 1) & TX_MASK;
  144.     SEM_LOCK(dcm);
  145.     dcm->dcm_cmdtab[port].dcm_data |= CT_TX;
  146.     dcm->dcm_cr |= (1 << port);
  147.     SEM_UNLOCK(dcm);
  148.     timo = 1000000;
  149.     while (tail != (pp->t_head & TX_MASK) && --timo)
  150.         ;
  151.     SEM_LOCK(dcm);
  152.     stat = dcm->dcm_iir;
  153.     SEM_UNLOCK(dcm);
  154. }
  155. #endif
  156.