return ops->set_row(dev, row, clr);
}
+static int vidconsole_entry_start(struct udevice *dev)
+{
+ struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+
+ if (!ops->entry_start)
+ return -ENOSYS;
+ return ops->entry_start(dev);
+}
+
/* Move backwards one space */
-static void vidconsole_back(struct udevice *dev)
+static int vidconsole_back(struct udevice *dev)
{
struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+ int ret;
+
+ if (ops->backspace) {
+ ret = ops->backspace(dev);
+ if (ret != -ENOSYS)
+ return ret;
+ }
priv->xcur_frac -= VID_TO_POS(priv->x_charsize);
- if (priv->xcur_frac < 0) {
+ if (priv->xcur_frac < priv->xstart_frac) {
priv->xcur_frac = (priv->cols - 1) *
VID_TO_POS(priv->x_charsize);
priv->ycur -= priv->y_charsize;
if (priv->ycur < 0)
priv->ycur = 0;
}
+
+ return 0;
}
/* Move to a newline, scrolling the display if necessary */
const int rows = CONFIG_CONSOLE_SCROLL_LINES;
int i;
- priv->xcur_frac = 0;
+ priv->xcur_frac = priv->xstart_frac;
priv->ycur += priv->y_charsize;
/* Check if we need to scroll the terminal */
vid_priv->colour_bg);
priv->ycur -= rows * priv->y_charsize;
}
+ priv->last_ch = 0;
+
video_sync(dev->parent);
}
int ret;
switch (ch) {
+ case '\a':
+ /* beep */
+ break;
case '\r':
- priv->xcur_frac = 0;
+ priv->xcur_frac = priv->xstart_frac;
break;
case '\n':
vidconsole_newline(dev);
+ vidconsole_entry_start(dev);
break;
case '\t': /* Tab (8 chars alignment) */
priv->xcur_frac = ((priv->xcur_frac / priv->tab_width_frac)
break;
case '\b':
vidconsole_back(dev);
+ priv->last_ch = 0;
break;
default:
/*
if (ret < 0)
return ret;
priv->xcur_frac += ret;
+ priv->last_ch = ch;
if (priv->xcur_frac >= priv->xsize_frac)
vidconsole_newline(dev);
break;
while (*s)
vidconsole_put_char(dev, *s++);
+ video_sync(dev->parent);
}
/* Set up the number of rows and colours (rotated drivers override this) */
{
struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
struct stdio_dev *sdev = &priv->sdev;
- int ret;
if (!priv->tab_width_frac)
priv->tab_width_frac = VID_TO_POS(priv->x_charsize) * 8;
sdev->putc = vidconsole_putc;
sdev->puts = vidconsole_puts;
sdev->priv = dev;
- ret = stdio_register(sdev);
- if (ret)
- return ret;
- return 0;
+ return stdio_register(sdev);
}
UCLASS_DRIVER(vidconsole) = {
if (argc != 3)
return CMD_RET_USAGE;
- uclass_first_device(UCLASS_VIDEO_CONSOLE, &dev);
- if (!dev)
+ if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, &dev))
return CMD_RET_FAILURE;
col = simple_strtoul(argv[1], NULL, 10);
row = simple_strtoul(argv[2], NULL, 10);
if (argc != 2)
return CMD_RET_USAGE;
- uclass_first_device(UCLASS_VIDEO_CONSOLE, &dev);
- if (!dev)
+ if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, &dev))
return CMD_RET_FAILURE;
for (s = argv[1]; *s; s++)
vidconsole_put_char(dev, *s);