blob: c0fc79273a5b41be2a6d7d39eaca6e2b64eed9d8 [file] [log] [blame]
/*
* 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