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