1 /*
2 * Copyright (c) 2008, Google Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #include <boot/boot.h>
30 #include <boot/font5x12.h>
31
32 static unsigned short BGCOLOR = 0x001F;
33 static unsigned short FGCOLOR = 0xFFFF;
34
drawglyph(unsigned short * pixels,unsigned short paint,unsigned stride,unsigned * glyph)35 static void drawglyph(unsigned short *pixels, unsigned short paint,
36 unsigned stride, unsigned *glyph)
37 {
38 unsigned x, y, data;
39 stride -= 5;
40
41 data = glyph[0];
42 for(y = 0; y < 6; y++) {
43 for(x = 0; x < 5; x++) {
44 if(data & 1) *pixels = paint;
45 data >>= 1;
46 pixels++;
47 }
48 pixels += stride;
49 }
50 data = glyph[1];
51 for(y = 0; y < 6; y++) {
52 for(x = 0; x < 5; x++) {
53 if(data & 1) *pixels = paint;
54 data >>= 1;
55 pixels++;
56 }
57 pixels += stride;
58 }
59 }
60
61 #if 0
62 static void drawtext(unsigned x, unsigned y, unsigned paint, const char *text)
63 {
64 unsigned short *pixels = mddi_framebuffer();
65 unsigned stride = fb_width;
66 char c;
67
68 while((c = *text++)) {
69 if((c < ' ') || (c > 127)) continue;
70 c = (c - 32) * 2;
71 drawglyph(pixels + y*stride + x, paint, stride, font5x12 + c);
72 x += 6;
73 }
74 }
75 #endif
76
77 static int cx, cy, cmaxx, cmaxy;
78
console_clear(void)79 void console_clear(void)
80 {
81 unsigned short *dst = mddi_framebuffer();
82 unsigned count = fb_width * fb_height;
83 cx = 0;
84 cy = 0;
85 while(count--) *dst++ = BGCOLOR;
86 }
87
scroll_up(void)88 static void scroll_up(void)
89 {
90 unsigned short *dst = mddi_framebuffer();
91 unsigned short *src = dst + (fb_width * 12);
92 unsigned count = fb_height * (fb_width - 12);
93
94 while(count--) {
95 *dst++ = *src++;
96 }
97 count = fb_width * 12;
98 while(count--) {
99 *dst++ = BGCOLOR;
100 }
101 }
102
console_putc(unsigned c)103 void console_putc(unsigned c)
104 {
105 unsigned short *pixels;
106
107 if(c > 127) return;
108 if(c < 32) {
109 if(c == '\n') goto newline;
110 return;
111 }
112
113 pixels = mddi_framebuffer();
114 drawglyph(pixels + cy * 12 * fb_width + cx * 6, FGCOLOR,
115 fb_width, font5x12 + (c - 32) * 2);
116
117 cx++;
118 if(cx < cmaxx) return;
119
120 newline:
121 cy++;
122 cx = 0;
123 if(cy >= cmaxy) {
124 cy = cmaxy - 1;
125 scroll_up();
126 }
127 }
128
console_flush(void)129 void console_flush(void)
130 {
131 mddi_start_update();
132 while(!mddi_update_done()) ;
133 }
134
console_set_colors(unsigned bg,unsigned fg)135 void console_set_colors(unsigned bg, unsigned fg)
136 {
137 BGCOLOR = bg;
138 FGCOLOR = fg;
139 }
140
console_init(void)141 void console_init(void)
142 {
143 mddi_init();
144
145 cmaxx = fb_width / 6;
146 cmaxy = (fb_height-1) / 12;
147 cx = 0;
148 cy = 0;
149
150 console_clear();
151 console_flush();
152 }
153
154