diff options
-rw-r--r-- | drivers/video/vidconsole-uclass.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c index 61f4216750f..1225de23332 100644 --- a/drivers/video/vidconsole-uclass.c +++ b/drivers/video/vidconsole-uclass.c @@ -126,14 +126,26 @@ void vidconsole_set_cursor_pos(struct udevice *dev, int x, int y) priv->ycur = y; } -void vidconsole_position_cursor(struct udevice *dev, uint col, uint row) +/** + * set_cursor_position() - set cursor position + * + * @priv: private data of the video console + * @row: new row + * @col: new column + */ +static void set_cursor_position(struct vidconsole_priv *priv, int row, int col) { - struct vidconsole_priv *priv = dev_get_uclass_priv(dev); - short x, y; - - x = min_t(short, col, priv->cols - 1) * priv->x_charsize; - y = min_t(short, row, priv->rows - 1) * priv->y_charsize; - vidconsole_set_cursor_pos(dev, x, y); + /* + * Ensure we stay in the bounds of the screen. + */ + if (row >= priv->rows) + row = priv->rows - 1; + if (col >= priv->cols) + col = priv->cols - 1; + + priv->ycur = row * priv->y_charsize; + priv->xcur_frac = priv->xstart_frac + + VID_TO_POS(col * priv->x_charsize); } /** @@ -180,7 +192,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch) int row = priv->row_saved; int col = priv->col_saved; - vidconsole_position_cursor(dev, col, row); + set_cursor_position(priv, row, col); priv->escape = 0; return; } @@ -242,7 +254,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch) if (row < 0) row = 0; /* Right and bottom overflows are handled in the callee. */ - vidconsole_position_cursor(dev, col, row); + set_cursor_position(priv, row, col); break; } case 'H': @@ -266,7 +278,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch) if (col) --col; - vidconsole_position_cursor(dev, col, row); + set_cursor_position(priv, row, col); break; } @@ -655,3 +667,15 @@ int vidconsole_clear_and_reset(struct udevice *dev) return 0; } + +void vidconsole_position_cursor(struct udevice *dev, unsigned col, unsigned row) +{ + struct vidconsole_priv *priv = dev_get_uclass_priv(dev); + struct udevice *vid_dev = dev->parent; + struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev); + short x, y; + + x = min_t(short, col * priv->x_charsize, vid_priv->xsize - 1); + y = min_t(short, row * priv->y_charsize, vid_priv->ysize - 1); + vidconsole_set_cursor_pos(dev, x, y); +} |