[PATCH 1/3] video: Add 30bpp support

Mark Kettenis kettenis at openbsd.org
Thu Sep 16 15:01:15 CEST 2021


Add support for 30bpp mode where pixels are picked in 32-bit
integers but use 10 bits instead of 8 bits for each component.

Signed-off-by: Mark Kettenis <kettenis at openbsd.org>
---
 drivers/video/console_normal.c    | 2 ++
 drivers/video/console_rotate.c    | 6 ++++++
 drivers/video/console_truetype.c  | 3 +++
 drivers/video/vidconsole-uclass.c | 7 +++++++
 drivers/video/video-uclass.c      | 1 +
 include/video.h                   | 1 +
 6 files changed, 20 insertions(+)

diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
index 04f022491e..e0b89cbb93 100644
--- a/drivers/video/console_normal.c
+++ b/drivers/video/console_normal.c
@@ -41,6 +41,7 @@ static int console_normal_set_row(struct udevice *dev, uint row, int clr)
 			end = dst;
 			break;
 		}
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 		if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 			uint32_t *dst = line;
@@ -126,6 +127,7 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
index 36c8d0609d..bf81b80a39 100644
--- a/drivers/video/console_rotate.c
+++ b/drivers/video/console_rotate.c
@@ -40,6 +40,7 @@ static int console_set_row_1(struct udevice *dev, uint row, int clr)
 					*dst++ = clr;
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -128,6 +129,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -183,6 +185,7 @@ static int console_set_row_2(struct udevice *dev, uint row, int clr)
 			end = dst;
 			break;
 		}
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 		if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 			uint32_t *dst = line;
@@ -266,6 +269,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -318,6 +322,7 @@ static int console_set_row_3(struct udevice *dev, uint row, int clr)
 					*dst++ = clr;
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
@@ -402,6 +407,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
 				}
 				break;
 			}
+		case VIDEO_BPP30:
 		case VIDEO_BPP32:
 			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 				uint32_t *dst = line;
diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index 98427f4c61..0195d996de 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -153,6 +153,7 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
 	}
 #endif
 #ifdef CONFIG_VIDEO_BPP32
+	case VIDEO_BPP30:
 	case VIDEO_BPP32: {
 		u32 *dst = line;
 
@@ -299,6 +300,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
 		}
 #endif
 #ifdef CONFIG_VIDEO_BPP32
+		case VIDEO_BPP30:
 		case VIDEO_BPP32: {
 			u32 *dst = (u32 *)line + xoff;
 			int i;
@@ -381,6 +383,7 @@ static int console_truetype_erase(struct udevice *dev, int xstart, int ystart,
 		}
 #endif
 #ifdef CONFIG_VIDEO_BPP32
+		case VIDEO_BPP30:
 		case VIDEO_BPP32: {
 			uint32_t *dst = line;
 
diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index 8132efa55a..cc274b45fe 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -153,6 +153,13 @@ u32 vid_console_color(struct video_priv *priv, unsigned int idx)
 			       ((colors[idx].b >> 3) <<  0);
 		}
 		break;
+	case VIDEO_BPP30:
+		if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
+			return (colors[idx].r << 22) |
+			       (colors[idx].g << 12) |
+			       (colors[idx].b <<  2);
+		}
+		break;
 	case VIDEO_BPP32:
 		if (CONFIG_IS_ENABLED(VIDEO_BPP32)) {
 			return (colors[idx].r << 16) |
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
index 9f8cf6ef2a..28bf701f41 100644
--- a/drivers/video/video-uclass.c
+++ b/drivers/video/video-uclass.c
@@ -129,6 +129,7 @@ int video_clear(struct udevice *dev)
 				*ppix++ = priv->colour_bg;
 			break;
 		}
+	case VIDEO_BPP30:
 	case VIDEO_BPP32:
 		if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
 			u32 *ppix = priv->fb;
diff --git a/include/video.h b/include/video.h
index 827733305e..04c636b317 100644
--- a/include/video.h
+++ b/include/video.h
@@ -53,6 +53,7 @@ enum video_log2_bpp {
 	VIDEO_BPP4,
 	VIDEO_BPP8,
 	VIDEO_BPP16,
+	VIDEO_BPP30,
 	VIDEO_BPP32,
 };
 
-- 
2.33.0



More information about the U-Boot mailing list