Most coreboot users use just VGA text console, not graphics. Support it.
Remaining problem is that software and hardware cursor blinking superimpose.
I disabled software blinking locally but it's not part of this patch since
it's not done properly.

diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c
index 61e1058..0c3c26d 100644
--- a/drivers/video/cfb_console.c
+++ b/drivers/video/cfb_console.c
@@ -180,11 +180,10 @@
 /*
  * some Macros
  */
-#define VIDEO_VISIBLE_COLS     (pGD->winSizeX)
-#define VIDEO_VISIBLE_ROWS     (pGD->winSizeY)
-#define VIDEO_PIXEL_SIZE       (pGD->gdfBytesPP)
+static int VIDEO_VISIBLE_COLS;
+static int VIDEO_VISIBLE_ROWS;
+static int VIDEO_PIXEL_SIZE;
 #define VIDEO_DATA_FORMAT      (pGD->gdfIndex)
-#define VIDEO_FB_ADRS          (pGD->frameAdrs)
 
 /*
  * Console device defines with i8042 keyboard controller
@@ -384,6 +383,7 @@ static int console_row;             /* cursor row */
 static u32 eorx, fgx, bgx;     /* color pats */
 
 static int cfb_do_flush_cache;
+static int vga_text;
 
 #ifdef CONFIG_CFB_CONSOLE_ANSI
 static char ansi_buf[10];
@@ -450,6 +450,18 @@ static void video_drawchars(int xx, int yy, unsigned char 
*s, int count)
        u8 *cdat, *dest, *dest0;
        int rows, offset, c;
 
+       if (vga_text)
+       {
+               xx /= VIDEO_FONT_WIDTH;
+               yy /= VIDEO_FONT_HEIGHT;
+               while (count--)
+               {
+                       ((uint16_t *)video_fb_address) [yy * 80 + xx] = 0x700 | 
*s++;
+                       xx++;
+               }
+               return;
+       }
+
        offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE;
        dest0 = video_fb_address + offset;
 
@@ -644,6 +656,20 @@ static void video_invertchar(int xx, int yy)
        }
 }
 
+static inline void
+cr_write (uint8_t val, uint8_t addr)
+{
+  outb (addr, 0x3d4);
+  outb (val, 0x3d5);
+}
+
+static inline uint8_t
+cr_read (uint8_t addr)
+{
+  outb (addr, 0x3d4);
+  return inb (0x3d5);
+}
+
 void console_cursor(int state)
 {
 #ifdef CONFIG_CONSOLE_TIME
@@ -667,6 +693,22 @@ void console_cursor(int state)
        }
 #endif
 
+       if (vga_text)
+       {
+               uint8_t old;
+               unsigned int pos = console_row * 80 + console_col;
+               old = cr_read (0x0a);
+               if (state)
+                       cr_write (old & ~0x20, 0x0a);
+               else
+                       cr_write (old | 0x20, 0x0a);
+
+               cr_write (pos >> 8, 0x0e);
+               cr_write (pos & 0xFF, 0x0f);
+
+               return;
+       }
+
        if (cursor_state != state) {
                if (cursor_state) {
                        /* turn off the cursor */
@@ -704,6 +746,18 @@ static void memcpyl(int *d, int *s, int c)
 
 static void console_clear_line(int line, int begin, int end)
 {
+       if (vga_text)
+       {
+               begin /= VIDEO_FONT_WIDTH;
+               end /= VIDEO_FONT_WIDTH;
+               line /= VIDEO_FONT_HEIGHT;
+               for (; begin < end; begin++)
+               {
+                       ((uint16_t *)video_fb_address) [line * 80 + begin] = 
0x700 | ' ';
+               }
+               return;
+       }
+
 #ifdef VIDEO_HW_RECTFILL
        video_hw_rectfill(VIDEO_PIXEL_SIZE,             /* bytes per pixel */
                          VIDEO_FONT_WIDTH * begin,     /* dest pos x */
@@ -742,6 +796,15 @@ static void console_clear_line(int line, int begin, int 
end)
 static void console_scrollup(void)
 {
        /* copy up rows ignoring the first one */
+       if (vga_text)
+       {
+               int i;
+               memcpyl(video_fb_address, ((int32_t *)video_fb_address) + 80 / 
2,
+                       (80 * 24 * 2) >> 2);
+               for (i = 0; i < 80; i++)
+                       ((uint16_t *)video_fb_address) [24 * 80 + i] = 0x700 | 
' ';
+               return;
+       }
 
 #ifdef VIDEO_HW_BITBLT
        video_hw_bitblt(VIDEO_PIXEL_SIZE,       /* bytes per pixel */
@@ -779,6 +842,15 @@ static void console_back(void)
 
 static void console_clear(void)
 {
+       if (vga_text)
+       {
+               int i;
+               for (i = 0; i < 80 * 25; i++)
+                       ((uint16_t *)video_fb_address) [i] = 0x700 | ' ';
+
+               return;
+       }
+
 #ifdef VIDEO_HW_RECTFILL
        video_hw_rectfill(VIDEO_PIXEL_SIZE,     /* bytes per pixel */
                          0,                    /* dest pos x */
@@ -1446,6 +1518,9 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
 
        WATCHDOG_RESET();
 
+       if (vga_text)
+               return 0;
+
        if (!((bmp->header.signature[0] == 'B') &&
              (bmp->header.signature[1] == 'M'))) {
 
@@ -1846,6 +1921,9 @@ static void plot_logo_or_black(void *screen, int width, 
int x, int y, int black)
        unsigned char *source;
        unsigned char *dest;
 
+       if (vga_text)
+               return;
+
 #ifdef CONFIG_SPLASH_SCREEN_ALIGN
        if (x == BMP_ALIGN_CENTER)
                x = max(0, (VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH) / 2);
@@ -2113,9 +2191,24 @@ static int video_init(void)
 
        pGD = video_hw_init();
        if (pGD == NULL)
-               return -1;
+       {
+               vga_text = 1;
+               video_fb_address = (void *) 0xb8000;
+               cfb_do_flush_cache = 0;
+               console_col = 0;
+               console_row = 0;
+               video_logo_height = 0;
+               VIDEO_VISIBLE_ROWS = 25 * VIDEO_FONT_HEIGHT;
+               VIDEO_VISIBLE_COLS = 80 * VIDEO_FONT_WIDTH;
+               VIDEO_PIXEL_SIZE = 2;
+               return 0;
+       }
+
+       video_fb_address = (void *) pGD->frameAdrs;
+       VIDEO_VISIBLE_ROWS = pGD->winSizeY;
+       VIDEO_VISIBLE_COLS = pGD->winSizeX;
+       VIDEO_PIXEL_SIZE = (pGD->gdfBytesPP);
 
-       video_fb_address = (void *) VIDEO_FB_ADRS;
 #ifdef CONFIG_VIDEO_HW_CURSOR
        video_init_hw_cursor(VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT);
 #endif
@@ -2295,6 +2388,15 @@ void video_clear(void)
 {
        if (!video_fb_address)
                return;
+
+       if (vga_text)
+       {
+               int i;
+               for (i = 0; i < 80 * 25; i++)
+                       ((uint16_t *)video_fb_address) [i] = 0x700 | ' ';
+               return;
+       }
+
 #ifdef VIDEO_HW_RECTFILL
        video_hw_rectfill(VIDEO_PIXEL_SIZE,     /* bytes per pixel */
                          0,                    /* dest pos x */

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to