import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / mips / lib / tinycon.c
1 /*
2  * arch/mips/lib/console.c
3  *
4  * Copyright (C) 1994 by Waldorf Electronic,
5  * written by Ralf Baechle and Andreas Busse
6  *
7  * This file is subject to the terms and conditions of the GNU General Public
8  * License.  See the file COPYING in the main directory of this archive for
9  * more details.
10  *
11  * FIXME: This file is hacked to be hardwired for the Deskstation
12  *        Only thought as a debugging console output.  It's as inefficient
13  *        as a piece of code can be but probably a good piece of code to
14  *        implement a preliminary console for a new target.
15  */
16
17 #include <linux/tty.h>
18 #include <asm/bootinfo.h>
19
20 static unsigned int size_x;
21 static unsigned int size_y;
22 static unsigned short cursor_x;
23 static unsigned short cursor_y;
24 static volatile unsigned short *vram_addr;
25 static int console_needs_init = 1;
26
27 extern struct screen_info screen_info;
28
29 /* ----------------------------------------------------------------------
30  * init_console()
31  * ---------------------------------------------------------------------- */
32
33 void init_console(void)
34 {
35   size_x = 80;
36   size_y = 25;
37   cursor_x = 0;
38   cursor_y = 0;
39
40   vram_addr = (unsigned short *)0xb00b8000;
41
42   console_needs_init = 0;
43 }
44
45 void
46 set_size_x(unsigned int x)
47 {
48   size_x = x;
49 }
50
51 void
52 set_size_y(unsigned int y)
53 {
54   size_y = y;
55 }
56
57 void
58 set_vram(unsigned short *vram)
59 {
60   vram_addr = vram;
61 }
62
63 void
64 set_crsr(unsigned int x, unsigned int y)
65 {
66   cursor_x = x;
67   cursor_y = y;
68 }
69
70 void
71 print_char(unsigned int x, unsigned int y, unsigned char c)
72 {
73   volatile unsigned short *caddr;
74
75   caddr = vram_addr + (y * size_x) + x;
76   *caddr = (*caddr & 0xff00) | 0x0f00 | (unsigned short) c;
77 }
78
79 static void
80 scroll(void)
81 {
82   volatile unsigned short *caddr;
83   register int i;
84
85   caddr = vram_addr;
86   for(i=0; i<size_x * (size_y-1); i++)
87     *(caddr++) = *(caddr + size_x);
88
89   /* blank last line */
90
91   caddr = vram_addr + (size_x * (size_y-1));
92   for(i=0; i<size_x; i++)
93     *(caddr++) = (*caddr & 0xff00) | (unsigned short) ' ';
94 }
95
96 void print_string(const unsigned char *str)
97 {
98   unsigned char c;
99
100   if (console_needs_init)
101     init_console();
102
103   while((c = *str++))
104     switch(c)
105       {
106       case '\n':
107         cursor_x = 0;
108         cursor_y++;
109         if(cursor_y == size_y)
110           {
111             scroll();
112             cursor_y = size_y - 1;
113           }
114         break;
115
116       default:
117         print_char(cursor_x, cursor_y, c);
118         cursor_x++;
119         if(cursor_x == size_x)
120           {
121             cursor_x = 0;
122             cursor_y++;
123             if(cursor_y == size_y)
124               {
125                 scroll();
126                 cursor_y = size_y - 1;
127               }
128           }
129         break;
130       }
131 }
132
133 /* end of file */