1*42379Smckusick /* 2*42379Smckusick * Copyright (c) 1988 University of Utah. 3*42379Smckusick * Copyright (c) 1990 The Regents of the University of California. 4*42379Smckusick * All rights reserved. 5*42379Smckusick * 6*42379Smckusick * This code is derived from software contributed to Berkeley by 7*42379Smckusick * the Systems Programming Group of the University of Utah Computer 8*42379Smckusick * Science Department. 9*42379Smckusick * 10*42379Smckusick * %sccs.include.redist.c% 11*42379Smckusick * 12*42379Smckusick * @(#)dcm.c 7.1 (Berkeley) 05/25/90 13*42379Smckusick */ 14*42379Smckusick 15*42379Smckusick #ifdef DCMCONSOLE 16*42379Smckusick #include "param.h" 17*42379Smckusick #include "machine/cons.h" 18*42379Smckusick #include "../hpdev/device.h" 19*42379Smckusick #include "../hpdev/dcmreg.h" 20*42379Smckusick 21*42379Smckusick #define CONSPORT (1) 22*42379Smckusick struct dcmdevice *CONSOLE = NULL; 23*42379Smckusick 24*42379Smckusick dcmprobe(cp) 25*42379Smckusick struct consdev *cp; 26*42379Smckusick { 27*42379Smckusick extern struct hp_hw sc_table[]; 28*42379Smckusick register struct hp_hw *hw; 29*42379Smckusick register struct dcmdevice *dcm; 30*42379Smckusick 31*42379Smckusick for (hw = sc_table; hw < &sc_table[MAX_CTLR]; hw++) 32*42379Smckusick if (hw->hw_type == COMMDCM && !badaddr((caddr_t)hw->hw_addr)) 33*42379Smckusick break; 34*42379Smckusick if (hw->hw_type != COMMDCM) { 35*42379Smckusick cp->cn_pri = CN_DEAD; 36*42379Smckusick return; 37*42379Smckusick } 38*42379Smckusick CONSOLE = (struct dcmdevice *)hw->hw_addr; 39*42379Smckusick 40*42379Smckusick dcm = CONSOLE; 41*42379Smckusick switch (dcm->dcm_rsid) { 42*42379Smckusick case DCMID: 43*42379Smckusick cp->cn_pri = CN_NORMAL; 44*42379Smckusick break; 45*42379Smckusick case DCMID|DCMCON: 46*42379Smckusick cp->cn_pri = CN_REMOTE; 47*42379Smckusick break; 48*42379Smckusick default: 49*42379Smckusick cp->cn_pri = CN_DEAD; 50*42379Smckusick break; 51*42379Smckusick } 52*42379Smckusick } 53*42379Smckusick 54*42379Smckusick dcminit(cp) 55*42379Smckusick struct consdev *cp; 56*42379Smckusick { 57*42379Smckusick register struct dcmdevice *dcm = CONSOLE; 58*42379Smckusick register int port = CONSPORT; 59*42379Smckusick 60*42379Smckusick dcm->dcm_ic = IC_ID; 61*42379Smckusick while (dcm->dcm_thead[port].ptr != dcm->dcm_ttail[port].ptr) 62*42379Smckusick ; 63*42379Smckusick dcm->dcm_data[port].dcm_baud = BR_9600; 64*42379Smckusick dcm->dcm_data[port].dcm_conf = LC_8BITS | LC_1STOP; 65*42379Smckusick SEM_LOCK(dcm); 66*42379Smckusick dcm->dcm_cmdtab[port].dcm_data |= CT_CON; 67*42379Smckusick dcm->dcm_cr |= (1 << port); 68*42379Smckusick SEM_UNLOCK(dcm); 69*42379Smckusick DELAY(15000); 70*42379Smckusick } 71*42379Smckusick 72*42379Smckusick #ifndef SMALL 73*42379Smckusick dcmgetchar() 74*42379Smckusick { 75*42379Smckusick register struct dcmdevice *dcm = CONSOLE; 76*42379Smckusick register struct dcmrfifo *fifo; 77*42379Smckusick register struct dcmpreg *pp; 78*42379Smckusick register unsigned head; 79*42379Smckusick int c, stat, port; 80*42379Smckusick 81*42379Smckusick port = CONSPORT; 82*42379Smckusick pp = dcm_preg(dcm, port); 83*42379Smckusick head = pp->r_head & RX_MASK; 84*42379Smckusick if (head == (pp->r_tail & RX_MASK)) 85*42379Smckusick return(0); 86*42379Smckusick fifo = &dcm->dcm_rfifos[3-port][head>>1]; 87*42379Smckusick c = fifo->data_char; 88*42379Smckusick stat = fifo->data_stat; 89*42379Smckusick pp->r_head = (head + 2) & RX_MASK; 90*42379Smckusick SEM_LOCK(dcm); 91*42379Smckusick stat = dcm->dcm_iir; 92*42379Smckusick SEM_UNLOCK(dcm); 93*42379Smckusick return(c); 94*42379Smckusick } 95*42379Smckusick #else 96*42379Smckusick dcmgetchar() 97*42379Smckusick { 98*42379Smckusick return(0); 99*42379Smckusick } 100*42379Smckusick #endif 101*42379Smckusick 102*42379Smckusick dcmputchar(c) 103*42379Smckusick register int c; 104*42379Smckusick { 105*42379Smckusick register struct dcmdevice *dcm = CONSOLE; 106*42379Smckusick register struct dcmpreg *pp; 107*42379Smckusick register int timo; 108*42379Smckusick unsigned tail; 109*42379Smckusick int port, stat; 110*42379Smckusick 111*42379Smckusick port = CONSPORT; 112*42379Smckusick pp = dcm_preg(dcm, port); 113*42379Smckusick tail = pp->t_tail & TX_MASK; 114*42379Smckusick timo = 50000; 115*42379Smckusick while (tail != (pp->t_head & TX_MASK) && --timo) 116*42379Smckusick ; 117*42379Smckusick dcm->dcm_tfifos[3-port][tail].data_char = c; 118*42379Smckusick pp->t_tail = tail = (tail + 1) & TX_MASK; 119*42379Smckusick SEM_LOCK(dcm); 120*42379Smckusick dcm->dcm_cmdtab[port].dcm_data |= CT_TX; 121*42379Smckusick dcm->dcm_cr |= (1 << port); 122*42379Smckusick SEM_UNLOCK(dcm); 123*42379Smckusick timo = 1000000; 124*42379Smckusick while (tail != (pp->t_head & TX_MASK) && --timo) 125*42379Smckusick ; 126*42379Smckusick SEM_LOCK(dcm); 127*42379Smckusick stat = dcm->dcm_iir; 128*42379Smckusick SEM_UNLOCK(dcm); 129*42379Smckusick } 130*42379Smckusick #endif 131