xref: /original-bsd/sys/hp300/stand/dca.c (revision 8b6db294)
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.2 (Berkeley) 12/16/90
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 #define CONSDEV	(0)
22 #define CONSOLE ((struct dcadevice *)(EXTIOBASE + (9 * IOCARDSIZE)))
23 
24 dcaprobe(cp)
25 	struct consdev *cp;
26 {
27 	register struct dcadevice *dca = CONSOLE;
28 
29 	if (badaddr((char *)CONSOLE)) {
30 		cp->cn_pri = CN_DEAD;
31 		return;
32 	}
33 	switch (dca->dca_irid) {
34 	case DCAID0:
35 	case DCAID1:
36 		cp->cn_pri = CN_NORMAL;
37 		break;
38 	case DCAREMID0:
39 	case DCAREMID1:
40 		cp->cn_pri = CN_REMOTE;
41 		break;
42 	default:
43 		cp->cn_pri = CN_DEAD;
44 		break;
45 	}
46 }
47 
48 dcainit(cp)
49 	struct consdev *cp;
50 {
51 	register struct dcadevice *dca = CONSOLE;
52 
53 	dca->dca_irid = 0xFF;
54 	DELAY(100);
55 	dca->dca_ic = 0;
56 	dca->dca_cfcr = CFCR_DLAB;
57 	dca->dca_data = DCABRD(9600) & 0xFF;
58 	dca->dca_ier = DCABRD(9600) >> 8;
59 	dca->dca_cfcr = CFCR_8BITS;
60 }
61 
62 #ifndef SMALL
63 dcagetchar()
64 {
65 	register struct dcadevice *dca = CONSOLE;
66 	short stat;
67 	int c;
68 
69 	if (((stat = dca->dca_lsr) & LSR_RXRDY) == 0)
70 		return(0);
71 	c = dca->dca_data;
72 	return(c);
73 }
74 #else
75 dcagetchar()
76 {
77 	return(0);
78 }
79 #endif
80 
81 dcaputchar(c)
82 	register int c;
83 {
84 	register struct dcadevice *dca = CONSOLE;
85 	register int timo;
86 	short stat;
87 
88 	/* wait a reasonable time for the transmitter to come ready */
89 	timo = 50000;
90 	while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo)
91 		;
92 	dca->dca_data = c;
93 	/* wait for this transmission to complete */
94 	timo = 1000000;
95 	while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo)
96 		;
97 }
98 #endif
99