File: /usr/src/linux/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 */
134