Home | History | Annotate | Line # | Download | only in common
      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