lkml.org 
[lkml]   [2020]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 09/25] auxdisplay: provide hd44780_common_gotoxy
    Date
    From: Lars Poeschel <poeschel@lemonage.de>

    Provide a hd44780_common_gotoxy function and a pointer in the ops for
    charlcd to use to move the cursor.

    Reviewed-by: Willy Tarreau <w@1wt.eu>
    Signed-off-by: Lars Poeschel <poeschel@lemonage.de>
    ---
    drivers/auxdisplay/charlcd.c | 38 +++++++++--------------------
    drivers/auxdisplay/charlcd.h | 4 ++-
    drivers/auxdisplay/hd44780.c | 2 ++
    drivers/auxdisplay/hd44780_common.c | 23 +++++++++++++++++
    drivers/auxdisplay/hd44780_common.h | 1 +
    drivers/auxdisplay/panel.c | 3 +++
    6 files changed, 43 insertions(+), 28 deletions(-)

    diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c
    index 72ed004a8980..d6f971eea6ae 100644
    --- a/drivers/auxdisplay/charlcd.c
    +++ b/drivers/auxdisplay/charlcd.c
    @@ -55,7 +55,7 @@

    #define LCD_CMD_SET_CGRAM_ADDR 0x40 /* Set char generator RAM address */

    -#define LCD_CMD_SET_DDRAM_ADDR 0x80 /* Set display data RAM address */
    +#define LCD_CMD_SET_DDRAM_ADDR 0x80 /* Set display data RAM address */

    #define LCD_ESCAPE_LEN 24 /* Max chars for LCD escape command */
    #define LCD_ESCAPE_CHAR 27 /* Use char 27 for escape command */
    @@ -140,33 +140,17 @@ void charlcd_poke(struct charlcd *lcd)
    }
    EXPORT_SYMBOL_GPL(charlcd_poke);

    -static void charlcd_gotoxy(struct charlcd *lcd)
    -{
    - struct hd44780_common *hdc = lcd->drvdata;
    - unsigned int addr;
    -
    - /*
    - * we force the cursor to stay at the end of the
    - * line if it wants to go farther
    - */
    - addr = lcd->addr.x < hdc->bwidth ? lcd->addr.x & (hdc->hwidth - 1)
    - : hdc->bwidth - 1;
    - if (lcd->addr.y & 1)
    - addr += hdc->hwidth;
    - if (lcd->addr.y & 2)
    - addr += hdc->bwidth;
    - hdc->write_cmd(hdc, LCD_CMD_SET_DDRAM_ADDR | addr);
    -}
    -
    static void charlcd_home(struct charlcd *lcd)
    {
    lcd->addr.x = 0;
    lcd->addr.y = 0;
    - charlcd_gotoxy(lcd);
    + lcd->ops->gotoxy(lcd);
    }

    static void charlcd_print(struct charlcd *lcd, char c)
    {
    + struct hd44780_common *hdc = lcd->drvdata;
    +
    if (lcd->char_conv)
    c = lcd->char_conv[(unsigned char)c];

    @@ -174,8 +158,8 @@ static void charlcd_print(struct charlcd *lcd, char c)
    lcd->addr.x++;

    /* prevents the cursor from wrapping onto the next line */
    - if (lcd->addr.x == lcd->width)
    - charlcd_gotoxy(lcd);
    + if (lcd->addr.x == hdc->bwidth)
    + lcd->ops->gotoxy(lcd);
    }

    static void charlcd_clear_fast(struct charlcd *lcd)
    @@ -440,7 +424,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
    /* restore cursor position */
    lcd->addr.x = xs;
    lcd->addr.y = ys;
    - charlcd_gotoxy(lcd);
    + lcd->ops->gotoxy(lcd);
    processed = 1;
    break;
    }
    @@ -499,7 +483,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
    hdc->write_data(hdc, cgbytes[addr]);

    /* ensures that we stop writing to CGRAM */
    - charlcd_gotoxy(lcd);
    + lcd->ops->gotoxy(lcd);
    processed = 1;
    break;
    }
    @@ -510,7 +494,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)

    /* If the command is valid, move to the new address */
    if (parse_xy(esc, &lcd->addr.x, &lcd->addr.y))
    - charlcd_gotoxy(lcd);
    + lcd->ops->gotoxy(lcd);

    /* Regardless of its validity, mark as processed */
    processed = 1;
    @@ -596,12 +580,12 @@ static void charlcd_write_char(struct charlcd *lcd, char c)

    lcd->addr.x = 0;
    lcd->addr.y = (lcd->addr.y + 1) % lcd->height;
    - charlcd_gotoxy(lcd);
    + lcd->ops->gotoxy(lcd);
    break;
    case '\r':
    /* go to the beginning of the same line */
    lcd->addr.x = 0;
    - charlcd_gotoxy(lcd);
    + lcd->ops->gotoxy(lcd);
    break;
    case '\t':
    /* print a space instead of the tab */
    diff --git a/drivers/auxdisplay/charlcd.h b/drivers/auxdisplay/charlcd.h
    index 94922e3c1c4c..f36cc80ce385 100644
    --- a/drivers/auxdisplay/charlcd.h
    +++ b/drivers/auxdisplay/charlcd.h
    @@ -37,14 +37,16 @@ struct charlcd {
    * Optional.
    * @backlight: Turn backlight on or off. Optional.
    * @print: Print one character to the display at current cursor position.
    - * The cursor is advanced by charlcd.
    * The buffered cursor position is advanced by charlcd. The cursor should not
    * wrap to the next line at the end of a line.
    + * @gotoxy: Set cursor to x, y. The x and y values to set the cursor to are
    + * previously set in addr.x and addr.y by charlcd.
    */
    struct charlcd_ops {
    void (*clear_fast)(struct charlcd *lcd);
    void (*backlight)(struct charlcd *lcd, enum charlcd_onoff on);
    int (*print)(struct charlcd *lcd, int c);
    + int (*gotoxy)(struct charlcd *lcd);
    };

    struct charlcd *charlcd_alloc(void);
    diff --git a/drivers/auxdisplay/hd44780.c b/drivers/auxdisplay/hd44780.c
    index 9680bb611639..4d9478f6e5ff 100644
    --- a/drivers/auxdisplay/hd44780.c
    +++ b/drivers/auxdisplay/hd44780.c
    @@ -127,6 +127,7 @@ static void hd44780_write_data_gpio8(struct hd44780_common *hdc, int data)
    static const struct charlcd_ops hd44780_ops_gpio8 = {
    .backlight = hd44780_backlight,
    .print = hd44780_common_print,
    + .gotoxy = hd44780_common_gotoxy,
    };

    /* Send a command to the LCD panel in 4 bit GPIO mode */
    @@ -171,6 +172,7 @@ static void hd44780_write_data_gpio4(struct hd44780_common *hdc, int data)
    static const struct charlcd_ops hd44780_ops_gpio4 = {
    .backlight = hd44780_backlight,
    .print = hd44780_common_print,
    + .gotoxy = hd44780_common_gotoxy,
    };

    static int hd44780_probe(struct platform_device *pdev)
    diff --git a/drivers/auxdisplay/hd44780_common.c b/drivers/auxdisplay/hd44780_common.c
    index 1dfcb2cdbc70..f86eb2f27cee 100644
    --- a/drivers/auxdisplay/hd44780_common.c
    +++ b/drivers/auxdisplay/hd44780_common.c
    @@ -5,6 +5,9 @@
    #include "charlcd.h"
    #include "hd44780_common.h"

    +/* LCD commands */
    +#define LCD_CMD_SET_DDRAM_ADDR 0x80 /* Set display data RAM address */
    +
    int hd44780_common_print(struct charlcd *lcd, int c)
    {
    struct hd44780_common *hdc = lcd->drvdata;
    @@ -18,6 +21,26 @@ int hd44780_common_print(struct charlcd *lcd, int c)
    }
    EXPORT_SYMBOL_GPL(hd44780_common_print);

    +int hd44780_common_gotoxy(struct charlcd *lcd)
    +{
    + struct hd44780_common *hdc = lcd->drvdata;
    + unsigned int addr;
    +
    + /*
    + * we force the cursor to stay at the end of the
    + * line if it wants to go farther
    + */
    + addr = lcd->addr.x < hdc->bwidth ? lcd->addr.x & (hdc->hwidth - 1)
    + : hdc->bwidth - 1;
    + if (lcd->addr.y & 1)
    + addr += hdc->hwidth;
    + if (lcd->addr.y & 2)
    + addr += hdc->bwidth;
    + hdc->write_cmd(hdc, LCD_CMD_SET_DDRAM_ADDR | addr);
    + return 0;
    +}
    +EXPORT_SYMBOL_GPL(hd44780_common_gotoxy);
    +
    struct hd44780_common *hd44780_common_alloc(void)
    {
    struct hd44780_common *hd;
    diff --git a/drivers/auxdisplay/hd44780_common.h b/drivers/auxdisplay/hd44780_common.h
    index ac404a44889b..d8cbea4a8658 100644
    --- a/drivers/auxdisplay/hd44780_common.h
    +++ b/drivers/auxdisplay/hd44780_common.h
    @@ -15,4 +15,5 @@ struct hd44780_common {
    };

    int hd44780_common_print(struct charlcd *lcd, int c);
    +int hd44780_common_gotoxy(struct charlcd *lcd);
    struct hd44780_common *hd44780_common_alloc(void);
    diff --git a/drivers/auxdisplay/panel.c b/drivers/auxdisplay/panel.c
    index 7ef9bc7188ca..75894eacd12f 100644
    --- a/drivers/auxdisplay/panel.c
    +++ b/drivers/auxdisplay/panel.c
    @@ -875,16 +875,19 @@ static void lcd_clear_fast_tilcd(struct charlcd *charlcd)
    static const struct charlcd_ops charlcd_serial_ops = {
    .clear_fast = lcd_clear_fast_s,
    .backlight = lcd_backlight,
    + .gotoxy = hd44780_common_gotoxy,
    };

    static const struct charlcd_ops charlcd_parallel_ops = {
    .clear_fast = lcd_clear_fast_p8,
    .backlight = lcd_backlight,
    + .gotoxy = hd44780_common_gotoxy,
    };

    static const struct charlcd_ops charlcd_tilcd_ops = {
    .clear_fast = lcd_clear_fast_tilcd,
    .backlight = lcd_backlight,
    + .gotoxy = hd44780_common_gotoxy,
    };

    /* initialize the LCD driver */
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-11-03 11:00    [W:3.200 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site