xref: /netbsd-src/sys/arch/vax/boot/boot/consio.c (revision 6a6027692662ba623e7bf5274322989a7b5d1440)
1 /*	$NetBSD: consio.c,v 1.17 2017/05/22 16:59:32 ragge Exp $ */
2 /*
3  * Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27  /* All bugs are subject to removal without further notice */
28 
29 
30 
31 #include "sys/param.h"
32 
33 #include "../vax/gencons.h"
34 
35 #include "mtpr.h"
36 #include "sid.h"
37 #include "rpb.h"
38 #include "ka630.h"
39 
40 #include "data.h"
41 
42 void setup(void);
43 
44 static void (*put_fp)(int)  = NULL;
45 static int (*get_fp)(void) = NULL;
46 static int (*test_fp)(void) = NULL;
47 
48 void pr_putchar(int c);	/* putchar() using mtpr/mfpr */
49 int pr_getchar(void);
50 int pr_testchar(void);
51 
52 void rom_putchar(int c);	/* putchar() using ROM routines */
53 int rom_getchar(void);
54 int rom_testchar(void);
55 
56 int rom_putc;		/* ROM-address of put-routine */
57 int rom_getc;		/* ROM-address of get-routine */
58 
59 /* Pointer to KA630 console page, initialized by ka630_consinit */
60 unsigned char  *ka630_conspage;
61 
62 /* Function that initializes things for KA630 ROM console I/O */
63 void ka630_consinit(void);
64 
65 /* Functions that use KA630 ROM for console I/O */
66 void ka630_rom_putchar(int c);
67 int ka630_rom_getchar(void);
68 int ka630_rom_testchar(void);
69 
70 /* Also added such a thing for KA53 - MK-991208 */
71 unsigned char  *ka53_conspage;
72 void ka53_consinit(void);
73 
74 void ka53_rom_putchar(int c);
75 int ka53_rom_getchar(void);
76 int ka53_rom_testchar(void);
77 
78 void vxt_putchar(int c);
79 int vxt_getchar(void);
80 int vxt_testchar(void);
81 
82 void putchar(int);
83 int getchar(void);
84 int testkey(void);
85 void consinit(void);
86 void _rtt(void);
87 
88 void
putchar(int c)89 putchar(int c)
90 {
91 	(*put_fp)(c);
92 	if (c == 10)
93 		(*put_fp)(13);		/* CR/LF */
94 }
95 
96 int
getchar(void)97 getchar(void)
98 {
99 	int c;
100 
101 	do
102 		c = (*get_fp)() & 0177;
103 	while (c == 17 || c == 19);		/* ignore XON/XOFF */
104 	if (c < 96 && c > 64)
105 		c += 32;
106 	return c;
107 }
108 
109 int
testkey(void)110 testkey(void)
111 {
112 	return (*test_fp)();
113 }
114 
115 /*
116  * setup() is called out of the startup files (start.s, srt0.s) and
117  * initializes data which are globally used and is called before main().
118  */
119 void
consinit(void)120 consinit(void)
121 {
122 	put_fp = pr_putchar; /* Default */
123 	get_fp = pr_getchar;
124 	test_fp = pr_testchar;
125 
126 	/*
127 	 * According to the vax_boardtype (vax_cputype is not specific
128 	 * enough to do that) we decide which method/routines to use
129 	 * for console I/O.
130 	 * mtpr/mfpr are restricted to serial consoles, ROM-based routines
131 	 * support both serial and graphical consoles.
132 	 * We default to mtpr routines; so that we don't crash if
133 	 * it isn't a supported system.
134 	 */
135 	switch (vax_boardtype) {
136 
137 	case VAX_BTYP_43:
138 	case VAX_BTYP_410:
139 	case VAX_BTYP_420:
140 		put_fp = rom_putchar;
141 		get_fp = rom_getchar;
142 		test_fp = rom_testchar;
143 		rom_putc = 0x20040058;		/* 537133144 */
144 		rom_getc = 0x20040044;		/* 537133124 */
145 		break;
146 
147 	case VAX_BTYP_VXT:
148 		put_fp = vxt_putchar;
149 		get_fp = vxt_getchar;
150 		test_fp = vxt_testchar;
151 		break;
152 
153 	case VAX_BTYP_630:
154 		ka630_consinit();
155 		break;
156 
157 	case VAX_BTYP_46:
158 	case VAX_BTYP_48:
159 	case VAX_BTYP_49:
160 		put_fp = rom_putchar;
161 		get_fp = rom_getchar;
162 		test_fp = rom_testchar;
163 		rom_putc = 0x20040068;
164 		rom_getc = 0x20040054;
165 		break;
166 
167 	case VAX_BTYP_53:
168 		ka53_consinit();
169 		break;
170 
171 #ifdef notdef
172 	case VAX_BTYP_630:
173 	case VAX_BTYP_650:
174 	case VAX_BTYP_9CC:
175 	case VAX_BTYP_60:
176 		put_fp = pr_putchar;
177 		get_fp = pr_getchar;
178 		break
179 #endif
180 	}
181 	return;
182 }
183 
184 /*
185  * putchar() using MTPR
186  */
187 void
188 pr_putchar(int c)
189 {
190 	int	timeout = 1<<15;	/* don't hang the machine! */
191 
192 	/*
193 	 * On KA88 we may get C-S/C-Q from the console.
194 	 * Must obey it.
195 	 */
196 	while (mfpr(PR_RXCS) & GC_DON) {
197 		if ((mfpr(PR_RXDB) & 0x7f) == 19) {
198 			while (1) {
199 				while ((mfpr(PR_RXCS) & GC_DON) == 0)
200 					;
201 				if ((mfpr(PR_RXDB) & 0x7f) == 17)
202 					break;
203 			}
204 		}
205 	}
206 
207 	while ((mfpr(PR_TXCS) & GC_RDY) == 0)  /* Wait until xmit ready */
208 		if (--timeout < 0)
209 			break;
210 	mtpr(c, PR_TXDB);		/* xmit character */
211 }
212 
213 /*
214  * getchar() using MFPR
215  */
216 int
217 pr_getchar(void)
218 {
219 	while ((mfpr(PR_RXCS) & GC_DON) == 0)
220 		;	/* wait for char */
221 	return (mfpr(PR_RXDB));			/* now get it */
222 }
223 
224 int
225 pr_testchar(void)
226 {
227 	if (mfpr(PR_RXCS) & GC_DON)
228 		return mfpr(PR_RXDB);
229 	else
230 		return 0;
231 }
232 
233 /*
234  * void ka630_rom_getchar (void)  ==> initialize KA630 ROM console I/O
235  */
236 void ka630_consinit(void)
237 {
238 	short *NVR;
239 	int i;
240 
241 	/* Find the console page */
242 	NVR = (short *) KA630_NVR_ADRS;
243 
244 	i = *NVR++ & 0xFF;
245 	i |= (*NVR++ & 0xFF) << 8;
246 	i |= (*NVR++ & 0xFF) << 16;
247 	i |= (*NVR++ & 0xFF) << 24;
248 
249 	ka630_conspage = (unsigned char *) i;
250 
251 	/* Go to last row to minimize confusion */
252 	ka630_conspage[KA630_ROW] = ka630_conspage[KA630_MAXROW];
253 	ka630_conspage[KA630_COL] = ka630_conspage[KA630_MINCOL];
254 
255 	/* Use KA630 ROM console I/O routines */
256 	put_fp = ka630_rom_putchar;
257 	get_fp = ka630_rom_getchar;
258 	test_fp = ka630_rom_testchar;
259 }
260 
261 
262 /*
263  * void ka53_consinit (void)  ==> initialize KA53 ROM console I/O
264  */
265 void ka53_consinit(void)
266 {
267 	ka53_conspage = (unsigned char *) 0x2014044b;
268 
269 	put_fp = ka53_rom_putchar;
270 	get_fp = ka53_rom_getchar;
271 	test_fp = ka53_rom_testchar;
272 }
273 
274 static volatile int *vxtregs = (int *)0x200A0000;
275 
276 #define	CH_SR		1
277 #define	CH_DAT		3
278 #define SR_TX_RDY	0x04
279 #define SR_RX_RDY	0x01
280 
281 void
282 vxt_putchar(int c)
283 {
284 	while ((vxtregs[CH_SR] & SR_TX_RDY) == 0)
285 		;
286 	vxtregs[CH_DAT] = c;
287 }
288 
289 int
290 vxt_getchar(void)
291 {
292 	while ((vxtregs[CH_SR] & SR_RX_RDY) == 0)
293 		;
294 	return vxtregs[CH_DAT];
295 }
296 
297 int
298 vxt_testchar(void)
299 {
300 	if ((vxtregs[CH_SR] & SR_RX_RDY) == 0)
301 		return 0;
302 	return vxtregs[CH_DAT];
303 }
304