]> git.sur5r.net Git - u-boot/blobdiff - drivers/video/vidconsole-uclass.c
mtd: spi: Correct parameters for s25fs512s flash
[u-boot] / drivers / video / vidconsole-uclass.c
index 37eb2a0ef46da513f6565b9706545a9ec9a6be15..f1d3ad36118112759fab46a9ad4670bcb420842f 100644 (file)
@@ -1,11 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (c) 2015 Google, Inc
  * (C) Copyright 2001-2015
  * DENX Software Engineering -- wd@denx.de
  * Compulab Ltd - http://compulab.co.il/
  * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <dm.h>
 #include <video.h>
 #include <video_console.h>
-#include <video_font.h>                /* Get font data, width and height */
+#include <video_font.h>                /* Bitmap font for code page 437 */
+
+/*
+ * Structure to describe a console color
+ */
+struct vid_rgb {
+       u32 r;
+       u32 g;
+       u32 b;
+};
 
 /* By default we scroll by a single line */
 #ifndef CONFIG_CONSOLE_SCROLL_LINES
@@ -108,6 +116,48 @@ static void vidconsole_newline(struct udevice *dev)
        video_sync(dev->parent);
 }
 
+static const struct vid_rgb colors[VID_COLOR_COUNT] = {
+       { 0x00, 0x00, 0x00 },  /* black */
+       { 0xc0, 0x00, 0x00 },  /* red */
+       { 0x00, 0xc0, 0x00 },  /* green */
+       { 0xc0, 0x60, 0x00 },  /* brown */
+       { 0x00, 0x00, 0xc0 },  /* blue */
+       { 0xc0, 0x00, 0xc0 },  /* magenta */
+       { 0x00, 0xc0, 0xc0 },  /* cyan */
+       { 0xc0, 0xc0, 0xc0 },  /* light gray */
+       { 0x80, 0x80, 0x80 },  /* gray */
+       { 0xff, 0x00, 0x00 },  /* bright red */
+       { 0x00, 0xff, 0x00 },  /* bright green */
+       { 0xff, 0xff, 0x00 },  /* yellow */
+       { 0x00, 0x00, 0xff },  /* bright blue */
+       { 0xff, 0x00, 0xff },  /* bright magenta */
+       { 0x00, 0xff, 0xff },  /* bright cyan */
+       { 0xff, 0xff, 0xff },  /* white */
+};
+
+u32 vid_console_color(struct video_priv *priv, unsigned int idx)
+{
+       switch (priv->bpix) {
+       case VIDEO_BPP16:
+               return ((colors[idx].r >> 3) << 11) |
+                      ((colors[idx].g >> 2) <<  5) |
+                      ((colors[idx].b >> 3) <<  0);
+       case VIDEO_BPP32:
+               return (colors[idx].r << 16) |
+                      (colors[idx].g <<  8) |
+                      (colors[idx].b <<  0);
+       default:
+               /*
+                * For unknown bit arrangements just support
+                * black and white.
+                */
+               if (idx)
+                       return 0xffffff; /* white */
+               else
+                       return 0x000000; /* black */
+       }
+}
+
 static char *parsenum(char *s, int *num)
 {
        char *end;
@@ -194,6 +244,77 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
                }
                break;
        }
+       case 'm': {
+               struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
+               char *s = priv->escape_buf;
+               char *end = &priv->escape_buf[priv->escape_len];
+
+               /*
+                * Set graphics mode: [%d;...;%dm
+                *
+                * Currently only supports the color attributes:
+                *
+                * Foreground Colors:
+                *
+                *   30 Black
+                *   31 Red
+                *   32 Green
+                *   33 Yellow
+                *   34 Blue
+                *   35 Magenta
+                *   36 Cyan
+                *   37 White
+                *
+                * Background Colors:
+                *
+                *   40 Black
+                *   41 Red
+                *   42 Green
+                *   43 Yellow
+                *   44 Blue
+                *   45 Magenta
+                *   46 Cyan
+                *   47 White
+                */
+
+               s++;    /* [ */
+               while (s < end) {
+                       int val;
+
+                       s = parsenum(s, &val);
+                       s++;
+
+                       switch (val) {
+                       case 0:
+                               /* all attributes off */
+                               video_set_default_colors(vid_priv);
+                               break;
+                       case 1:
+                               /* bold */
+                               vid_priv->fg_col_idx |= 8;
+                               vid_priv->colour_fg = vid_console_color(
+                                               vid_priv, vid_priv->fg_col_idx);
+                               break;
+                       case 30 ... 37:
+                               /* foreground color */
+                               vid_priv->fg_col_idx &= ~7;
+                               vid_priv->fg_col_idx |= val - 30;
+                               vid_priv->colour_fg = vid_console_color(
+                                               vid_priv, vid_priv->fg_col_idx);
+                               break;
+                       case 40 ... 47:
+                               /* background color */
+                               vid_priv->colour_bg = vid_console_color(
+                                                       vid_priv, val - 40);
+                               break;
+                       default:
+                               /* ignore unsupported SGR parameter */
+                               break;
+                       }
+               }
+
+               break;
+       }
        default:
                debug("unrecognized escape sequence: %*s\n",
                      priv->escape_len, priv->escape_buf);