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