xref: /csrg-svn/sys/hp300/stand/dca.c (revision 63163)
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()6841488Smckusick dcagetchar()
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()8041488Smckusick dcagetchar()
8141488Smckusick {
8241488Smckusick 	return(0);
8341488Smckusick }
8441488Smckusick #endif
8541488Smckusick 
dcaputchar(c)8641488Smckusick dcaputchar(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