summaryrefslogtreecommitdiff
path: root/arch_msm7k/mddi_console.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch_msm7k/mddi_console.c')
-rw-r--r--arch_msm7k/mddi_console.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/arch_msm7k/mddi_console.c b/arch_msm7k/mddi_console.c
new file mode 100644
index 0000000..c1389ca
--- /dev/null
+++ b/arch_msm7k/mddi_console.c
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2008, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <boot/boot.h>
+#include <boot/font5x12.h>
+
+static unsigned short BGCOLOR = 0x001F;
+static unsigned short FGCOLOR = 0xFFFF;
+
+static void drawglyph(unsigned short *pixels, unsigned short paint,
+ unsigned stride, unsigned *glyph)
+{
+ unsigned x, y, data;
+ stride -= 5;
+
+ data = glyph[0];
+ for(y = 0; y < 6; y++) {
+ for(x = 0; x < 5; x++) {
+ if(data & 1) *pixels = paint;
+ data >>= 1;
+ pixels++;
+ }
+ pixels += stride;
+ }
+ data = glyph[1];
+ for(y = 0; y < 6; y++) {
+ for(x = 0; x < 5; x++) {
+ if(data & 1) *pixels = paint;
+ data >>= 1;
+ pixels++;
+ }
+ pixels += stride;
+ }
+}
+
+#if 0
+static void drawtext(unsigned x, unsigned y, unsigned paint, const char *text)
+{
+ unsigned short *pixels = mddi_framebuffer();
+ unsigned stride = fb_width;
+ char c;
+
+ while((c = *text++)) {
+ if((c < ' ') || (c > 127)) continue;
+ c = (c - 32) * 2;
+ drawglyph(pixels + y*stride + x, paint, stride, font5x12 + c);
+ x += 6;
+ }
+}
+#endif
+
+static int cx, cy, cmaxx, cmaxy;
+
+void console_clear(void)
+{
+ unsigned short *dst = mddi_framebuffer();
+ unsigned count = fb_width * fb_height;
+ cx = 0;
+ cy = 0;
+ while(count--) *dst++ = BGCOLOR;
+}
+
+static void scroll_up(void)
+{
+ unsigned short *dst = mddi_framebuffer();
+ unsigned short *src = dst + (fb_width * 12);
+ unsigned count = fb_height * (fb_width - 12);
+
+ while(count--) {
+ *dst++ = *src++;
+ }
+ count = fb_width * 12;
+ while(count--) {
+ *dst++ = BGCOLOR;
+ }
+}
+
+void console_putc(unsigned c)
+{
+ unsigned short *pixels;
+
+ if(c > 127) return;
+ if(c < 32) {
+ if(c == '\n') goto newline;
+ return;
+ }
+
+ pixels = mddi_framebuffer();
+ drawglyph(pixels + cy * 12 * fb_width + cx * 6, FGCOLOR,
+ fb_width, font5x12 + (c - 32) * 2);
+
+ cx++;
+ if(cx < cmaxx) return;
+
+newline:
+ cy++;
+ cx = 0;
+ if(cy >= cmaxy) {
+ cy = cmaxy - 1;
+ scroll_up();
+ }
+}
+
+void console_flush(void)
+{
+ mddi_start_update();
+ while(!mddi_update_done()) ;
+}
+
+void console_set_colors(unsigned bg, unsigned fg)
+{
+ BGCOLOR = bg;
+ FGCOLOR = fg;
+}
+
+void console_init(void)
+{
+ mddi_init();
+
+ cmaxx = fb_width / 6;
+ cmaxy = (fb_height-1) / 12;
+ cx = 0;
+ cy = 0;
+
+ console_clear();
+ console_flush();
+}
+