141488Smckusick /* 241488Smckusick * Copyright (c) 1988 University of Utah. 3*63163Sbostic * Copyright (c) 1990, 1993 4*63163Sbostic * The Regents of the University of California. 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*63163Sbostic * @(#)dca.c 8.1 (Berkeley) 06/10/93 1341488Smckusick */ 1441488Smckusick 1541488Smckusick #ifdef DCACONSOLE 1656510Sbostic #include <sys/param.h> 1756510Sbostic #include <hp/dev/dcareg.h> 1856510Sbostic #include <machine/cpu.h> 1956510Sbostic #include <hp/dev/cons.h> 2041488Smckusick 2149334Shibler struct dcadevice *dcacnaddr = 0; 2241488Smckusick 2341488Smckusick dcaprobe(cp) 2441488Smckusick struct consdev *cp; 2541488Smckusick { 2649334Shibler register struct dcadevice *dca; 2741488Smckusick 2849334Shibler dcacnaddr = (struct dcadevice *) sctoaddr(CONSCODE); 2949334Shibler if (badaddr((char *)dcacnaddr)) { 3041488Smckusick cp->cn_pri = CN_DEAD; 3141488Smckusick return; 3241488Smckusick } 3354073Shibler #ifdef FORCEDCACONSOLE 3454073Shibler cp->cn_pri = CN_REMOTE; 3554073Shibler #else 3649334Shibler dca = dcacnaddr; 3754073Shibler switch (dca->dca_id) { 3841488Smckusick case DCAID0: 3941488Smckusick case DCAID1: 4041488Smckusick cp->cn_pri = CN_NORMAL; 4141488Smckusick break; 4241488Smckusick case DCAREMID0: 4341488Smckusick case DCAREMID1: 4441488Smckusick cp->cn_pri = CN_REMOTE; 4541488Smckusick break; 4641488Smckusick default: 4741488Smckusick cp->cn_pri = CN_DEAD; 4841488Smckusick break; 4941488Smckusick } 5054073Shibler #endif 5141488Smckusick } 5241488Smckusick 5341488Smckusick dcainit(cp) 5441488Smckusick struct consdev *cp; 5541488Smckusick { 5649334Shibler register struct dcadevice *dca = dcacnaddr; 5741488Smckusick 5854073Shibler dca->dca_reset = 0xFF; 5941488Smckusick DELAY(100); 6041488Smckusick dca->dca_ic = 0; 6141488Smckusick dca->dca_cfcr = CFCR_DLAB; 6241488Smckusick dca->dca_data = DCABRD(9600) & 0xFF; 6341488Smckusick dca->dca_ier = DCABRD(9600) >> 8; 6441488Smckusick dca->dca_cfcr = CFCR_8BITS; 6541488Smckusick } 6641488Smckusick 6741488Smckusick #ifndef SMALL dcagetchar()6841488Smckusickdcagetchar() 6941488Smckusick { 7049334Shibler register struct dcadevice *dca = dcacnaddr; 7141488Smckusick short stat; 7241488Smckusick int c; 7341488Smckusick 7441488Smckusick if (((stat = dca->dca_lsr) & LSR_RXRDY) == 0) 7541488Smckusick return(0); 7641488Smckusick c = dca->dca_data; 7741488Smckusick return(c); 7841488Smckusick } 7941488Smckusick #else dcagetchar()8041488Smckusickdcagetchar() 8141488Smckusick { 8241488Smckusick return(0); 8341488Smckusick } 8441488Smckusick #endif 8541488Smckusick dcaputchar(c)8641488Smckusickdcaputchar(c) 8741488Smckusick register int c; 8841488Smckusick { 8949334Shibler register struct dcadevice *dca = dcacnaddr; 9041488Smckusick register int timo; 9141488Smckusick short stat; 9241488Smckusick 9341488Smckusick /* wait a reasonable time for the transmitter to come ready */ 9441488Smckusick timo = 50000; 9541488Smckusick while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo) 9641488Smckusick ; 9741488Smckusick dca->dca_data = c; 9841488Smckusick /* wait for this transmission to complete */ 9941488Smckusick timo = 1000000; 10041488Smckusick while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo) 10141488Smckusick ; 10241488Smckusick } 10341488Smckusick #endif 104