/*
* arch/mips/lib/console.c
*
* Copyright (C) 1994 by Waldorf Electronic,
* written by Ralf Baechle and Andreas Busse
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive for
* more details.
*
* FIXME: This file is hacked to be hardwired for the Deskstation
* Only thought as a debugging console output. It's as inefficient
* as a piece of code can be but probably a good piece of code to
* implement a preliminary console for a new target.
*/
#include <linux/tty.h>
#include <asm/bootinfo.h>
static unsigned int size_x;
static unsigned int size_y;
static unsigned short cursor_x;
static unsigned short cursor_y;
static volatile unsigned short *vram_addr;
static int console_needs_init = 1;
extern struct screen_info screen_info;
/* ----------------------------------------------------------------------
* init_console()
* ---------------------------------------------------------------------- */
void init_console(void)
{
size_x = 80;
size_y = 25;
cursor_x = 0;
cursor_y = 0;
vram_addr = (unsigned short *)0xb00b8000;
console_needs_init = 0;
}
void
set_size_x(unsigned int x)
{
size_x = x;
}
void
set_size_y(unsigned int y)
{
size_y = y;
}
void
set_vram(unsigned short *vram)
{
vram_addr = vram;
}
void
set_crsr(unsigned int x, unsigned int y)
{
cursor_x = x;
cursor_y = y;
}
void
print_char(unsigned int x, unsigned int y, unsigned char c)
{
volatile unsigned short *caddr;
caddr = vram_addr + (y * size_x) + x;
*caddr = (*caddr & 0xff00) | 0x0f00 | (unsigned short) c;
}
static void
scroll(void)
{
volatile unsigned short *caddr;
register int i;
caddr = vram_addr;
for(i=0; i<size_x * (size_y-1); i++)
*(caddr++) = *(caddr + size_x);
/* blank last line */
caddr = vram_addr + (size_x * (size_y-1));
for(i=0; i<size_x; i++)
*(caddr++) = (*caddr & 0xff00) | (unsigned short) ' ';
}
void print_string(const unsigned char *str)
{
unsigned char c;
if (console_needs_init)
init_console();
while((c = *str++))
switch(c)
{
case '\n':
cursor_x = 0;
cursor_y++;
if(cursor_y == size_y)
{
scroll();
cursor_y = size_y - 1;
}
break;
default:
print_char(cursor_x, cursor_y, c);
cursor_x++;
if(cursor_x == size_x)
{
cursor_x = 0;
cursor_y++;
if(cursor_y == size_y)
{
scroll();
cursor_y = size_y - 1;
}
}
break;
}
}
/* end of file */