X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fvideo%2Fvidconsole-uclass.c;h=e9a90b1b9bc375137cb93d4bdb1efa1ad6f66e4f;hb=c34bd8b82090718e3546ba262168467dc31a128e;hp=3145fd8d6f9bab4f4ec810e4ac162153b0e08df3;hpb=f266178698307608ee23741e69b9626196e66481;p=u-boot diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c index 3145fd8d6f..e9a90b1b9b 100644 --- a/drivers/video/vidconsole-uclass.c +++ b/drivers/video/vidconsole-uclass.c @@ -47,19 +47,38 @@ int vidconsole_set_row(struct udevice *dev, uint row, int clr) 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 */ @@ -71,7 +90,7 @@ static void vidconsole_newline(struct udevice *dev) 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 */ @@ -82,6 +101,8 @@ static void vidconsole_newline(struct udevice *dev) vid_priv->colour_bg); priv->ycur -= rows * priv->y_charsize; } + priv->last_ch = 0; + video_sync(dev->parent); } @@ -91,11 +112,15 @@ int vidconsole_put_char(struct udevice *dev, char ch) 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) @@ -106,6 +131,7 @@ int vidconsole_put_char(struct udevice *dev, char ch) break; case '\b': vidconsole_back(dev); + priv->last_ch = 0; break; default: /* @@ -122,6 +148,7 @@ int vidconsole_put_char(struct udevice *dev, char ch) if (ret < 0) return ret; priv->xcur_frac += ret; + priv->last_ch = ch; if (priv->xcur_frac >= priv->xsize_frac) vidconsole_newline(dev); break; @@ -143,6 +170,7 @@ static void vidconsole_puts(struct stdio_dev *sdev, const char *s) while (*s) vidconsole_put_char(dev, *s++); + video_sync(dev->parent); } /* Set up the number of rows and colours (rotated drivers override this) */ @@ -162,7 +190,6 @@ static int vidconsole_post_probe(struct udevice *dev) { 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; @@ -178,11 +205,8 @@ static int vidconsole_post_probe(struct udevice *dev) 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) = { @@ -212,8 +236,7 @@ static int do_video_setcursor(cmd_tbl_t *cmdtp, int flag, int argc, 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); @@ -231,8 +254,7 @@ static int do_video_puts(cmd_tbl_t *cmdtp, int flag, int argc, 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);