[U-Boot] [PATCH v4 3/4] dm: video: use constants to refer to colors

Heinrich Schuchardt
2018-02-08T20:47:11Z

Use constants to refer to colors.
Adjust initialization of foreground and background color to avoid
setting reserved bits.
Consistently u32 instead of unsigned for color bit mask.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
v4
Fix a build warning, that was treated as an error in Travis testing
by conditional compling with CONFIG_DM_VIDEO.
v3
Use color constants for initalizing the console.
v2
no change
---
drivers/video/vidconsole-uclass.c | 55 +++++++++++++++++++++++----------------
drivers/video/video-uclass.c | 19 +++++++++-----
include/video.h | 11 ++++++--
include/video_console.h | 35 +++++++++++++++++++++++++
4 files changed, 89 insertions(+), 31 deletions(-)

diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index 8a2a377161f..d32b1017581 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -15,6 +15,15 @@
#include <video_console.h>
#include <video_font.h> /* Get font data, width and height */

+/*
+ * 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
#define CONFIG_CONSOLE_SCROLL_LINES 1
@@ -108,11 +117,7 @@ static void vidconsole_newline(struct udevice *dev)
video_sync(dev->parent);
}

-static const struct {
- unsigned r;
- unsigned g;
- unsigned b;
-} colors[] = {
+static const struct vid_rgb colors[VID_COLOR_COUNT] = {
{ 0x00, 0x00, 0x00 }, /* black */
{ 0xff, 0x00, 0x00 }, /* red */
{ 0x00, 0xff, 0x00 }, /* green */
@@ -123,22 +128,26 @@ static const struct {
{ 0xff, 0xff, 0xff }, /* white */
};

-static void set_color(struct video_priv *priv, unsigned idx, unsigned *c)
+u32 vid_console_color(struct video_priv *priv, unsigned int idx)
{
switch (priv->bpix) {
case VIDEO_BPP16:
- *c = ((colors[idx].r >> 3) << 11) |
- ((colors[idx].g >> 2) << 5) |
- ((colors[idx].b >> 3) << 0);
- break;
+ return ((colors[idx].r >> 3) << 11) |
+ ((colors[idx].g >> 2) << 5) |
+ ((colors[idx].b >> 3) << 0);
case VIDEO_BPP32:
- *c = (colors[idx].r << 16) |
- (colors[idx].g << 8) |
- (colors[idx].b << 0);
- break;
+ return (colors[idx].r << 16) |
+ (colors[idx].g << 8) |
+ (colors[idx].b << 0);
default:
- /* unsupported, leave current color in place */
- break;
+ /*
+ * For unknown bit arrangements just support
+ * black and white.
+ */
+ if (idx)
+ return 0xffffff; /* white */
+ else
+ return 0x000000; /* black */
}
}

@@ -270,17 +279,17 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)

switch (val) {
case 30 ... 37:
- /* fg color */
- set_color(vid_priv, val - 30,
- (unsigned *)&vid_priv->colour_fg);
+ /* foreground color */
+ vid_priv->colour_fg = vid_console_color(
+ vid_priv, val - 30);
break;
case 40 ... 47:
- /* bg color */
- set_color(vid_priv, val - 40,
- (unsigned *)&vid_priv->colour_bg);
+ /* background color */
+ vid_priv->colour_bg = vid_console_color(
+ vid_priv, val - 40);
break;
default:
- /* unknown/unsupported */
+ /* ignore unsupported SGR parameter */
break;
}
}
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
index 9a980ea3a1d..945b20ddfd7 100644
--- a/drivers/video/video-uclass.c
+++ b/drivers/video/video-uclass.c
@@ -114,6 +114,17 @@ void video_clear(struct udevice *dev)
}
}

+void video_set_default_colors(struct video_priv *priv)
+{
+#ifdef CONFIG_SYS_WHITE_ON_BLACK
+ priv->colour_fg = vid_console_color(priv, VID_WHITE);
+ priv->colour_bg = vid_console_color(priv, VID_BLACK);
+#else
+ priv->colour_fg = vid_console_color(priv, VID_BLACK);
+ priv->colour_bg = vid_console_color(priv, VID_WHITE);
+#endif
+}
+
/* Flush video activity to the caches */
void video_sync(struct udevice *vid)
{
@@ -203,12 +214,8 @@ static int video_post_probe(struct udevice *dev)
priv->line_length = priv->xsize * VNBYTES(priv->bpix);
priv->fb_size = priv->line_length * priv->ysize;

- /* Set up colours - we could in future support other colours */
-#ifdef CONFIG_SYS_WHITE_ON_BLACK
- priv->colour_fg = 0xffffff;
-#else
- priv->colour_bg = 0xffffff;
-#endif
+ /* Set up colors */
+ video_set_default_colors(priv);

if (!CONFIG_IS_ENABLED(NO_FB_CLEAR))
video_clear(dev);
diff --git a/include/video.h b/include/video.h
index 61ff6531215..841f3dc56b1 100644
--- a/include/video.h
+++ b/include/video.h
@@ -84,8 +84,8 @@ struct video_priv {
void *fb;
int fb_size;
int line_length;
- int colour_fg;
- int colour_bg;
+ u32 colour_fg;
+ u32 colour_bg;
bool flush_dcache;
ushort *cmap;
};
@@ -183,6 +183,13 @@ int video_get_ysize(struct udevice *dev);
*/
void video_set_flush_dcache(struct udevice *dev, bool flush);

+/**
+ * Set default colors and attributes
+ *
+ * @priv device information
+ */
+void video_set_default_colors(struct video_priv *priv);
+
#endif /* CONFIG_DM_VIDEO */

#ifndef CONFIG_DM_VIDEO
diff --git a/include/video_console.h b/include/video_console.h
index 9dce234bd92..656a47295f6 100644
--- a/include/video_console.h
+++ b/include/video_console.h
@@ -7,11 +7,29 @@
#ifndef __video_console_h
#define __video_console_h

+#include <video.h>
+
#define VID_FRAC_DIV 256

#define VID_TO_PIXEL(x) ((x) / VID_FRAC_DIV)
#define VID_TO_POS(x) ((x) * VID_FRAC_DIV)

+/*
+ * The 8 colors supported by the console
+ */
+enum color_idx {
+ VID_BLACK = 0,
+ VID_RED,
+ VID_GREEN,
+ VID_YELLOW,
+ VID_BLUE,
+ VID_MAGENTA,
+ VID_CYAN,
+ VID_WHITE,
+
+ VID_COLOR_COUNT
+};
+
/**
* struct vidconsole_priv - uclass-private data about a console device
*
@@ -196,4 +214,21 @@ int vidconsole_put_char(struct udevice *dev, char ch);
void vidconsole_position_cursor(struct udevice *dev, unsigned col,
unsigned row);

+#ifdef CONFIG_DM_VIDEO
+
+/**
+ * vid_console_color() - convert a color code to a pixel's internal
+ * representation
+ *
+ * The caller has to guarantee that the color index is less than
+ * VID_COLOR_COUNT.
+ *
+ * @priv private data of the console device
+ * @idx color index
+ * @return color value
+ */
+u32 vid_console_color(struct video_priv *priv, unsigned int idx);
+
+#endif
+
#endif
--
2.14.2