141488Smckusick /* 241488Smckusick * Copyright (c) 1988 University of Utah. 341488Smckusick * Copyright (c) 1990 The Regents of the University of California. 441488Smckusick * All rights reserved. 541488Smckusick * 641488Smckusick * This code is derived from software contributed to Berkeley by 741488Smckusick * the Systems Programming Group of the University of Utah Computer 841488Smckusick * Science Department. 941488Smckusick * 1041488Smckusick * %sccs.include.redist.c% 1141488Smckusick * 12*45790Sbostic * @(#)dca.c 7.2 (Berkeley) 12/16/90 1341488Smckusick */ 1441488Smckusick 1541488Smckusick #ifdef DCACONSOLE 16*45790Sbostic #include "sys/param.h" 17*45790Sbostic #include "../dev/dcareg.h" 18*45790Sbostic #include "../include/cpu.h" 19*45790Sbostic #include "../hp300/cons.h" 2041488Smckusick 2141488Smckusick #define CONSDEV (0) 2241488Smckusick #define CONSOLE ((struct dcadevice *)(EXTIOBASE + (9 * IOCARDSIZE))) 2341488Smckusick 2441488Smckusick dcaprobe(cp) 2541488Smckusick struct consdev *cp; 2641488Smckusick { 2741488Smckusick register struct dcadevice *dca = CONSOLE; 2841488Smckusick 2941488Smckusick if (badaddr((char *)CONSOLE)) { 3041488Smckusick cp->cn_pri = CN_DEAD; 3141488Smckusick return; 3241488Smckusick } 3341488Smckusick switch (dca->dca_irid) { 3441488Smckusick case DCAID0: 3541488Smckusick case DCAID1: 3641488Smckusick cp->cn_pri = CN_NORMAL; 3741488Smckusick break; 3841488Smckusick case DCAREMID0: 3941488Smckusick case DCAREMID1: 4041488Smckusick cp->cn_pri = CN_REMOTE; 4141488Smckusick break; 4241488Smckusick default: 4341488Smckusick cp->cn_pri = CN_DEAD; 4441488Smckusick break; 4541488Smckusick } 4641488Smckusick } 4741488Smckusick 4841488Smckusick dcainit(cp) 4941488Smckusick struct consdev *cp; 5041488Smckusick { 5141488Smckusick register struct dcadevice *dca = CONSOLE; 5241488Smckusick 5341488Smckusick dca->dca_irid = 0xFF; 5441488Smckusick DELAY(100); 5541488Smckusick dca->dca_ic = 0; 5641488Smckusick dca->dca_cfcr = CFCR_DLAB; 5741488Smckusick dca->dca_data = DCABRD(9600) & 0xFF; 5841488Smckusick dca->dca_ier = DCABRD(9600) >> 8; 5941488Smckusick dca->dca_cfcr = CFCR_8BITS; 6041488Smckusick } 6141488Smckusick 6241488Smckusick #ifndef SMALL 6341488Smckusick dcagetchar() 6441488Smckusick { 6541488Smckusick register struct dcadevice *dca = CONSOLE; 6641488Smckusick short stat; 6741488Smckusick int c; 6841488Smckusick 6941488Smckusick if (((stat = dca->dca_lsr) & LSR_RXRDY) == 0) 7041488Smckusick return(0); 7141488Smckusick c = dca->dca_data; 7241488Smckusick return(c); 7341488Smckusick } 7441488Smckusick #else 7541488Smckusick dcagetchar() 7641488Smckusick { 7741488Smckusick return(0); 7841488Smckusick } 7941488Smckusick #endif 8041488Smckusick 8141488Smckusick dcaputchar(c) 8241488Smckusick register int c; 8341488Smckusick { 8441488Smckusick register struct dcadevice *dca = CONSOLE; 8541488Smckusick register int timo; 8641488Smckusick short stat; 8741488Smckusick 8841488Smckusick /* wait a reasonable time for the transmitter to come ready */ 8941488Smckusick timo = 50000; 9041488Smckusick while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo) 9141488Smckusick ; 9241488Smckusick dca->dca_data = c; 9341488Smckusick /* wait for this transmission to complete */ 9441488Smckusick timo = 1000000; 9541488Smckusick while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo) 9641488Smckusick ; 9741488Smckusick } 9841488Smckusick #endif 99