xref: /netbsd/sys/arch/hp300/stand/common/dca.c (revision 6550d01e)
1 /*	$NetBSD: dca.c,v 1.6 2005/12/11 12:17:19 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 1990, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * the Systems Programming Group of the University of Utah Computer
9  * Science Department.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *	@(#)dca.c	8.1 (Berkeley) 6/10/93
36  */
37 /*
38  * Copyright (c) 1988 University of Utah.
39  *
40  * This code is derived from software contributed to Berkeley by
41  * the Systems Programming Group of the University of Utah Computer
42  * Science Department.
43  *
44  * Redistribution and use in source and binary forms, with or without
45  * modification, are permitted provided that the following conditions
46  * are met:
47  * 1. Redistributions of source code must retain the above copyright
48  *    notice, this list of conditions and the following disclaimer.
49  * 2. Redistributions in binary form must reproduce the above copyright
50  *    notice, this list of conditions and the following disclaimer in the
51  *    documentation and/or other materials provided with the distribution.
52  * 3. All advertising materials mentioning features or use of this software
53  *    must display the following acknowledgement:
54  *	This product includes software developed by the University of
55  *	California, Berkeley and its contributors.
56  * 4. Neither the name of the University nor the names of its contributors
57  *    may be used to endorse or promote products derived from this software
58  *    without specific prior written permission.
59  *
60  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
61  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
62  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
63  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
64  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
65  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
66  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
67  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
68  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
69  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
70  * SUCH DAMAGE.
71  *
72  *	@(#)dca.c	8.1 (Berkeley) 6/10/93
73  */
74 
75 #ifdef DCACONSOLE
76 #include <sys/param.h>
77 #include <dev/cons.h>
78 
79 #include <hp300/stand/common/dcareg.h>
80 #include <hp300/stand/common/consdefs.h>
81 #include <hp300/stand/common/samachdep.h>
82 
83 /* If not using 4.4 devs */
84 #ifndef dca_reset
85 #define dca_id dca_irid
86 #define dca_reset dca_id
87 #endif
88 
89 struct dcadevice *dcacnaddr = 0;
90 
91 #define DCACONSCODE	9	/* XXX */
92 
93 void
94 dcaprobe(struct consdev *cp)
95 {
96 	struct dcadevice *dca;
97 
98 	dcacnaddr = (struct dcadevice *) sctoaddr(DCACONSCODE);
99 	if (badaddr((char *)dcacnaddr)) {
100 		cp->cn_pri = CN_DEAD;
101 		return;
102 	}
103 #ifdef FORCEDCACONSOLE
104 	cp->cn_pri = CN_REMOTE;
105 #else
106 	dca = dcacnaddr;
107 	switch (dca->dca_id) {
108 	case DCAID0:
109 	case DCAID1:
110 		cp->cn_pri = CN_NORMAL;
111 		break;
112 	case DCAREMID0:
113 	case DCAREMID1:
114 		cp->cn_pri = CN_REMOTE;
115 		break;
116 	default:
117 		cp->cn_pri = CN_DEAD;
118 		break;
119 	}
120 
121 #endif
122 	curcons_scode = DCACONSCODE;
123 }
124 
125 void
126 dcainit(struct consdev *cp)
127 {
128 	struct dcadevice *dca = dcacnaddr;
129 
130 	dca->dca_reset = 0xFF;
131 	DELAY(100);
132 	dca->dca_ic = 0;
133 	dca->dca_cfcr = CFCR_DLAB;
134 	dca->dca_data = DCABRD(9600) & 0xFF;
135 	dca->dca_ier = DCABRD(9600) >> 8;
136 	dca->dca_cfcr = CFCR_8BITS;
137 	dca->dca_fifo =
138 	    FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST | FIFO_TRIGGER_1;
139 	dca->dca_mcr = MCR_DTR | MCR_RTS;
140 }
141 
142 /* ARGSUSED */
143 #ifndef SMALL
144 int
145 dcagetchar(dev_t dev)
146 {
147 	struct dcadevice *dca = dcacnaddr;
148 	short stat;
149 	int c;
150 
151 	if (((stat = dca->dca_lsr) & LSR_RXRDY) == 0)
152 		return 0;
153 	c = dca->dca_data;
154 	return c;
155 }
156 #else
157 int
158 dcagetchar(dev_t dev)
159 {
160 
161 	return 0;
162 }
163 #endif
164 
165 /* ARGSUSED */
166 void
167 dcaputchar(dev_t dev, int c)
168 {
169 	struct dcadevice *dca = dcacnaddr;
170 	int timo;
171 	short stat;
172 
173 	/* wait a reasonable time for the transmitter to come ready */
174 	timo = 50000;
175 	while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo)
176 		;
177 	dca->dca_data = c;
178 	/* wait for this transmission to complete */
179 	timo = 1000000;
180 	while (((stat = dca->dca_lsr) & LSR_TXRDY) == 0 && --timo)
181 		;
182 }
183 #endif
184