Some devices offer a text-based OSD (on-screen display) that can be
programmatically controlled (i.e. text displayed on).

Add a uclass to support such devices.

Signed-off-by: Mario Six <mario....@gdsys.cc>

---

v1 -> v2:
* Use singular case for UCLASS_VIDEO_OSD description
* Expanded description of video_osd_set_mem with example
* Replaced all left-over mentions of pixels with text
* Renamed x and y parameters to col and row
* Expaneded description of color parameter
* Added general description of the OSD uclass
* Expanded description of video_osd_info

---
 drivers/video/Kconfig            |   8 ++
 drivers/video/Makefile           |   2 +
 drivers/video/video_osd-uclass.c |  46 ++++++++++
 include/dm/uclass-id.h           |   1 +
 include/video_osd.h              | 193 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 250 insertions(+)
 create mode 100644 drivers/video/video_osd-uclass.c
 create mode 100644 include/video_osd.h

diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 4c4d2861fe7..37be23d2fcc 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -658,4 +658,12 @@ config VIDEO_DT_SIMPLEFB
          The video output is initialized by U-Boot, and kept by the
          kernel.

+config OSD
+       bool "Enable OSD support"
+       depends on DM
+       default n
+       help
+          This supports drivers that provide a OSD (on-screen display), which
+          is a (usually text-oriented) graphics buffer to show information on
+          a display.
 endmenu
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index cf7ad281c3b..1889c5a5208 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -55,5 +55,7 @@ obj-${CONFIG_EXYNOS_FB} += exynos/
 obj-${CONFIG_VIDEO_ROCKCHIP} += rockchip/
 obj-${CONFIG_VIDEO_STM32} += stm32/

+obj-${CONFIG_OSD} += video_osd-uclass.o
+
 obj-y += bridge/
 obj-y += sunxi/
diff --git a/drivers/video/video_osd-uclass.c b/drivers/video/video_osd-uclass.c
new file mode 100644
index 00000000000..ae9b6a6fa82
--- /dev/null
+++ b/drivers/video/video_osd-uclass.c
@@ -0,0 +1,46 @@
+/*
+ * (C) Copyright 2017
+ * Mario Six,  Guntermann & Drunck GmbH, mario....@gdsys.cc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <video_osd.h>
+
+int video_osd_get_info(struct udevice *dev, struct video_osd_info *info)
+{
+       struct video_osd_ops *ops = video_osd_get_ops(dev);
+
+       return ops->get_info(dev, info);
+}
+
+int video_osd_set_mem(struct udevice *dev, uint col, uint row, u8 *buf,
+                     size_t buflen, uint count)
+{
+       struct video_osd_ops *ops = video_osd_get_ops(dev);
+
+       return ops->set_mem(dev, col, row, buf, buflen, count);
+}
+
+int video_osd_set_size(struct udevice *dev, uint col, uint row)
+{
+       struct video_osd_ops *ops = video_osd_get_ops(dev);
+
+       return ops->set_size(dev, col, row);
+}
+
+int video_osd_print(struct udevice *dev, uint col, uint row, ulong color,
+                   char *text)
+{
+       struct video_osd_ops *ops = video_osd_get_ops(dev);
+
+       return ops->print(dev, col, row, color, text);
+}
+
+UCLASS_DRIVER(video_osd) = {
+       .id             = UCLASS_VIDEO_OSD,
+       .name           = "video_osd",
+       .flags          = DM_UC_FLAG_SEQ_ALIAS,
+};
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index d7f9df3583a..e42f8481bf8 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -89,6 +89,7 @@ enum uclass_id {
        UCLASS_VIDEO,           /* Video or LCD device */
        UCLASS_VIDEO_BRIDGE,    /* Video bridge, e.g. DisplayPort to LVDS */
        UCLASS_VIDEO_CONSOLE,   /* Text console driver for video device */
+       UCLASS_VIDEO_OSD,       /* On-screen display */
        UCLASS_WDT,             /* Watchdot Timer driver */

        UCLASS_COUNT,
