@@ -228,6 +228,39 @@ int console_simple_get_font(struct udevice *dev, int seq, struct vidfont_info *i
return info->name ? 0 : -ENOENT;
}
+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 udevice *vid = dev->parent;
+ struct video_priv *vid_priv = dev_get_uclass_priv(vid);
+ int pbytes = VNBYTES(vid_priv->bpix);
+ int x, linenum, ret;
+ void *start, *line;
+ u8 ch = console_utf_to_cp437(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)
+ return -EAGAIN;
+ linenum = y;
+ x = VID_TO_PIXEL(x_frac);
+ start = vid_priv->fb + linenum * vid_priv->line_length + x * pbytes;
+ line = start;
+
+ ret = fill_char_vertically(pfont, &line, vid_priv, fontdata, NORMAL_DIRECTION);
+ if (ret)
+ return ret;
+
+ video_damage(dev->parent,
+ x,
+ y,
+ fontdata->width,
+ fontdata->height);
+
+ return VID_TO_POS(fontdata->width);
+}
+
int console_simple_select_font(struct udevice *dev, const char *name, uint size)
{
struct video_fontdata *font;
@@ -68,41 +68,11 @@ static int console_move_rows(struct udevice *dev, uint rowdst,
return 0;
}
-static int console_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp)
+int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp)
{
- struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
- struct udevice *vid = dev->parent;
- struct video_priv *vid_priv = dev_get_uclass_priv(vid);
struct console_simple_priv *priv = dev_get_priv(dev);
- struct video_fontdata *fontdata = priv->fontdata;
- int pbytes = VNBYTES(vid_priv->bpix);
- int x, linenum, ret;
- void *start, *line;
- u8 ch = console_utf_to_cp437(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)
- return -EAGAIN;
- linenum = y;
- x = VID_TO_PIXEL(x_frac);
- start = vid_priv->fb + linenum * vid_priv->line_length + x * pbytes;
- line = start;
- if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac)
- return -EAGAIN;
-
- ret = fill_char_vertically(pfont, &line, vid_priv, fontdata, NORMAL_DIRECTION);
- if (ret)
- return ret;
-
- video_damage(dev->parent,
- x,
- y,
- fontdata->width,
- fontdata->height);
-
- return VID_TO_POS(fontdata->width);
+ return console_fixed_putc_xy(dev, x_frac, y, cp, priv->fontdata);
}
static int __maybe_unused console_set_cursor_visible(struct udevice *dev,
@@ -134,6 +104,11 @@ static int __maybe_unused console_set_cursor_visible(struct udevice *dev,
return 0;
}
+static int console_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp)
+{
+ return console_normal_putc_xy(dev, x_frac, y, cp);
+}
+
struct vidconsole_ops console_ops = {
.putc_xy = console_putc_xy,
.move_rows = console_move_rows,
@@ -146,6 +146,30 @@ int console_simple_get_font(struct udevice *dev, int seq, struct vidfont_info *i
**/
int console_simple_select_font(struct udevice *dev, const char *name, uint size);
+/**
+ * Normal console putc_xy function that can be called by other console drivers
+ *
+ * @param dev console device
+ * @param x_frac fractional X position
+ * @param y Y position in pixels
+ * @param cp Unicode code point
+ * @returns width in fractional pixels, or -ve on error
+ */
+int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp);
+
+/**
+ * Fixed font putc_xy function that can be called with explicit font data
+ *
+ * @param dev console device
+ * @param x_frac fractional X position
+ * @param y Y position in pixels
+ * @param cp Unicode code point
+ * @param fontdata font data to use for rendering
+ * @returns width in fractional pixels, or -ve on error
+ */
+int console_fixed_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp,
+ struct video_fontdata *fontdata);
+
/**
* Internal function to convert Unicode code points to code page 437.
* Used by video consoles using bitmap fonts.