Hi Nikita, On 30 November 2014 at 06:22, Nikita Kiryanov <[email protected]> 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 <[email protected]> > Cc: Anatolij Gustschin <[email protected]> > Cc: Wolfgang Denk <[email protected]> > Cc: Simon Glass <[email protected]> > --- > 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 <[email protected]> Tested on pit, LCD works fine. Tested-by: Simon Glass <[email protected]> > > 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 -- [email protected] > + * 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 _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

