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. Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Mario Six <mario.six@gdsys.cc>lime2-spi
parent
662f381aad
commit
39a336f116
@ -0,0 +1,45 @@ |
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2017 |
||||||
|
* Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc |
||||||
|
*/ |
||||||
|
|
||||||
|
#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, |
||||||
|
}; |
@ -0,0 +1,192 @@ |
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */ |
||||||
|
/*
|
||||||
|
* (C) Copyright 2017 |
||||||
|
* Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc |
||||||
|
*/ |
||||||
|
|
||||||
|
#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_ */ |
Loading…
Reference in new issue