@@ -68,7 +68,8 @@ int at91_video_show_board_info(void)
priv = dev_get_uclass_priv(con);
vidconsole_position_cursor(con, 0, (logo_info.logo_height +
- priv->y_charsize - 1) / priv->y_charsize);
+ priv->ctx.y_charsize - 1) /
+ priv->ctx.y_charsize);
for (s = buf, i = 0; i < len; s++, i++)
vidconsole_put_char(con, *s);
@@ -176,7 +176,7 @@ int expo_test_render(struct expo *exp)
/* Display frame count */
snprintf(buf, sizeof(buf), "frame %6d", test->render_count);
- x = vid_priv->xsize - 18 * cons_priv->x_charsize;
+ x = vid_priv->xsize - 18 * cons_priv->ctx.x_charsize;
y = 10;
vidconsole_set_cursor_pos(exp->cons, x, y);
vidconsole_put_string(exp->cons, buf);
@@ -184,7 +184,7 @@ int expo_test_render(struct expo *exp)
/* Display FPS on next line (only if non-zero) */
if (test->fps_last > 0) {
snprintf(buf, sizeof(buf), "fps %6d", test->fps_last);
- y += cons_priv->y_charsize;
+ y += cons_priv->ctx.y_charsize;
vidconsole_set_cursor_pos(exp->cons, x, y);
vidconsole_put_string(exp->cons, buf);
}
@@ -193,7 +193,7 @@ int expo_test_render(struct expo *exp)
snprintf(buf, sizeof(buf), "render %6lu.%01lums",
test->render_avg_us / 1000,
(test->render_avg_us % 1000) / 100);
- y += cons_priv->y_charsize;
+ y += cons_priv->ctx.y_charsize;
vidconsole_set_cursor_pos(exp->cons, x, y);
vidconsole_put_string(exp->cons, buf);
@@ -201,7 +201,7 @@ int expo_test_render(struct expo *exp)
snprintf(buf, sizeof(buf), "sync %6lu.%01lums",
test->sync_avg_us / 1000,
(test->sync_avg_us % 1000) / 100);
- y += cons_priv->y_charsize;
+ y += cons_priv->ctx.y_charsize;
vidconsole_set_cursor_pos(exp->cons, x, y);
vidconsole_put_string(exp->cons, buf);
@@ -209,7 +209,7 @@ int expo_test_render(struct expo *exp)
snprintf(buf, sizeof(buf), "poll %6lu.%01lums",
test->poll_avg_us / 1000,
(test->poll_avg_us % 1000) / 100);
- y += cons_priv->y_charsize;
+ y += cons_priv->ctx.y_charsize;
vidconsole_set_cursor_pos(exp->cons, x, y);
vidconsole_put_string(exp->cons, buf);
@@ -340,6 +340,7 @@ int console_fixed_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp,
struct video_fontdata *fontdata)
{
struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
struct udevice *vid = dev->parent;
struct video_priv *vid_priv = dev_get_uclass_priv(vid);
int pbytes = VNBYTES(vid_priv->bpix);
@@ -349,7 +350,7 @@ int console_fixed_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp,
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
return -EAGAIN;
linenum = y;
x = VID_TO_PIXEL(x_frac);
@@ -110,14 +110,14 @@ static __maybe_unused int console_get_cursor_info(struct udevice *dev)
index = vc_priv->cli_index;
/* rounded up character position in this line */
- xpos = (x + vc_priv->x_charsize - 1) / vc_priv->x_charsize;
+ xpos = (x + ctx->x_charsize - 1) / ctx->x_charsize;
/* number of characters which can fit on this (first) line */
xspace = ctx->cols - xpos;
if (!curs->indent && index > xspace) {
/* move to the next line */
- y += vc_priv->y_charsize;
+ y += ctx->y_charsize;
index -= xspace;
/* figure out the available space in subsequent lines */
@@ -140,7 +140,7 @@ static __maybe_unused int console_get_cursor_info(struct udevice *dev)
/* Store line pointer and height in cursor struct */
curs->x = x;
curs->y = y;
- curs->height = vc_priv->y_charsize;
+ curs->height = ctx->y_charsize;
curs->index = vc_priv->cli_index;
return 0;
@@ -75,6 +75,7 @@ static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc,
static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, int cp)
{
struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
struct udevice *vid = dev->parent;
struct video_priv *vid_priv = dev_get_uclass_priv(vid);
struct console_simple_priv *priv = dev_get_priv(dev);
@@ -86,7 +87,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, int cp)
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
return -EAGAIN;
linenum = VID_TO_PIXEL(x_frac) + 1;
x = y + 1;
@@ -163,6 +164,7 @@ static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc,
static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, int cp)
{
struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
struct udevice *vid = dev->parent;
struct video_priv *vid_priv = dev_get_uclass_priv(vid);
struct console_simple_priv *priv = dev_get_priv(dev);
@@ -174,7 +176,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, int cp)
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
return -EAGAIN;
linenum = vid_priv->ysize - y - 1;
x = vid_priv->xsize - VID_TO_PIXEL(x_frac) - 1;
@@ -253,6 +255,7 @@ static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc,
static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, int cp)
{
struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
struct udevice *vid = dev->parent;
struct video_priv *vid_priv = dev_get_uclass_priv(vid);
struct console_simple_priv *priv = dev_get_priv(dev);
@@ -264,7 +267,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, int cp)
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
return -EAGAIN;
x = y;
linenum = vid_priv->ysize - VID_TO_PIXEL(x_frac) - 1;
@@ -266,7 +266,7 @@ struct console_tt_store {
static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
{
struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
- struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *vc_ctx = vidconsole_ctx(dev);
struct console_tt_priv *priv = dev_get_priv(dev);
void *end, *line;
int font_height;
@@ -314,9 +314,9 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
video_damage(dev->parent,
0,
- vc_priv->y_charsize * row,
+ vc_ctx->y_charsize * row,
vid_priv->xsize,
- vc_priv->y_charsize);
+ vc_ctx->y_charsize);
return 0;
}
@@ -325,7 +325,7 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
uint rowsrc, uint count)
{
struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
- struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *vc_ctx = vidconsole_ctx(dev);
struct console_tt_priv *priv = dev_get_priv(dev);
struct console_tt_ctx *ctx = &priv->ctx;
void *dst;
@@ -349,9 +349,9 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
video_damage(dev->parent,
0,
- vc_priv->y_charsize * rowdst,
+ vc_ctx->y_charsize * rowdst,
vid_priv->xsize,
- vc_priv->y_charsize * count);
+ vc_ctx->y_charsize * count);
return 0;
}
@@ -369,6 +369,7 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
static void clear_from(struct udevice *dev, int index)
{
struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *vc_ctx = vidconsole_ctx_from_priv(vc_priv);
struct console_tt_priv *priv = dev_get_priv(dev);
struct console_tt_ctx *ctx = &priv->ctx;
struct udevice *vid_dev = dev->parent;
@@ -390,21 +391,23 @@ static void clear_from(struct udevice *dev, int index)
/* If on the same line, just erase from start to end position */
if (ystart == yend) {
- video_fill_part(vid_dev, xstart, ystart, xend, ystart + vc_priv->y_charsize,
+ video_fill_part(vid_dev, xstart, ystart, xend,
+ ystart + vc_ctx->y_charsize,
vid_priv->colour_bg);
} else {
/* Different lines - erase to end of first line */
video_fill_part(vid_dev, xstart, ystart, vid_priv->xsize,
- ystart + vc_priv->y_charsize, vid_priv->colour_bg);
+ ystart + vc_ctx->y_charsize, vid_priv->colour_bg);
/* Erase any complete lines in between */
- if (yend > ystart + vc_priv->y_charsize) {
- video_fill_part(vid_dev, 0, ystart + vc_priv->y_charsize,
+ if (yend > ystart + vc_ctx->y_charsize) {
+ video_fill_part(vid_dev, 0, ystart + vc_ctx->y_charsize,
vid_priv->xsize, yend, vid_priv->colour_bg);
}
/* Erase from start of final line to end of last character */
- video_fill_part(vid_dev, 0, yend, xend, yend + vc_priv->y_charsize,
+ video_fill_part(vid_dev, 0, yend, xend,
+ yend + vc_ctx->y_charsize,
vid_priv->colour_bg);
}
}
@@ -938,8 +941,8 @@ static void select_metrics(struct udevice *dev, struct console_tt_metrics *met)
struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev);
priv->cur_met = met;
- vc_priv->x_charsize = met->font_size;
- vc_priv->y_charsize = met->font_size;
+ ctx->x_charsize = met->font_size;
+ ctx->y_charsize = met->font_size;
vc_priv->xstart_frac = VID_TO_POS(2);
ctx->cols = vid_priv->xsize / met->font_size;
ctx->rows = vid_priv->ysize / met->font_size;
@@ -76,11 +76,11 @@ static int vidconsole_back(struct udevice *dev)
/* Hide cursor at old position if it's visible */
vidconsole_hide_cursor(dev);
- priv->xcur_frac -= VID_TO_POS(priv->x_charsize);
+ priv->xcur_frac -= VID_TO_POS(ctx->x_charsize);
if (priv->xcur_frac < priv->xstart_frac) {
priv->xcur_frac = (ctx->cols - 1) *
- VID_TO_POS(priv->x_charsize);
- priv->ycur -= priv->y_charsize;
+ VID_TO_POS(ctx->x_charsize);
+ priv->ycur -= ctx->y_charsize;
if (priv->ycur < 0)
priv->ycur = 0;
}
@@ -101,17 +101,17 @@ static void vidconsole_newline(struct udevice *dev)
int i, ret;
priv->xcur_frac = priv->xstart_frac;
- priv->ycur += priv->y_charsize;
+ priv->ycur += ctx->y_charsize;
/* Check if we need to scroll the terminal */
if (vid_priv->rot % 2 ?
- priv->ycur + priv->x_charsize > vid_priv->xsize :
- priv->ycur + priv->y_charsize > vid_priv->ysize) {
+ priv->ycur + ctx->x_charsize > vid_priv->xsize :
+ priv->ycur + ctx->y_charsize > vid_priv->ysize) {
vidconsole_move_rows(dev, 0, rows, ctx->rows - rows);
for (i = 0; i < rows; i++)
vidconsole_set_row(dev, ctx->rows - i - 1,
vid_priv->colour_bg);
- priv->ycur -= rows * priv->y_charsize;
+ priv->ycur -= rows * ctx->y_charsize;
}
priv->last_ch = 0;
@@ -178,9 +178,11 @@ static void set_cursor_position(struct udevice *dev, int row, int col)
static void get_cursor_position(struct vidconsole_priv *priv,
int *row, int *col)
{
- *row = priv->ycur / priv->y_charsize;
+ struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(priv);
+
+ *row = priv->ycur / ctx->y_charsize;
*col = VID_TO_PIXEL(priv->xcur_frac - priv->xstart_frac) /
- priv->x_charsize;
+ ctx->x_charsize;
}
/*
@@ -649,7 +651,7 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size,
const char *text, int limit,
struct vidconsole_bbox *bbox, struct alist *lines)
{
- struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx(dev);
struct vidconsole_ops *ops = vidconsole_get_ops(dev);
int ret;
@@ -664,8 +666,8 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size,
bbox->valid = true;
bbox->x0 = 0;
bbox->y0 = 0;
- bbox->x1 = priv->x_charsize * strlen(text);
- bbox->y1 = priv->y_charsize;
+ bbox->x1 = ctx->x_charsize * strlen(text);
+ bbox->y1 = ctx->y_charsize;
return 0;
}
@@ -673,7 +675,7 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size,
int vidconsole_nominal(struct udevice *dev, const char *name, uint size,
uint num_chars, struct vidconsole_bbox *bbox)
{
- struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx(dev);
struct vidconsole_ops *ops = vidconsole_get_ops(dev);
int ret;
@@ -686,8 +688,8 @@ int vidconsole_nominal(struct udevice *dev, const char *name, uint size,
bbox->valid = true;
bbox->x0 = 0;
bbox->y0 = 0;
- bbox->x1 = priv->x_charsize * num_chars;
- bbox->y1 = priv->y_charsize;
+ bbox->x1 = ctx->x_charsize * num_chars;
+ bbox->y1 = ctx->y_charsize;
return 0;
}
@@ -880,10 +882,11 @@ static int vidconsole_pre_probe(struct udevice *dev)
static int vidconsole_post_probe(struct udevice *dev)
{
struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(priv);
struct stdio_dev *sdev = &priv->sdev;
if (!priv->tab_width_frac)
- priv->tab_width_frac = VID_TO_POS(priv->x_charsize) * 8;
+ priv->tab_width_frac = VID_TO_POS(ctx->x_charsize) * 8;
if (dev_seq(dev)) {
snprintf(sdev->name, sizeof(sdev->name), "vidconsole%d",
@@ -932,13 +935,13 @@ int vidconsole_clear_and_reset(struct udevice *dev)
void vidconsole_position_cursor(struct udevice *dev, unsigned col, unsigned row)
{
- struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx(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);
+ x = min_t(short, col * ctx->x_charsize, vid_priv->xsize - 1);
+ y = min_t(short, row * ctx->y_charsize, vid_priv->ysize - 1);
vidconsole_set_cursor_pos(dev, x, y);
}
@@ -961,8 +964,8 @@ void vidconsole_set_bitmap_font(struct udevice *dev,
log_debug("byte width: %d\n", fontdata->byte_width);
log_debug("height: %d\n", fontdata->height);
- vc_priv->x_charsize = fontdata->width;
- vc_priv->y_charsize = fontdata->height;
+ ctx->x_charsize = fontdata->width;
+ ctx->y_charsize = fontdata->height;
if (vid_priv->rot % 2) {
ctx->cols = vid_priv->ysize / fontdata->width;
ctx->rows = vid_priv->xsize / fontdata->height;
@@ -665,13 +665,13 @@ static int show_splash(struct udevice *dev)
int video_default_font_height(struct udevice *dev)
{
- struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx(dev);
if (IS_ENABLED(CONFIG_CONSOLE_TRUETYPE))
return IF_ENABLED_INT(CONFIG_CONSOLE_TRUETYPE,
CONFIG_CONSOLE_TRUETYPE_SIZE);
- return vc_priv->y_charsize;
+ return ctx->y_charsize;
}
static void video_idle(struct cyclic_info *cyc)
@@ -79,19 +79,23 @@ struct vidconsole_cursor {
* This holds per-client state for video consoles. It can be used by clients
* to maintain separate contexts for different text-entry operations.
*
- * @rows: Number of text rows
- * @cols: Number of text columns
+ * @rows: Number of text rows
+ * @cols: Number of text columns
+ * @x_charsize: Character width in pixels
+ * @y_charsize: Character height in pixels
*/
struct vidconsole_ctx {
int rows;
int cols;
+ int x_charsize;
+ int y_charsize;
};
/**
* struct vidconsole_priv - uclass-private data about a console device
*
- * Drivers must set up @ctx.rows, @ctx.cols, @x_charsize, @y_charsize in their
- * probe() method. Drivers may set up @xstart_frac if desired.
+ * Drivers must set up @ctx.rows, @ctx.cols, @ctx.x_charsize, @ctx.y_charsize
+ * in their probe() method. Drivers may set up @xstart_frac if desired.
*
* Note that these values relate to the rotated console, so that an 80x25
* console which is rotated 90 degrees will have rows=80 and cols=25
@@ -105,8 +109,6 @@ struct vidconsole_ctx {
* @xcur_frac: Current X position, in fractional units (VID_TO_POS(x))
* @ycur: Current Y position in pixels (0=top)
* @ctx: Per-client context
- * @x_charsize: Character width in pixels
- * @y_charsize: Character height in pixels
* @tab_width_frac: Tab width in fractional units
* @xsize_frac: Width of the display in fractional units
* @xstart_frac: Left margin for the text console in fractional units
@@ -128,8 +130,6 @@ struct vidconsole_priv {
struct vidconsole_ctx ctx;
int xcur_frac;
int ycur;
- int x_charsize;
- int y_charsize;
int tab_width_frac;
int xsize_frac;
int xstart_frac;