xref: /rk3399_rockchip-uboot/include/video_console.h (revision 83510766c90a52e58477267704fc5ca8f75c3dab)
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