xref: /csrg-svn/sys/hp300/stand/dca.c (revision 45790)
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