xref: /netbsd-src/sys/arch/ews4800mips/stand/common/console.c (revision ce099b40997c43048fb78bd578195f81d2456523)
1*ce099b40Smartin /*	$NetBSD: console.c,v 1.4 2008/04/28 20:23:18 martin Exp $	*/
204faabf0Stsutsui 
304faabf0Stsutsui /*-
404faabf0Stsutsui  * Copyright (c) 2004, 2005 The NetBSD Foundation, Inc.
504faabf0Stsutsui  * All rights reserved.
604faabf0Stsutsui  *
704faabf0Stsutsui  * This code is derived from software contributed to The NetBSD Foundation
804faabf0Stsutsui  * by UCHIYAMA Yasushi.
904faabf0Stsutsui  *
1004faabf0Stsutsui  * Redistribution and use in source and binary forms, with or without
1104faabf0Stsutsui  * modification, are permitted provided that the following conditions
1204faabf0Stsutsui  * are met:
1304faabf0Stsutsui  * 1. Redistributions of source code must retain the above copyright
1404faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer.
1504faabf0Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
1604faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer in the
1704faabf0Stsutsui  *    documentation and/or other materials provided with the distribution.
1804faabf0Stsutsui  *
1904faabf0Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2004faabf0Stsutsui  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2104faabf0Stsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2204faabf0Stsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2304faabf0Stsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2404faabf0Stsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2504faabf0Stsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2604faabf0Stsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2704faabf0Stsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2804faabf0Stsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2904faabf0Stsutsui  * POSSIBILITY OF SUCH DAMAGE.
3004faabf0Stsutsui  */
3104faabf0Stsutsui 
3204faabf0Stsutsui #include <sys/param.h>
3304faabf0Stsutsui #include <sys/systm.h>
3404faabf0Stsutsui 
3504faabf0Stsutsui #include <lib/libsa/stand.h>
3604faabf0Stsutsui 
3704faabf0Stsutsui #include "local.h"
3804faabf0Stsutsui 
3904faabf0Stsutsui void __putchar(int);
4004faabf0Stsutsui 
4104faabf0Stsutsui #define	PUTCHAR		__putchar	/* "boot" hooks log staff. */
4204faabf0Stsutsui 
4304faabf0Stsutsui #include <machine/sbd.h>
4404faabf0Stsutsui 
4504faabf0Stsutsui #include "console.h"
4604faabf0Stsutsui 
4704faabf0Stsutsui struct cons cons;
4804faabf0Stsutsui void nullcursor(int, int);
4904faabf0Stsutsui void nullscroll(void);
5004faabf0Stsutsui 
5104faabf0Stsutsui 
5204faabf0Stsutsui void
console_init(void)5304faabf0Stsutsui console_init(void)
5404faabf0Stsutsui {
5504faabf0Stsutsui 	uint8_t nvsram_cons;
5604faabf0Stsutsui 
5704faabf0Stsutsui 	cons.cursor = nullcursor;
5804faabf0Stsutsui 	cons.scroll = nullscroll;
5916ed6645Sthorpej 	cons.cursor_enable = false;
6016ed6645Sthorpej 	cons.erace_previous_cursor = false;
6104faabf0Stsutsui 
6204faabf0Stsutsui 	switch (SBD_INFO->machine) {
6304faabf0Stsutsui 	case MACHINE_TR2:
6404faabf0Stsutsui 		/* untested */
6504faabf0Stsutsui 		nvsram_cons = *(volatile uint8_t *)0xbb023010;
6604faabf0Stsutsui 
6704faabf0Stsutsui 		switch (nvsram_cons) {
6804faabf0Stsutsui 		case 0x00:
6904faabf0Stsutsui 			cons.type = CONS_FB_KSEG2;
7004faabf0Stsutsui 			fb_set_addr(0xf0000000, 0x01000000, 0xbfc0ec00);
7104faabf0Stsutsui 			zskbd_set_addr(0xbb010000, 0xbb010004);
7204faabf0Stsutsui 			cons.init();
7304faabf0Stsutsui 			break;
7404faabf0Stsutsui 		case 0x01:
7504faabf0Stsutsui 			/* sio 1 (zs channel A) */
7604faabf0Stsutsui 			cons.type = CONS_SIO1;
7704faabf0Stsutsui 			zs_set_addr(0xbb011008, 0xbb01100c, 4915200);
7804faabf0Stsutsui 			cons.init();
7904faabf0Stsutsui 			break;
8004faabf0Stsutsui 		case 0x02:
8104faabf0Stsutsui 			/* sio 2 (zs channel B) */
8204faabf0Stsutsui 			cons.type = CONS_SIO2;
8304faabf0Stsutsui 			zs_set_addr(0xbb011000, 0xbb011004, 4915200);
8404faabf0Stsutsui 			cons.init();
8504faabf0Stsutsui 			break;
8604faabf0Stsutsui 		default:
8704faabf0Stsutsui 			goto rom_cons;
8804faabf0Stsutsui 		}
8904faabf0Stsutsui 		break;
9004faabf0Stsutsui 	case MACHINE_TR2A:
9104faabf0Stsutsui 		nvsram_cons = *(volatile uint8_t *)0xbe4932a0;
9204faabf0Stsutsui 
9304faabf0Stsutsui 		switch (nvsram_cons) {
9404faabf0Stsutsui 		case 0x80:
9504faabf0Stsutsui 			/* on-board FB on 360AD, 360ADII */
9604faabf0Stsutsui 			cons.type = CONS_FB_KSEG2;
9704faabf0Stsutsui 			fb_set_addr(0xf0000000, 0x01000000, 0xbfc0ec00);
9804faabf0Stsutsui 			zskbd_set_addr(0xbe480000, 0xbe480004);
9904faabf0Stsutsui 			cons.init();
10004faabf0Stsutsui 			break;
10104faabf0Stsutsui 		case 0x01:
10204faabf0Stsutsui 			/* sio 1 (zs channel A) */
10304faabf0Stsutsui 			cons.type = CONS_SIO1;
10404faabf0Stsutsui 			zs_set_addr(0xbe440008, 0xbe44000c, 4915200);
10504faabf0Stsutsui 			cons.init();
10604faabf0Stsutsui 			break;
10704faabf0Stsutsui 		case 0x02:
10804faabf0Stsutsui 			/* sio 2 (zs channel B) */
10904faabf0Stsutsui 			cons.type = CONS_SIO2;
11004faabf0Stsutsui 			zs_set_addr(0xbe440000, 0xbe440004, 4915200);
11104faabf0Stsutsui 			cons.init();
11204faabf0Stsutsui 			break;
11304faabf0Stsutsui 		default:
11404faabf0Stsutsui 			goto rom_cons;
11504faabf0Stsutsui 		}
11604faabf0Stsutsui 		break;
11704faabf0Stsutsui 	default:
11804faabf0Stsutsui  rom_cons:
11904faabf0Stsutsui 		cons.getc = ROM_GETC;
12004faabf0Stsutsui 		cons.scan = rom_scan;
12104faabf0Stsutsui 		cons.putc = ROM_PUTC;
12204faabf0Stsutsui 		cons.init = cons_rom_init;
12304faabf0Stsutsui 		cons.scroll = cons_rom_scroll;
12404faabf0Stsutsui 		cons.type = CONS_ROM;
12504faabf0Stsutsui 		cons.init();
12604faabf0Stsutsui 
12704faabf0Stsutsui 		break;
12804faabf0Stsutsui 	}
12904faabf0Stsutsui }
13004faabf0Stsutsui 
13104faabf0Stsutsui void
console_cursor(bool on)132712239e3Sthorpej console_cursor(bool on)
13304faabf0Stsutsui {
13404faabf0Stsutsui 
13504faabf0Stsutsui 	cons.cursor_enable = on;
13604faabf0Stsutsui }
13704faabf0Stsutsui 
13804faabf0Stsutsui enum console_type
console_type(void)13904faabf0Stsutsui console_type(void)
14004faabf0Stsutsui {
14104faabf0Stsutsui 
14204faabf0Stsutsui 	return cons.type;
14304faabf0Stsutsui }
14404faabf0Stsutsui 
14504faabf0Stsutsui void
PUTCHAR(int c)14604faabf0Stsutsui PUTCHAR(int c)
14704faabf0Stsutsui {
14804faabf0Stsutsui 	int i;
14904faabf0Stsutsui 
15004faabf0Stsutsui 	if (cons.type == CONS_SIO1 || cons.type == CONS_SIO2) {
15104faabf0Stsutsui 		if (c == '\n')
15204faabf0Stsutsui 			cons.putc(0, 0, '\r');
15304faabf0Stsutsui 		cons.putc(0, 0, c);
15404faabf0Stsutsui 		return;
15504faabf0Stsutsui 	}
15604faabf0Stsutsui 
15704faabf0Stsutsui 	if (cons.cursor_enable && cons.erace_previous_cursor)
15804faabf0Stsutsui 		cons.cursor(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT);
15904faabf0Stsutsui 
16004faabf0Stsutsui 	switch (c) {
16104faabf0Stsutsui 	default:
16204faabf0Stsutsui 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
16304faabf0Stsutsui 		if (++cons.x == CONS_WIDTH) {
16404faabf0Stsutsui 			cons.x = X_INIT;
16504faabf0Stsutsui 			cons.y++;
16604faabf0Stsutsui 		}
16704faabf0Stsutsui 		break;
16804faabf0Stsutsui 	case '\b':
16904faabf0Stsutsui 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
17004faabf0Stsutsui 		cons.x = cons.x == X_INIT ? X_INIT : cons.x - 1;
17104faabf0Stsutsui 		if (cons.cursor_enable)
17204faabf0Stsutsui 			cons.putc(cons.x * ROM_FONT_WIDTH,
17304faabf0Stsutsui 			    cons.y * ROM_FONT_HEIGHT, ' ');
17404faabf0Stsutsui 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
17504faabf0Stsutsui 		break;
17604faabf0Stsutsui 	case '\t':
17704faabf0Stsutsui 		for (i = cons.x % 8; i < 8; i++) {
17804faabf0Stsutsui 			cons.putc(cons.x * ROM_FONT_WIDTH,
17904faabf0Stsutsui 			    cons.y * ROM_FONT_HEIGHT, ' ');
18004faabf0Stsutsui 			if (++cons.x == CONS_WIDTH) {
18104faabf0Stsutsui 				cons.x = X_INIT;
18204faabf0Stsutsui 				if (++cons.y == CONS_HEIGHT)
18304faabf0Stsutsui 					cons.scroll();
18404faabf0Stsutsui 			}
18504faabf0Stsutsui 		}
18604faabf0Stsutsui 		break;
18704faabf0Stsutsui 	case '\r':
18804faabf0Stsutsui 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
18904faabf0Stsutsui 		cons.x = X_INIT;
19004faabf0Stsutsui 		break;
19104faabf0Stsutsui 	case '\n':
19204faabf0Stsutsui 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT,
19304faabf0Stsutsui 		    '\r');
19404faabf0Stsutsui 		cons.putc(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT, c);
19504faabf0Stsutsui 		cons.x = X_INIT;
19604faabf0Stsutsui 		cons.y++;
19704faabf0Stsutsui 		break;
19804faabf0Stsutsui 	case 2:	/* Ctrl-b */
19904faabf0Stsutsui 		if (--cons.x < X_INIT)
20004faabf0Stsutsui 			cons.x = X_INIT;
20104faabf0Stsutsui 		break;
20204faabf0Stsutsui 	case 6:	/* Ctrl-f */
20304faabf0Stsutsui 		if (++cons.x >= CONS_WIDTH)
20404faabf0Stsutsui 			cons.x = CONS_WIDTH;
20504faabf0Stsutsui 		break;
20604faabf0Stsutsui 	case 11:/* Ctrl-k */
20704faabf0Stsutsui 		for (i = cons.x; i < CONS_WIDTH; i++)
20804faabf0Stsutsui 			cons.putc(i * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT,
20904faabf0Stsutsui 			     ' ');
21004faabf0Stsutsui 		break;
21104faabf0Stsutsui 	}
21204faabf0Stsutsui 
21304faabf0Stsutsui 	if (cons.y == CONS_HEIGHT)
21404faabf0Stsutsui 		cons.scroll();
21504faabf0Stsutsui 
21604faabf0Stsutsui 	if (cons.cursor_enable) {
21704faabf0Stsutsui 		cons.cursor(cons.x * ROM_FONT_WIDTH, cons.y * ROM_FONT_HEIGHT);
21816ed6645Sthorpej 		cons.erace_previous_cursor = true;
21904faabf0Stsutsui 	} else {
22016ed6645Sthorpej 		cons.erace_previous_cursor = false;
22104faabf0Stsutsui 	}
22204faabf0Stsutsui }
22304faabf0Stsutsui 
22404faabf0Stsutsui int
getchar(void)22504faabf0Stsutsui getchar(void)
22604faabf0Stsutsui {
22704faabf0Stsutsui 
22804faabf0Stsutsui 	return cons.getc();
22904faabf0Stsutsui }
23004faabf0Stsutsui 
23104faabf0Stsutsui int
cnscan(void)23204faabf0Stsutsui cnscan(void)
23304faabf0Stsutsui {
23404faabf0Stsutsui 
23504faabf0Stsutsui 	return cons.scan();
23604faabf0Stsutsui }
23704faabf0Stsutsui 
23804faabf0Stsutsui void
nullcursor(int x,int y)23904faabf0Stsutsui nullcursor(int x, int y)
24004faabf0Stsutsui {
24104faabf0Stsutsui 	/* place holder */
24204faabf0Stsutsui }
24304faabf0Stsutsui 
24404faabf0Stsutsui void
nullscroll(void)24504faabf0Stsutsui nullscroll(void)
24604faabf0Stsutsui {
24704faabf0Stsutsui 	/* place holder */
24804faabf0Stsutsui }
249