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