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 * %sccs.include.redist.c% 11 * 12 * @(#)dca.c 7.4 (Berkeley) 06/18/92 13 */ 14 15 #ifdef DCACONSOLE 16 #include "sys/param.h" 17 #include "hp/dev/dcareg.h" 18 #include "../include/cpu.h" 19 #include "hp/dev/cons.h" 20 21 struct dcadevice *dcacnaddr = 0; 22 23 dcaprobe(cp) 24 struct consdev *cp; 25 { 26 register struct dcadevice *dca; 27 28 dcacnaddr = (struct dcadevice *) sctoaddr(CONSCODE); 29 if (badaddr((char *)dcacnaddr)) { 30 cp->cn_pri = CN_DEAD; 31 return; 32 } 33 #ifdef FORCEDCACONSOLE 34 cp->cn_pri = CN_REMOTE; 35 #else 36 dca = dcacnaddr; 37 switch (dca->dca_id) { 38 case DCAID0: 39 case DCAID1: 40 cp->cn_pri = CN_NORMAL; 41 break; 42 case DCAREMID0: 43 case DCAREMID1: 44 cp->cn_pri = CN_REMOTE; 45 break; 46 default: 47 cp->cn_pri = CN_DEAD; 48 break; 49 } 50 #endif 51 } 52 53 dcainit(cp) 54 struct consdev *cp; 55 { 56 register struct dcadevice *dca = dcacnaddr; 57 58 dca->dca_reset = 0xFF; 59 DELAY(100); 60 dca->dca_ic = 0; 61 dca->dca_cfcr = CFCR_DLAB; 62 dca->dca_data = DCABRD(9600) & 0xFF; 63 dca->dca_ier = DCABRD(9600) >> 8; 64 dca->dca_cfcr = CFCR_8BITS; 65 } 66 67 #ifndef SMALL 68 dcagetchar() 69 { 70 register struct dcadevice *dca = dcacnaddr; 71 short stat; 72 int c; 73 74 if (((stat = dca->dca_lsr) & LSR_RXRDY) == 0) 75 return(0); 76 c = dca->dca_data; 77 return(c); 78 } 79 #else 80 dcagetchar() 81 { 82 return(0); 83 } 84 #endif 85 86 dcaputchar(c) 87 register int c; 88 { 89 register struct dcadevice *dca = dcacnaddr; 90 register int timo; 91 short stat; 92 93 /* wait a reasonable time for the transmitter to come ready */ 94 timo = 50000; 95 while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo) 96 ; 97 dca->dca_data = c; 98 /* wait for this transmission to complete */ 99 timo = 1000000; 100 while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo) 101 ; 102 } 103 #endif 104