|
|
1.1 ! root 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 is only permitted until one year after the first shipment ! 11: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 12: * binary forms are permitted provided that: (1) source distributions retain ! 13: * this entire copyright notice and comment, and (2) distributions including ! 14: * binaries display the following acknowledgement: This product includes ! 15: * software developed by the University of California, Berkeley and its ! 16: * contributors'' in the documentation or other materials provided with the ! 17: * distribution and in all advertising materials mentioning features or use ! 18: * of this software. Neither the name of the University nor the names of ! 19: * its contributors may be used to endorse or promote products derived from ! 20: * this software without specific prior written permission. ! 21: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 22: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 23: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 24: * ! 25: * @(#)dcm.c 7.1 (Berkeley) 5/25/90 ! 26: */ ! 27: ! 28: #ifdef DCMCONSOLE ! 29: #include "param.h" ! 30: #include "machine/cons.h" ! 31: #include "../hpdev/device.h" ! 32: #include "../hpdev/dcmreg.h" ! 33: ! 34: #define CONSPORT (1) ! 35: struct dcmdevice *CONSOLE = NULL; ! 36: ! 37: dcmprobe(cp) ! 38: struct consdev *cp; ! 39: { ! 40: extern struct hp_hw sc_table[]; ! 41: register struct hp_hw *hw; ! 42: register struct dcmdevice *dcm; ! 43: ! 44: for (hw = sc_table; hw < &sc_table[MAX_CTLR]; hw++) ! 45: if (hw->hw_type == COMMDCM && !badaddr((caddr_t)hw->hw_addr)) ! 46: break; ! 47: if (hw->hw_type != COMMDCM) { ! 48: cp->cn_pri = CN_DEAD; ! 49: return; ! 50: } ! 51: CONSOLE = (struct dcmdevice *)hw->hw_addr; ! 52: ! 53: dcm = CONSOLE; ! 54: switch (dcm->dcm_rsid) { ! 55: case DCMID: ! 56: cp->cn_pri = CN_NORMAL; ! 57: break; ! 58: case DCMID|DCMCON: ! 59: cp->cn_pri = CN_REMOTE; ! 60: break; ! 61: default: ! 62: cp->cn_pri = CN_DEAD; ! 63: break; ! 64: } ! 65: } ! 66: ! 67: dcminit(cp) ! 68: struct consdev *cp; ! 69: { ! 70: register struct dcmdevice *dcm = CONSOLE; ! 71: register int port = CONSPORT; ! 72: ! 73: dcm->dcm_ic = IC_ID; ! 74: while (dcm->dcm_thead[port].ptr != dcm->dcm_ttail[port].ptr) ! 75: ; ! 76: dcm->dcm_data[port].dcm_baud = BR_9600; ! 77: dcm->dcm_data[port].dcm_conf = LC_8BITS | LC_1STOP; ! 78: SEM_LOCK(dcm); ! 79: dcm->dcm_cmdtab[port].dcm_data |= CT_CON; ! 80: dcm->dcm_cr |= (1 << port); ! 81: SEM_UNLOCK(dcm); ! 82: DELAY(15000); ! 83: } ! 84: ! 85: #ifndef SMALL ! 86: dcmgetchar() ! 87: { ! 88: register struct dcmdevice *dcm = CONSOLE; ! 89: register struct dcmrfifo *fifo; ! 90: register struct dcmpreg *pp; ! 91: register unsigned head; ! 92: int c, stat, port; ! 93: ! 94: port = CONSPORT; ! 95: pp = dcm_preg(dcm, port); ! 96: head = pp->r_head & RX_MASK; ! 97: if (head == (pp->r_tail & RX_MASK)) ! 98: return(0); ! 99: fifo = &dcm->dcm_rfifos[3-port][head>>1]; ! 100: c = fifo->data_char; ! 101: stat = fifo->data_stat; ! 102: pp->r_head = (head + 2) & RX_MASK; ! 103: SEM_LOCK(dcm); ! 104: stat = dcm->dcm_iir; ! 105: SEM_UNLOCK(dcm); ! 106: return(c); ! 107: } ! 108: #else ! 109: dcmgetchar() ! 110: { ! 111: return(0); ! 112: } ! 113: #endif ! 114: ! 115: dcmputchar(c) ! 116: register int c; ! 117: { ! 118: register struct dcmdevice *dcm = CONSOLE; ! 119: register struct dcmpreg *pp; ! 120: register int timo; ! 121: unsigned tail; ! 122: int port, stat; ! 123: ! 124: port = CONSPORT; ! 125: pp = dcm_preg(dcm, port); ! 126: tail = pp->t_tail & TX_MASK; ! 127: timo = 50000; ! 128: while (tail != (pp->t_head & TX_MASK) && --timo) ! 129: ; ! 130: dcm->dcm_tfifos[3-port][tail].data_char = c; ! 131: pp->t_tail = tail = (tail + 1) & TX_MASK; ! 132: SEM_LOCK(dcm); ! 133: dcm->dcm_cmdtab[port].dcm_data |= CT_TX; ! 134: dcm->dcm_cr |= (1 << port); ! 135: SEM_UNLOCK(dcm); ! 136: timo = 1000000; ! 137: while (tail != (pp->t_head & TX_MASK) && --timo) ! 138: ; ! 139: SEM_LOCK(dcm); ! 140: stat = dcm->dcm_iir; ! 141: SEM_UNLOCK(dcm); ! 142: } ! 143: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.