1*83510766SSimon Glass /* 2*83510766SSimon Glass * Copyright (c) 2015 Google, Inc 3*83510766SSimon Glass * 4*83510766SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 5*83510766SSimon Glass */ 6*83510766SSimon Glass 7*83510766SSimon Glass #ifndef __video_console_h 8*83510766SSimon Glass #define __video_console_h 9*83510766SSimon Glass 10*83510766SSimon Glass /** 11*83510766SSimon Glass * struct vidconsole_priv - uclass-private data about a console device 12*83510766SSimon Glass * 13*83510766SSimon Glass * @sdev: stdio device, acting as an output sink 14*83510766SSimon Glass * @curr_col: Current text column (0=left) 15*83510766SSimon Glass * @curr_row: Current row (0=top) 16*83510766SSimon Glass * @rows: Number of text rows 17*83510766SSimon Glass * @cols: Number of text columns 18*83510766SSimon Glass */ 19*83510766SSimon Glass struct vidconsole_priv { 20*83510766SSimon Glass struct stdio_dev sdev; 21*83510766SSimon Glass int curr_col; 22*83510766SSimon Glass int curr_row; 23*83510766SSimon Glass int rows; 24*83510766SSimon Glass int cols; 25*83510766SSimon Glass }; 26*83510766SSimon Glass 27*83510766SSimon Glass /** 28*83510766SSimon Glass * struct vidconsole_ops - Video console operations 29*83510766SSimon Glass * 30*83510766SSimon Glass * These operations work on either an absolute console position (measured 31*83510766SSimon Glass * in pixels) or a text row number (measured in rows, where each row consists 32*83510766SSimon Glass * of an entire line of text - typically 16 pixels). 33*83510766SSimon Glass */ 34*83510766SSimon Glass struct vidconsole_ops { 35*83510766SSimon Glass /** 36*83510766SSimon Glass * putc_xy() - write a single character to a position 37*83510766SSimon Glass * 38*83510766SSimon Glass * @dev: Device to write to 39*83510766SSimon Glass * @x: Pixel X position (0=left-most pixel) 40*83510766SSimon Glass * @y: Pixel Y position (0=top-most pixel) 41*83510766SSimon Glass * @ch: Character to write 42*83510766SSimon Glass * @return 0 if OK, -ve on error 43*83510766SSimon Glass */ 44*83510766SSimon Glass int (*putc_xy)(struct udevice *dev, uint x, uint y, char ch); 45*83510766SSimon Glass 46*83510766SSimon Glass /** 47*83510766SSimon Glass * move_rows() - Move text rows from one place to another 48*83510766SSimon Glass * 49*83510766SSimon Glass * @dev: Device to adjust 50*83510766SSimon Glass * @rowdst: Destination text row (0=top) 51*83510766SSimon Glass * @rowsrc: Source start text row 52*83510766SSimon Glass * @count: Number of text rows to move 53*83510766SSimon Glass * @return 0 if OK, -ve on error 54*83510766SSimon Glass */ 55*83510766SSimon Glass int (*move_rows)(struct udevice *dev, uint rowdst, uint rowsrc, 56*83510766SSimon Glass uint count); 57*83510766SSimon Glass 58*83510766SSimon Glass /** 59*83510766SSimon Glass * set_row() - Set the colour of a text row 60*83510766SSimon Glass * 61*83510766SSimon Glass * Every pixel contained within the text row is adjusted 62*83510766SSimon Glass * 63*83510766SSimon Glass * @dev: Device to adjust 64*83510766SSimon Glass * @row: Text row to adjust (0=top) 65*83510766SSimon Glass * @clr: Raw colour (pixel value) to write to each pixel 66*83510766SSimon Glass * @return 0 if OK, -ve on error 67*83510766SSimon Glass */ 68*83510766SSimon Glass int (*set_row)(struct udevice *dev, uint row, int clr); 69*83510766SSimon Glass }; 70*83510766SSimon Glass 71*83510766SSimon Glass /* Get a pointer to the driver operations for a video console device */ 72*83510766SSimon Glass #define vidconsole_get_ops(dev) ((struct vidconsole_ops *)(dev)->driver->ops) 73*83510766SSimon Glass 74*83510766SSimon Glass /** 75*83510766SSimon Glass * vidconsole_putc_xy() - write a single character to a position 76*83510766SSimon Glass * 77*83510766SSimon Glass * @dev: Device to write to 78*83510766SSimon Glass * @x: Pixel X position (0=left-most pixel) 79*83510766SSimon Glass * @y: Pixel Y position (0=top-most pixel) 80*83510766SSimon Glass * @ch: Character to write 81*83510766SSimon Glass * @return 0 if OK, -ve on error 82*83510766SSimon Glass */ 83*83510766SSimon Glass int vidconsole_putc_xy(struct udevice *dev, uint x, uint y, char ch); 84*83510766SSimon Glass 85*83510766SSimon Glass /** 86*83510766SSimon Glass * vidconsole_move_rows() - Move text rows from one place to another 87*83510766SSimon Glass * 88*83510766SSimon Glass * @dev: Device to adjust 89*83510766SSimon Glass * @rowdst: Destination text row (0=top) 90*83510766SSimon Glass * @rowsrc: Source start text row 91*83510766SSimon Glass * @count: Number of text rows to move 92*83510766SSimon Glass * @return 0 if OK, -ve on error 93*83510766SSimon Glass */ 94*83510766SSimon Glass int vidconsole_move_rows(struct udevice *dev, uint rowdst, uint rowsrc, 95*83510766SSimon Glass uint count); 96*83510766SSimon Glass 97*83510766SSimon Glass /** 98*83510766SSimon Glass * vidconsole_set_row() - Set the colour of a text row 99*83510766SSimon Glass * 100*83510766SSimon Glass * Every pixel contained within the text row is adjusted 101*83510766SSimon Glass * 102*83510766SSimon Glass * @dev: Device to adjust 103*83510766SSimon Glass * @row: Text row to adjust (0=top) 104*83510766SSimon Glass * @clr: Raw colour (pixel value) to write to each pixel 105*83510766SSimon Glass * @return 0 if OK, -ve on error 106*83510766SSimon Glass */ 107*83510766SSimon Glass int vidconsole_set_row(struct udevice *dev, uint row, int clr); 108*83510766SSimon Glass 109*83510766SSimon Glass /** 110*83510766SSimon Glass * vidconsole_put_char() - Output a character to the current console position 111*83510766SSimon Glass * 112*83510766SSimon Glass * Outputs a character to the console and advances the cursor. This function 113*83510766SSimon Glass * handles wrapping to new lines and scrolling the console. Special 114*83510766SSimon Glass * characters are handled also: \n, \r, \b and \t. 115*83510766SSimon Glass * 116*83510766SSimon Glass * The device always starts with the cursor at position 0,0 (top left). It 117*83510766SSimon Glass * can be adjusted manually using vidconsole_position_cursor(). 118*83510766SSimon Glass * 119*83510766SSimon Glass * @dev: Device to adjust 120*83510766SSimon Glass * @ch: Character to write 121*83510766SSimon Glass * @return 0 if OK, -ve on error 122*83510766SSimon Glass */ 123*83510766SSimon Glass int vidconsole_put_char(struct udevice *dev, char ch); 124*83510766SSimon Glass 125*83510766SSimon Glass /** 126*83510766SSimon Glass * vidconsole_position_cursor() - Move the text cursor 127*83510766SSimon Glass * 128*83510766SSimon Glass * @dev: Device to adjust 129*83510766SSimon Glass * @col: New cursor text column 130*83510766SSimon Glass * @row: New cursor text row 131*83510766SSimon Glass * @return 0 if OK, -ve on error 132*83510766SSimon Glass */ 133*83510766SSimon Glass void vidconsole_position_cursor(struct udevice *dev, unsigned col, 134*83510766SSimon Glass unsigned row); 135*83510766SSimon Glass 136*83510766SSimon Glass #endif 137