diff options
Diffstat (limited to 'arch_msm7k/mddi_console.c')
-rw-r--r-- | arch_msm7k/mddi_console.c | 153 |
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(); +} + |