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