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