mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-30 16:39:35 +00:00
83510766c9
The existing LCD/video interface suffers from conflating the bitmap display with text output on that display. As a result the implementation is more complex than it needs to me. We can support multiple text console drivers. Create a separate uclass to support this, with its own API. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Anatolij Gustschin <agust@denx.de>
136 lines
3.7 KiB
C
136 lines
3.7 KiB
C
/*
|
|
* Copyright (c) 2015 Google, Inc
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#ifndef __video_console_h
|
|
#define __video_console_h
|
|
|
|
/**
|
|
* struct vidconsole_priv - uclass-private data about a console device
|
|
*
|
|
* @sdev: stdio device, acting as an output sink
|
|
* @curr_col: Current text column (0=left)
|
|
* @curr_row: Current row (0=top)
|
|
* @rows: Number of text rows
|
|
* @cols: Number of text columns
|
|
*/
|
|
struct vidconsole_priv {
|
|
struct stdio_dev sdev;
|
|
int curr_col;
|
|
int curr_row;
|
|
int rows;
|
|
int cols;
|
|
};
|
|
|
|
/**
|
|
* struct vidconsole_ops - Video console operations
|
|
*
|
|
* These operations work on either an absolute console position (measured
|
|
* in pixels) or a text row number (measured in rows, where each row consists
|
|
* of an entire line of text - typically 16 pixels).
|
|
*/
|
|
struct vidconsole_ops {
|
|
/**
|
|
* putc_xy() - write a single character to a position
|
|
*
|
|
* @dev: Device to write to
|
|
* @x: Pixel X position (0=left-most pixel)
|
|
* @y: Pixel Y position (0=top-most pixel)
|
|
* @ch: Character to write
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
int (*putc_xy)(struct udevice *dev, uint x, uint y, char ch);
|
|
|
|
/**
|
|
* move_rows() - Move text rows from one place to another
|
|
*
|
|
* @dev: Device to adjust
|
|
* @rowdst: Destination text row (0=top)
|
|
* @rowsrc: Source start text row
|
|
* @count: Number of text rows to move
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
int (*move_rows)(struct udevice *dev, uint rowdst, uint rowsrc,
|
|
uint count);
|
|
|
|
/**
|
|
* set_row() - Set the colour of a text row
|
|
*
|
|
* Every pixel contained within the text row is adjusted
|
|
*
|
|
* @dev: Device to adjust
|
|
* @row: Text row to adjust (0=top)
|
|
* @clr: Raw colour (pixel value) to write to each pixel
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
int (*set_row)(struct udevice *dev, uint row, int clr);
|
|
};
|
|
|
|
/* Get a pointer to the driver operations for a video console device */
|
|
#define vidconsole_get_ops(dev) ((struct vidconsole_ops *)(dev)->driver->ops)
|
|
|
|
/**
|
|
* vidconsole_putc_xy() - write a single character to a position
|
|
*
|
|
* @dev: Device to write to
|
|
* @x: Pixel X position (0=left-most pixel)
|
|
* @y: Pixel Y position (0=top-most pixel)
|
|
* @ch: Character to write
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
int vidconsole_putc_xy(struct udevice *dev, uint x, uint y, char ch);
|
|
|
|
/**
|
|
* vidconsole_move_rows() - Move text rows from one place to another
|
|
*
|
|
* @dev: Device to adjust
|
|
* @rowdst: Destination text row (0=top)
|
|
* @rowsrc: Source start text row
|
|
* @count: Number of text rows to move
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
int vidconsole_move_rows(struct udevice *dev, uint rowdst, uint rowsrc,
|
|
uint count);
|
|
|
|
/**
|
|
* vidconsole_set_row() - Set the colour of a text row
|
|
*
|
|
* Every pixel contained within the text row is adjusted
|
|
*
|
|
* @dev: Device to adjust
|
|
* @row: Text row to adjust (0=top)
|
|
* @clr: Raw colour (pixel value) to write to each pixel
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
int vidconsole_set_row(struct udevice *dev, uint row, int clr);
|
|
|
|
/**
|
|
* vidconsole_put_char() - Output a character to the current console position
|
|
*
|
|
* Outputs a character to the console and advances the cursor. This function
|
|
* handles wrapping to new lines and scrolling the console. Special
|
|
* characters are handled also: \n, \r, \b and \t.
|
|
*
|
|
* The device always starts with the cursor at position 0,0 (top left). It
|
|
* can be adjusted manually using vidconsole_position_cursor().
|
|
*
|
|
* @dev: Device to adjust
|
|
* @ch: Character to write
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
int vidconsole_put_char(struct udevice *dev, char ch);
|
|
|
|
/**
|
|
* vidconsole_position_cursor() - Move the text cursor
|
|
*
|
|
* @dev: Device to adjust
|
|
* @col: New cursor text column
|
|
* @row: New cursor text row
|
|
* @return 0 if OK, -ve on error
|
|
*/
|
|
void vidconsole_position_cursor(struct udevice *dev, unsigned col,
|
|
unsigned row);
|
|
|
|
#endif
|