Browse Source

dm: video: use constants to refer to colors

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>
Reviewed-by: Simon Glass <sjg@chromium.org>
Heinrich Schuchardt 6 years ago
parent
commit
5c30fbb8ec
4 changed files with 89 additions and 31 deletions
  1. 32 23
      drivers/video/vidconsole-uclass.c
  2. 13 6
      drivers/video/video-uclass.c
  3. 9 2
      include/video.h
  4. 35 0
      include/video_console.h

+ 32 - 23
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;
 			}
 		}

+ 13 - 6
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);

+ 9 - 2
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

+ 35 - 0
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