1 /*	$NetBSD: console.c,v 1.4 2008/04/28 20:23:18 martin Exp $	*/
2 
3 /*-
4  * Copyright (c) 2004, 2005 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by UCHIYAMA Yasushi.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 
35 #include <lib/libsa/stand.h>
36 
37 #include "local.h"
38 
39 void __putchar(int);
40 
41 #define	PUTCHAR		__putchar	/* "boot" hooks log staff. */
42 
43 #include <machine/sbd.h>
44 
45 #include "console.h"
46 
47 struct cons cons;
48 void nullcursor(int, int);
49 void nullscroll(void);
50 
51 
52 void
53 console_init(void)
54 {
55 	uint8_t nvsram_cons;
56 
57 	cons.cursor = nullcursor;
58 	cons.scroll = nullscroll;
59 	cons.cursor_enable = false;
60 	cons.erace_previous_cursor = false;
61 
62 	switch (SBD_INFO->machine) {
63 	case MACHINE_TR2:
64 		/* untested */
65 		nvsram_cons = *(volatile uint8_t *)0xbb023010;
66 
67 		switch (nvsram_cons) {
68 		case 0x00:
69 			cons.type = CONS_FB_KSEG2;
70 			fb_set_addr(0xf0000000, 0x01000000, 0xbfc0ec00);
71 			zskbd_set_addr(0xbb010000, 0xbb010004);
72 			cons.init();
73 			break;
74 		case 0x01:
75 			/* sio 1 (zs channel A) */
76 			cons.type = CONS_SIO1;
77 			zs_set_addr(0xbb011008, 0xbb01100c, 4915200);
78 			cons.init();
79 			break;
80 		case 0x02:
81 			/* sio 2 (zs channel B) */
82 			cons.type = CONS_SIO2;
83 			zs_set_addr(0xbb011000, 0xbb011004, 4915200);
84 			cons.init();
85 			break;
86 		default:
87 			goto rom_cons;
88 		}
89 		break;
90 	case MACHINE_TR2A:
91 		nvsram_cons = *(volatile uint8_t *)0xbe4932a0;
92 
93 		switch (nvsram_cons) {
94 		case 0x80:
95 			/* on-board FB on 360AD, 360ADII */
96 			cons.type = CONS_FB_KSEG2;
97 			fb_set_addr(0xf0000000, 0x01000000, 0xbfc0ec00);
98 			zskbd_set_addr(0xbe480000, 0xbe480004);
99 			cons.init();
100 			break;
101 		case 0x01:
102 			/* sio 1 (zs channel A) */
103 			cons.type = CONS_SIO1;
104 			zs_set_addr(0xbe440008, 0xbe44000c, 4915200);
105 			cons.init();
106 			break;
107 		case 0x02:
108 			/* sio 2 (zs channel B) */
109 			cons.type = CONS_SIO2;
110 			zs_set_addr(0xbe440000, 0xbe440004, 4915200);
111 			cons.init();
112 			break;
113 		default:
114 			goto rom_cons;
115 		}
116 		break;
117 	default:
118  rom_cons:
119 		cons.getc = ROM_GETC;
120 		cons.scan = rom_scan;
121 		cons.putc = ROM_PUTC;
122 		cons.init = cons_rom_init;
123 		cons.scroll = cons_rom_scroll;
124 		cons.type = CONS_ROM;
125 		cons.init();
126 
127 		break;
128 	}
129 }
130 
131 void
132 console_cursor(bool on)
133 {
134 
135 	cons.cursor_enable = on;
136 }
137 
138 enum console_type
139 console_type(void)
140 {
141 
142 	return cons.type;
143 }
144 
145 void
146 PUTCHAR(int c)
147 {
148 	int i;
149 
150 	if (cons.type == CONS_SIO1 || cons.type == CONS_SIO2) {
151 		if (c == '\n')
152 			cons.putc(0, 0, '\r');
153 		cons.putc(0, 0, c);
154 		return;
155 	}
156 
157 	if (cons.cursor_enable && cons.erace_previous_cursor)
158 		cons.cursor(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT);
159 
160 	switch (c) {
161 	default:
162 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
163 		if (++cons.x == CONS_WIDTH) {
164 			cons.x = X_INIT;
165 			cons.y++;
166 		}
167 		break;
168 	case '\b':
169 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
170 		cons.x = cons.x == X_INIT ? X_INIT : cons.x - 1;
171 		if (cons.cursor_enable)
172 			cons.putc(cons.x * ROM_FONT_WIDTH,
173 			    cons.y * ROM_FONT_HEIGHT, ' ');
174 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
175 		break;
176 	case '\t':
177 		for (i = cons.x % 8; i < 8; i++) {
178 			cons.putc(cons.x * ROM_FONT_WIDTH,
179 			    cons.y * ROM_FONT_HEIGHT, ' ');
180 			if (++cons.x == CONS_WIDTH) {
181 				cons.x = X_INIT;
182 				if (++cons.y == CONS_HEIGHT)
183 					cons.scroll();
184 			}
185 		}
186 		break;
187 	case '\r':
188 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
189 		cons.x = X_INIT;
190 		break;
191 	case '\n':
192 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT,
193 		    '\r');
194 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
195 		cons.x = X_INIT;
196 		cons.y++;
197 		break;
198 	case 2:	/* Ctrl-b */
199 		if (--cons.x < X_INIT)
200 			cons.x = X_INIT;
201 		break;
202 	case 6:	/* Ctrl-f */
203 		if (++cons.x >= CONS_WIDTH)
204 			cons.x = CONS_WIDTH;
205 		break;
206 	case 11:/* Ctrl-k */
207 		for (i = cons.x; i < CONS_WIDTH; i++)
208 			cons.putc(i * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT,
209 			     ' ');
210 		break;
211 	}
212 
213 	if (cons.y == CONS_HEIGHT)
214 		cons.scroll();
215 
216 	if (cons.cursor_enable) {
217 		cons.cursor(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT);
218 		cons.erace_previous_cursor = true;
219 	} else {
220 		cons.erace_previous_cursor = false;
221 	}
222 }
223 
224 int
225 getchar(void)
226 {
227 
228 	return cons.getc();
229 }
230 
231 int
232 cnscan(void)
233 {
234 
235 	return cons.scan();
236 }
237 
238 void
239 nullcursor(int x, int y)
240 {
241 	/* place holder */
242 }
243 
244 void
245 nullscroll(void)
246 {
247 	/* place holder */
248 }
249