[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