xref: /original-bsd/sys/hp300/stand/dca.c (revision 3705696b)
1 /*
2  * Copyright (c) 1988 University of Utah.
3  * Copyright (c) 1990, 1993
4  *	The Regents of the University of California.  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	8.1 (Berkeley) 06/10/93
13  */
14 
15 #ifdef DCACONSOLE
16 #include <sys/param.h>
17 #include <hp/dev/dcareg.h>
18 #include <machine/cpu.h>
19 #include <hp/dev/cons.h>
20 
21 struct dcadevice *dcacnaddr = 0;
22 
23 dcaprobe(cp)
24 	struct consdev *cp;
25 {
26 	register struct dcadevice *dca;
27 
28 	dcacnaddr = (struct dcadevice *) sctoaddr(CONSCODE);
29 	if (badaddr((char *)dcacnaddr)) {
30 		cp->cn_pri = CN_DEAD;
31 		return;
32 	}
33 #ifdef FORCEDCACONSOLE
34 	cp->cn_pri = CN_REMOTE;
35 #else
36 	dca = dcacnaddr;
37 	switch (dca->dca_id) {
38 	case DCAID0:
39 	case DCAID1:
40 		cp->cn_pri = CN_NORMAL;
41 		break;
42 	case DCAREMID0:
43 	case DCAREMID1:
44 		cp->cn_pri = CN_REMOTE;
45 		break;
46 	default:
47 		cp->cn_pri = CN_DEAD;
48 		break;
49 	}
50 #endif
51 }
52 
53 dcainit(cp)
54 	struct consdev *cp;
55 {
56 	register struct dcadevice *dca = dcacnaddr;
57 
58 	dca->dca_reset = 0xFF;
59 	DELAY(100);
60 	dca->dca_ic = 0;
61 	dca->dca_cfcr = CFCR_DLAB;
62 	dca->dca_data = DCABRD(9600) & 0xFF;
63 	dca->dca_ier = DCABRD(9600) >> 8;
64 	dca->dca_cfcr = CFCR_8BITS;
65 }
66 
67 #ifndef SMALL
68 dcagetchar()
69 {
70 	register struct dcadevice *dca = dcacnaddr;
71 	short stat;
72 	int c;
73 
74 	if (((stat = dca->dca_lsr) & LSR_RXRDY) == 0)
75 		return(0);
76 	c = dca->dca_data;
77 	return(c);
78 }
79 #else
80 dcagetchar()
81 {
82 	return(0);
83 }
84 #endif
85 
86 dcaputchar(c)
87 	register int c;
88 {
89 	register struct dcadevice *dca = dcacnaddr;
90 	register int timo;
91 	short stat;
92 
93 	/* wait a reasonable time for the transmitter to come ready */
94 	timo = 50000;
95 	while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo)
96 		;
97 	dca->dca_data = c;
98 	/* wait for this transmission to complete */
99 	timo = 1000000;
100 	while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo)
101 		;
102 }
103 #endif
104