diff --git a/include/video_osd.h b/include/video_osd.h
new file mode 100644
index 00000000000..c3bcd3a4fd8
--- /dev/null
+++ b/include/video_osd.h
@@ -0,0 +1,193 @@
+/*
+ * (C) Copyright 2017
+ * Mario Six,  Guntermann & Drunck GmbH, mario....@gdsys.cc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _VIDEO_OSD_H_
+#define _VIDEO_OSD_H_
+
+struct video_osd_info {
+       /* The width of the OSD display in columns */
+       uint width;
+       /* The height of the OSD display in rows */
+       uint height;
+       /* The major version of the OSD device */
+       uint major_version;
+       /* The minor version of the OSD device */
+       uint minor_version;
+};
+
+/**
+ * struct video_osd_ops - driver operations for OSD uclass
+ *
+ * The OSD uclass implements support for text-oriented on-screen displays,
+ * which are taken to be devices that independently display a graphical
+ * text-based overlay over the video output of an associated display.
+ *
+ * The functions defined by the uclass support writing text to the display in
+ * either a generic form (by specifying a string, a driver-specific color value
+ * for the text, and screen coordinates in rows and columns) or a
+ * driver-specific form (by specifying "raw" driver-specific data to display at
+ * a given coordinate).
+ *
+ * Functions to read device information and set the size of the virtual OSD
+ * screen (in rows and columns) are also supported.
+ *
+ * Drivers should support these operations unless otherwise noted. These
+ * operations are intended to be used by uclass code, not directly from
+ * other code.
+ */
+struct video_osd_ops {
+       /**
+        * get_info() - Get information about a OSD instance
+        *
+        * A OSD instance may keep some internal data about itself. This
+        * function can be used to access this data.
+        *
+        * @dev:        OSD instance to query.
+        * @info:       Pointer to a structure that takes the information read
+        *              from the OSD instance.
+        * @return 0 if OK, -ve on error.
+        */
+       int (*get_info)(struct udevice *dev, struct video_osd_info *info);
+
+       /**
+        * set_mem() - Write driver-specific text data to OSD screen
+        *
+        * The passed data are device-specific, and it's up to the driver how
+        * to interpret them. How the count parameter is interpreted is also
+        * driver-specific; most likely the given data will be written to the
+        * OSD count times back-to-back, which is e.g. convenient for filling
+        * areas of the OSD with a single character.
+        *
+        * For example a invocation of
+        *
+        * video_osd_set_mem(dev, 0, 0, "A", 1, 10);
+        *
+        * will write the device-specific text data "A" to the positions (0, 0)
+        * to (9, 0) on the OSD.
+        *
+        * Device-specific text data may, e.g. be a special encoding of glyphs
+        * to display and color values in binary format.
+        *
+        * @dev:        OSD instance to write to.
+        * @col:        Horizontal character coordinate to write to.
+        * @row         Vertical character coordinate to write to.
+        * @buf:        Array containing device-specific data to write to the
+        *              specified coordinate on the OSD screen.
+        * @buflen:     Length of the data in the passed buffer (in byte).
+        * @count:      Write count many repetitions of the given text data
+        * @return 0 if OK, -ve on error.
+        */
+       int (*set_mem)(struct udevice *dev, uint col, uint row, u8 *buf,
+                      size_t buflen, uint count);
+
+       /**
+        * set_size() - Set the position and dimension of the OSD's
+        *              writeable window
+        *
+        * @dev:        OSD instance to write to.
+        * @col         The number of characters in the window's columns
+        * @row         The number of characters in the window's rows
+        * @return 0 if OK, -ve on error.
+        */
+       int (*set_size)(struct udevice *dev, uint col, uint row);
+
+       /**
+        * print() - Print a string in a given color to specified coordinates
+        *           on the OSD
+        *
+        * @dev:        OSD instance to write to.
+        * @col         The x-coordinate of the position the string should be
+        *              written to
+        * @row         The y-coordinate of the position the string should be
+        *              written to
+        * @color:      The color in which the specified string should be
+        *              printed; the interpretation of the value is
+        *              driver-specific, and possible values should be defined
+        *              e.g. in a driver include file.
+        * @text:       The string data that should be printed on the OSD
+        * @return 0 if OK, -ve on error.
+        */
+       int (*print)(struct udevice *dev, uint col, uint row, ulong color,
+                    char *text);
+};
+
+#define video_osd_get_ops(dev) ((struct video_osd_ops *)(dev)->driver->ops)
+
+/**
+ * video_osd_get_info() - Get information about a OSD instance
+ *
+ * A OSD instance may keep some internal data about itself. This function can
+ * be used to access this data.
+ *
+ * @dev:       OSD instance to query.
+ * @info:      Pointer to a structure that takes the information read from the
+ *             OSD instance.
+ * @return 0 if OK, -ve on error.
+ */
+int video_osd_get_info(struct udevice *dev, struct video_osd_info *info);
+
+/**
+ * video_osd_set_mem() - Write text data to OSD memory
+ *
+ * The passed data are device-specific, and it's up to the driver how to
+ * interpret them. How the count parameter is interpreted is also
+ * driver-specific; most likely the given data will be written to the OSD count
+ * times back-to-back, which is e.g. convenient for filling areas of the OSD
+ * with a single character.
+ *
+ * For example a invocation of
+ *
+ * video_osd_set_mem(dev, 0, 0, "A", 1, 10);
+ *
+ * will write the device-specific text data "A" to the positions (0, 0) to (9,
+ * 0) on the OSD.
+ *
+ * Device-specific text data may, e.g. be a special encoding of glyphs to
+ * display and color values in binary format.
+ *
+ * @dev:       OSD instance to write to.
+ * @col:       Horizontal character coordinate to write to.
+ * @row                Vertical character coordinate to write to.
+ * @buf:       Array containing device-specific data to write to the specified
+ *             coordinate on the OSD screen.
+ * @buflen:    Length of the data in the passed buffer (in byte).
+ * @count:     Write count many repetitions of the given text data
+ * @return 0 if OK, -ve on error.
+ */
+int video_osd_set_mem(struct udevice *dev, uint col, uint row, u8 *buf,
+                     size_t buflen, uint count);
+
+/**
+ * video_osd_set_size() - Set the position and dimension of the OSD's
+ *              writeable window
+ *
+ * @dev:       OSD instance to write to.
+ * @col                The number of characters in the window's columns
+ * @row                The number of characters in the window's rows
+ * @return 0 if OK, -ve on error.
+ */
+int video_osd_set_size(struct udevice *dev, uint col, uint row);
+
+/**
+ * video_osd_print() - Print a string in a given color to specified coordinates
+ *                    on the OSD
+ *
+ * @dev:       OSD instance to write to.
+ * @col                The x-coordinate of the position the string should be 
written
+ *             to
+ * @row                The y-coordinate of the position the string should be 
written
+ *             to
+ * @color:     The color in which the specified string should be printed; the
+ *             interpretation of the value is driver-specific, and possible
+ *             values should be defined e.g. in a driver include file.
+ * @text:      The string data that should be printed on the OSD
+ * @return 0 if OK, -ve on error.
+ */
+int video_osd_print(struct udevice *dev, uint col, uint row, ulong color,
+                   char *text);
+
+#endif /* !_VIDEO_OSD_H_ */
--
2.11.0

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

Reply via email to