Commit 1d3b2af2 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Greg Kroah-Hartman

auxdisplay: charlcd: Add support for displays with more than two lines

On displays with more than two lines, the additional lines are stored in
the buffers used for the first two lines, but beyond the visible parts.
Adjust the DDRAM address calculation to cater for this.

When clearing the display, avoid writing more spaces than the actual
size of the physical buffer.
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ac201479
...@@ -159,15 +159,19 @@ EXPORT_SYMBOL_GPL(charlcd_poke); ...@@ -159,15 +159,19 @@ EXPORT_SYMBOL_GPL(charlcd_poke);
static void charlcd_gotoxy(struct charlcd *lcd) static void charlcd_gotoxy(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = to_priv(lcd);
unsigned int addr;
lcd->ops->write_cmd(lcd, /*
LCD_CMD_SET_DDRAM_ADDR | (priv->addr.y ? lcd->hwidth : 0) | * we force the cursor to stay at the end of the
/* * line if it wants to go farther
* we force the cursor to stay at the end of the */
* line if it wants to go farther addr = priv->addr.x < lcd->bwidth ? priv->addr.x & (lcd->hwidth - 1)
*/ : lcd->bwidth - 1;
((priv->addr.x < lcd->bwidth) ? priv->addr.x & (lcd->hwidth - 1) if (priv->addr.y & 1)
: lcd->bwidth - 1)); addr += lcd->hwidth;
if (priv->addr.y & 2)
addr += lcd->bwidth;
lcd->ops->write_cmd(lcd, LCD_CMD_SET_DDRAM_ADDR | addr);
} }
static void charlcd_home(struct charlcd *lcd) static void charlcd_home(struct charlcd *lcd)
...@@ -203,7 +207,7 @@ static void charlcd_clear_fast(struct charlcd *lcd) ...@@ -203,7 +207,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
if (lcd->ops->clear_fast) if (lcd->ops->clear_fast)
lcd->ops->clear_fast(lcd); lcd->ops->clear_fast(lcd);
else else
for (pos = 0; pos < lcd->height * lcd->hwidth; pos++) for (pos = 0; pos < min(2, lcd->height) * lcd->hwidth; pos++)
lcd->ops->write_data(lcd, ' '); lcd->ops->write_data(lcd, ' ');
charlcd_home(lcd); charlcd_home(lcd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment