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
console_init(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
console_cursor(bool on)132 console_cursor(bool on)
133 {
134 
135           cons.cursor_enable = on;
136 }
137 
138 enum console_type
console_type(void)139 console_type(void)
140 {
141 
142           return cons.type;
143 }
144 
145 void
PUTCHAR(int c)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
getchar(void)225 getchar(void)
226 {
227 
228           return cons.getc();
229 }
230 
231 int
cnscan(void)232 cnscan(void)
233 {
234 
235           return cons.scan();
236 }
237 
238 void
nullcursor(int x,int y)239 nullcursor(int x, int y)
240 {
241           /* place holder */
242 }
243 
244 void
nullscroll(void)245 nullscroll(void)
246 {
247           /* place holder */
248 }
249