[U-Boot] [PATCH V2 11/12] lcd: refactor lcd console stuff into its own file

Simon Glass sjg at chromium.org
Sun Nov 30 20:32:32 CET 2014


Hi Nikita,

On 30 November 2014 at 06:22, Nikita Kiryanov <nikita at compulab.co.il> wrote:
> common/lcd.c is a mix of code portions that do different but related
> things. To improve modularity, the various code portions should be split
> into their own modules. Separate lcd console code into its own file.
>
> Signed-off-by: Nikita Kiryanov <nikita at compulab.co.il>
> Cc: Anatolij Gustschin <agust at denx.de>
> Cc: Wolfgang Denk <wd at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> ---
> NOTE: I'm resending this cover letter with a shorter Cc list because the
> original mail got held up. Sorry for the double post.

One nit below, but otherwise:

Acked-by: Simon Glass <sjg at chromium.org>

Tested on pit, LCD works fine.

Tested-by: Simon Glass <sjg at chromium.org>

>
> Changes in V2:
>         - New patch.
>
>  common/Makefile       |   2 +-
>  common/lcd.c          | 227 --------------------------------------------------
>  common/lcd_console.c  | 212 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/lcd.h         |   1 +
>  include/lcd_console.h |  85 +++++++++++++++++++
>  5 files changed, 299 insertions(+), 228 deletions(-)
>  create mode 100644 common/lcd_console.c
>  create mode 100644 include/lcd_console.h
>
> diff --git a/common/Makefile b/common/Makefile
> index 9c47e20..66584fc 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -206,7 +206,7 @@ obj-$(CONFIG_CMD_KGDB) += kgdb.o kgdb_stubs.o
>  obj-$(CONFIG_I2C_EDID) += edid.o
>  obj-$(CONFIG_KALLSYMS) += kallsyms.o
>  obj-y += splash.o
> -obj-$(CONFIG_LCD) += lcd.o
> +obj-$(CONFIG_LCD) += lcd.o lcd_console.o
>  obj-$(CONFIG_LYNXKDI) += lynxkdi.o
>  obj-$(CONFIG_MENU) += menu.o
>  obj-$(CONFIG_MODEM_SUPPORT) += modem.o
> diff --git a/common/lcd.c b/common/lcd.c
> index b55dd4c..2d0380d 100644
> --- a/common/lcd.c
> +++ b/common/lcd.c
> @@ -73,22 +73,6 @@
>  #define CONFIG_LCD_ALIGNMENT PAGE_SIZE
>  #endif
>
> -/* By default we scroll by a single line */
> -#ifndef CONFIG_CONSOLE_SCROLL_LINES
> -#define CONFIG_CONSOLE_SCROLL_LINES 1
> -#endif
> -
> -/************************************************************************/
> -/* ** CONSOLE DEFINITIONS & FUNCTIONS                                  */
> -/************************************************************************/
> -#define CONSOLE_ROW_SIZE       (VIDEO_FONT_HEIGHT * lcd_line_length)
> -#define CONSOLE_ROW_FIRST      lcd_console_address
> -#define CONSOLE_ROW_SECOND     (lcd_console_address + CONSOLE_ROW_SIZE)
> -#define CONSOLE_ROW_LAST       (lcd_console_address + CONSOLE_SIZE \
> -                                       - CONSOLE_ROW_SIZE)
> -#define CONSOLE_SIZE           (CONSOLE_ROW_SIZE * console_rows)
> -#define CONSOLE_SCROLL_SIZE    (CONSOLE_SIZE - CONSOLE_ROW_SIZE)
> -
>  #if (LCD_BPP != LCD_COLOR8) && (LCD_BPP != LCD_COLOR16) && \
>         (LCD_BPP != LCD_COLOR32)
>  # error Unsupported LCD BPP.
> @@ -96,9 +80,6 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> -static void lcd_drawchars(ushort x, ushort y, uchar *str, int count);
> -static inline void lcd_putc_xy(ushort x, ushort y, uchar  c);
> -
>  static int lcd_init(void *lcdbase);
>
>  static void *lcd_logo(void);
> @@ -112,12 +93,6 @@ int lcd_line_length;
>
>  char lcd_is_enabled = 0;
>
> -static short console_curr_col;
> -static short console_curr_row;
> -static short console_cols;
> -static short console_rows;
> -
> -static void *lcd_console_address;
>  static void *lcd_base;                 /* Start of framebuffer memory  */
>
>  static char lcd_flush_dcache;  /* 1 to flush dcache after each lcd update */
> @@ -153,82 +128,6 @@ void lcd_set_flush_dcache(int flush)
>         lcd_flush_dcache = (flush != 0);
>  }
>
> -void lcd_init_console(void *address, int rows, int cols)
> -{
> -       console_curr_col = 0;
> -       console_curr_row = 0;
> -       console_cols = cols;
> -       console_rows = rows;
> -       lcd_console_address = address;
> -}
> -
> -void lcd_set_col(short col)
> -{
> -       console_curr_col = col;
> -}
> -
> -void lcd_set_row(short row)
> -{
> -       console_curr_row = row;
> -}
> -
> -/*----------------------------------------------------------------------*/
> -
> -static void console_scrollup(void)
> -{
> -       const int rows = CONFIG_CONSOLE_SCROLL_LINES;
> -
> -       /* Copy up rows ignoring those that will be overwritten */
> -       memcpy(CONSOLE_ROW_FIRST,
> -              lcd_console_address + CONSOLE_ROW_SIZE * rows,
> -              CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows);
> -
> -       /* Clear the last rows */
> -#if (LCD_BPP != LCD_COLOR32)
> -       memset(lcd_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows,
> -               lcd_getbgcolor(),
> -               CONSOLE_ROW_SIZE * rows);
> -#else
> -       u32 *ppix = lcd_console_address +
> -                   CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows;
> -       u32 i;
> -       for (i = 0;
> -           i < (CONSOLE_ROW_SIZE * rows) / NBYTES(panel_info.vl_bpix);
> -           i++) {
> -               *ppix++ = lcd_getbgcolor();
> -       }
> -#endif
> -       lcd_sync();
> -       console_curr_row -= rows;
> -}
> -
> -/*----------------------------------------------------------------------*/
> -
> -static inline void console_back(void)
> -{
> -       if (--console_curr_col < 0) {
> -               console_curr_col = console_cols - 1;
> -               if (--console_curr_row < 0)
> -                       console_curr_row = 0;
> -       }
> -
> -       lcd_putc_xy(console_curr_col * VIDEO_FONT_WIDTH,
> -                   console_curr_row * VIDEO_FONT_HEIGHT, ' ');
> -}
> -
> -/*----------------------------------------------------------------------*/
> -
> -static inline void console_newline(void)
> -{
> -       console_curr_col = 0;
> -
> -       /* Check if we need to scroll the terminal */
> -       if (++console_curr_row >= console_rows)
> -               console_scrollup();
> -       else
> -               lcd_sync();
> -}
> -
>  /*----------------------------------------------------------------------*/
>
>  static void lcd_stub_putc(struct stdio_dev *dev, const char c)
> @@ -236,121 +135,11 @@ static void lcd_stub_putc(struct stdio_dev *dev, const char c)
>         lcd_putc(c);
>  }
>
> -void lcd_putc(const char c)
> -{
> -       if (!lcd_is_enabled) {
> -               serial_putc(c);
> -
> -               return;
> -       }
> -
> -       switch (c) {
> -       case '\r':
> -               console_curr_col = 0;
> -
> -               return;
> -       case '\n':
> -               console_newline();
> -
> -               return;
> -       case '\t':      /* Tab (8 chars alignment) */
> -               console_curr_col +=  8;
> -               console_curr_col &= ~7;
> -
> -               if (console_curr_col >= console_cols)
> -                       console_newline();
> -
> -               return;
> -       case '\b':
> -               console_back();
> -
> -               return;
> -       default:
> -               lcd_putc_xy(console_curr_col * VIDEO_FONT_WIDTH,
> -                           console_curr_row * VIDEO_FONT_HEIGHT, c);
> -               if (++console_curr_col >= console_cols)
> -                       console_newline();
> -       }
> -}
> -
> -/*----------------------------------------------------------------------*/
> -
>  static void lcd_stub_puts(struct stdio_dev *dev, const char *s)
>  {
>         lcd_puts(s);
>  }
>
> -void lcd_puts(const char *s)
> -{
> -       if (!lcd_is_enabled) {
> -               serial_puts(s);
> -
> -               return;
> -       }
> -
> -       while (*s)
> -               lcd_putc(*s++);
> -
> -       lcd_sync();
> -}
> -
> -/*----------------------------------------------------------------------*/
> -
> -void lcd_printf(const char *fmt, ...)
> -{
> -       va_list args;
> -       char buf[CONFIG_SYS_PBSIZE];
> -
> -       va_start(args, fmt);
> -       vsprintf(buf, fmt, args);
> -       va_end(args);
> -
> -       lcd_puts(buf);
> -}
> -
> -/************************************************************************/
> -/* ** Low-Level Graphics Routines                                      */
> -/************************************************************************/
> -
> -static void lcd_drawchars(ushort x, ushort y, uchar *str, int count)
> -{
> -       uchar *dest;
> -       ushort row;
> -
> -       dest = (uchar *)(lcd_console_address +
> -                       y * lcd_line_length + x * NBITS(LCD_BPP) / 8);
> -
> -       for (row = 0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) {
> -               uchar *s = str;
> -               int i;
> -#if LCD_BPP == LCD_COLOR16
> -               ushort *d = (ushort *)dest;
> -#elif LCD_BPP == LCD_COLOR32
> -               u32 *d = (u32 *)dest;
> -#else
> -               uchar *d = dest;
> -#endif
> -
> -               for (i = 0; i < count; ++i) {
> -                       uchar c, bits;
> -
> -                       c = *s++;
> -                       bits = video_fontdata[c * VIDEO_FONT_HEIGHT + row];
> -
> -                       for (c = 0; c < 8; ++c) {
> -                               *d++ = (bits & 0x80) ?
> -                                       lcd_getfgcolor() : lcd_getbgcolor();
> -                               bits <<= 1;
> -                       }
> -               }
> -       }
> -}
> -
> -static inline void lcd_putc_xy(ushort x, ushort y, uchar c)
> -{
> -       lcd_drawchars(x, y, &c, 1);
> -}
> -
>  /************************************************************************/
>  /**  Small utility to check that you got the colours right             */
>  /************************************************************************/
> @@ -1121,12 +910,6 @@ static int on_splashimage(const char *name, const char *value, enum env_op op,
>  U_BOOT_ENV_CALLBACK(splashimage, on_splashimage);
>  #endif
>
> -void lcd_position_cursor(unsigned col, unsigned row)
> -{
> -       console_curr_col = min_t(short, col, console_cols - 1);
> -       console_curr_row = min_t(short, row, console_rows - 1);
> -}
> -
>  int lcd_get_pixel_width(void)
>  {
>         return panel_info.vl_col;
> @@ -1137,16 +920,6 @@ int lcd_get_pixel_height(void)
>         return panel_info.vl_row;
>  }
>
> -int lcd_get_screen_rows(void)
> -{
> -       return console_rows;
> -}
> -
> -int lcd_get_screen_columns(void)
> -{
> -       return console_cols;
> -}
> -
>  #if defined(CONFIG_LCD_DT_SIMPLEFB)
>  static int lcd_dt_simplefb_configure_node(void *blob, int off)
>  {
> diff --git a/common/lcd_console.c b/common/lcd_console.c
> new file mode 100644
> index 0000000..223c9e8
> --- /dev/null
> +++ b/common/lcd_console.c
> @@ -0,0 +1,212 @@
> +/*
> + * (C) Copyright 2001-2014
> + * DENX Software Engineering -- wd at denx.de
> + * Compulab Ltd - http://compulab.co.il/
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <lcd.h>
> +#include <video_font.h>                /* Get font data, width and height */
> +
> +#define CONSOLE_ROW_SIZE       (VIDEO_FONT_HEIGHT * lcd_line_length)
> +#define CONSOLE_ROW_FIRST      lcd_console_address
> +#define CONSOLE_ROW_SECOND     (lcd_console_address + CONSOLE_ROW_SIZE)
> +#define CONSOLE_ROW_LAST       (lcd_console_address + CONSOLE_SIZE \
> +                                       - CONSOLE_ROW_SIZE)
> +#define CONSOLE_SIZE           (CONSOLE_ROW_SIZE * console_rows)
> +#define CONSOLE_SCROLL_SIZE    (CONSOLE_SIZE - CONSOLE_ROW_SIZE)
> +
> +static short console_curr_col;
> +static short console_curr_row;
> +static short console_cols;
> +static short console_rows;
> +static void *lcd_console_address;
> +
> +void lcd_init_console(void *address, int rows, int cols)
> +{
> +       console_curr_col = 0;
> +       console_curr_row = 0;
> +       console_cols = cols;
> +       console_rows = rows;
> +       lcd_console_address = address;
> +}
> +
> +void lcd_set_col(short col)
> +{
> +       console_curr_col = col;
> +}
> +
> +void lcd_set_row(short row)
> +{
> +       console_curr_row = row;
> +}
> +
> +void lcd_position_cursor(unsigned col, unsigned row)
> +{
> +       console_curr_col = min_t(short, col, console_cols - 1);
> +       console_curr_row = min_t(short, row, console_rows - 1);
> +}
> +
> +int lcd_get_screen_rows(void)
> +{
> +       return console_rows;
> +}
> +
> +int lcd_get_screen_columns(void)
> +{
> +       return console_cols;
> +}
> +
> +static void lcd_drawchars(ushort x, ushort y, uchar *str, int count)
> +{
> +       uchar *dest;
> +       ushort row;
> +
> +       dest = (uchar *)(lcd_console_address +
> +                        y * lcd_line_length + x * NBITS(LCD_BPP) / 8);
> +
> +       for (row = 0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) {
> +               uchar *s = str;
> +               int i;
> +#if LCD_BPP == LCD_COLOR16
> +               ushort *d = (ushort *)dest;
> +#elif LCD_BPP == LCD_COLOR32
> +               u32 *d = (u32 *)dest;
> +#else
> +               uchar *d = dest;
> +#endif
> +
> +               for (i = 0; i < count; ++i) {
> +                       uchar c, bits;
> +
> +                       c = *s++;
> +                       bits = video_fontdata[c * VIDEO_FONT_HEIGHT + row];
> +
> +                       for (c = 0; c < 8; ++c) {
> +                               *d++ = (bits & 0x80) ?
> +                                       lcd_getfgcolor() : lcd_getbgcolor();
> +                               bits <<= 1;
> +                       }
> +               }
> +       }
> +}
> +
> +static inline void lcd_putc_xy(ushort x, ushort y, uchar c)
> +{
> +       lcd_drawchars(x, y, &c, 1);
> +}
> +
> +static void console_scrollup(void)
> +{
> +       const int rows = CONFIG_CONSOLE_SCROLL_LINES;
> +
> +       /* Copy up rows ignoring those that will be overwritten */
> +       memcpy(CONSOLE_ROW_FIRST,
> +              lcd_console_address + CONSOLE_ROW_SIZE * rows,
> +              CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows);
> +
> +       /* Clear the last rows */
> +#if (LCD_BPP != LCD_COLOR32)
> +       memset(lcd_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows,
> +              lcd_getbgcolor(), CONSOLE_ROW_SIZE * rows);
> +#else
> +       u32 *ppix = lcd_console_address +
> +                   CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows;
> +       u32 i;
> +       for (i = 0;
> +           i < (CONSOLE_ROW_SIZE * rows) / NBYTES(panel_info.vl_bpix);
> +           i++) {
> +               *ppix++ = lcd_getbgcolor();
> +       }
> +#endif
> +       lcd_sync();
> +       console_curr_row -= rows;
> +}
> +
> +static inline void console_back(void)
> +{
> +       if (--console_curr_col < 0) {
> +               console_curr_col = console_cols - 1;
> +               if (--console_curr_row < 0)
> +                       console_curr_row = 0;
> +       }
> +
> +       lcd_putc_xy(console_curr_col * VIDEO_FONT_WIDTH,
> +                   console_curr_row * VIDEO_FONT_HEIGHT, ' ');
> +}
> +
> +static inline void console_newline(void)
> +{
> +       console_curr_col = 0;
> +
> +       /* Check if we need to scroll the terminal */
> +       if (++console_curr_row >= console_rows)
> +               console_scrollup();
> +       else
> +               lcd_sync();
> +}
> +
> +void lcd_putc(const char c)
> +{
> +       if (!lcd_is_enabled) {
> +               serial_putc(c);
> +
> +               return;
> +       }
> +
> +       switch (c) {
> +       case '\r':
> +               console_curr_col = 0;
> +
> +               return;
> +       case '\n':
> +               console_newline();
> +
> +               return;
> +       case '\t':      /* Tab (8 chars alignment) */
> +               console_curr_col +=  8;
> +               console_curr_col &= ~7;
> +
> +               if (console_curr_col >= console_cols)
> +                       console_newline();
> +
> +               return;
> +       case '\b':
> +               console_back();
> +
> +               return;
> +       default:
> +               lcd_putc_xy(console_curr_col * VIDEO_FONT_WIDTH,
> +                           console_curr_row * VIDEO_FONT_HEIGHT, c);
> +               if (++console_curr_col >= console_cols)
> +                       console_newline();
> +       }
> +}
> +
> +void lcd_puts(const char *s)
> +{
> +       if (!lcd_is_enabled) {
> +               serial_puts(s);
> +
> +               return;
> +       }
> +
> +       while (*s)
> +               lcd_putc(*s++);
> +
> +       lcd_sync();
> +}
> +
> +void lcd_printf(const char *fmt, ...)
> +{
> +       va_list args;
> +       char buf[CONFIG_SYS_PBSIZE];
> +
> +       va_start(args, fmt);
> +       vsprintf(buf, fmt, args);
> +       va_end(args);
> +
> +       lcd_puts(buf);
> +}
> diff --git a/include/lcd.h b/include/lcd.h
> index 2235b9b..160f940 100644
> --- a/include/lcd.h
> +++ b/include/lcd.h
> @@ -12,6 +12,7 @@
>
>  #ifndef _LCD_H_
>  #define _LCD_H_
> +#include <lcd_console.h>
>
>  extern char lcd_is_enabled;
>
> diff --git a/include/lcd_console.h b/include/lcd_console.h
> new file mode 100644
> index 0000000..3bc6bb6
> --- /dev/null
> +++ b/include/lcd_console.h
> @@ -0,0 +1,85 @@
> +/*
> + * Copyright (C) 2014, Compulab Ltd - http://compulab.co.il/
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +/* By default we scroll by a single line */
> +#ifndef CONFIG_CONSOLE_SCROLL_LINES
> +#define CONFIG_CONSOLE_SCROLL_LINES 1
> +#endif
> +
> +/**
> + * lcd_init_console() - Initialize lcd console parameters
> + *
> + * Setup the address of console base, and the number of rows and columns the
> + * console has.
> + *
> + * @address: Console base address
> + * @rows: Number of rows in the console
> + * @cols: Number of columns in the console
> + */
> +void lcd_init_console(void *address, int rows, int cols);
> +
> +/**
> + * lcd_set_col() - Set the number of the current lcd console column
> + *
> + * Set the number of the console column where the cursor is.
> + *
> + * @col: Column number
> + */
> +void lcd_set_col(short col);
> +
> +/**
> + * lcd_set_row() - Set the number of the current lcd console row
> + *
> + * Set the number of the console row where the cursor is.
> + *
> + * @row: Row number
> + */
> +void lcd_set_row(short row);
> +
> +/**
> + * lcd_position_cursor() - Position the cursor on the screen
> + *
> + * Position the cursor at the given coordinates on the screen.
> + *
> + * @col: Column number
> + * @row: Row number
> + */
> +void lcd_position_cursor(unsigned col, unsigned row);
> +
> +/**
> + * lcd_get_screen_rows() - Get the total number of screen rows
> + *
> + * @return: Number of screen rows
> + */
> +int lcd_get_screen_rows(void);
> +
> +/**
> + * lcd_get_screen_columns() - Get the total number of screen columns
> + *
> + * @return: Number of screen columns
> + */
> +int lcd_get_screen_columns(void);
> +
> +/**
> + * lcd_putc() - Print to screen a single character at the location of the cursor
> + *
> + * @c: The character to print
> + */
> +void lcd_putc(const char c);
> +
> +/**
> + * lcd_puts() - Print to screen a string at the location of the cursor
> + *
> + * @s: The string to print
> + */
> +void lcd_puts(const char *s);
> +
> +/**
> + * lcd_printf() - Print to screen a formatted string at location of the cursor
> + *
> + * @s: The string to print

Update comment...

> + */
> +void lcd_printf(const char *fmt, ...);
> --
> 1.9.1
>

Regards,
Simon


More information about the U-Boot mailing list