[U-Boot] [RFC 3/4] lcd: use ansi console
Andrey Danin
danindrey at mail.ru
Fri Mar 13 23:49:24 CET 2015
Signed-off-by: Andrey Danin <danindrey at mail.ru>
---
common/Makefile | 2 +-
common/lcd.c | 24 ----------
common/lcd_console.c | 122 +++++++++++++++++++++++++++++---------------------
include/lcd_console.h | 33 ++++++++++++++
4 files changed, 105 insertions(+), 76 deletions(-)
diff --git a/common/Makefile b/common/Makefile
index 7216a13..790d76d 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -199,7 +199,7 @@ obj-$(CONFIG_I2C_EDID) += edid.o
obj-$(CONFIG_KALLSYMS) += kallsyms.o
obj-y += splash.o
obj-$(CONFIG_SPLASH_SOURCE) += splash_source.o
-obj-$(CONFIG_LCD) += lcd.o lcd_console.o
+obj-$(CONFIG_LCD) += lcd.o lcd_console.o ansi_console.o
obj-$(CONFIG_LCD_DT_SIMPLEFB) += lcd_simplefb.o
obj-$(CONFIG_LYNXKDI) += lynxkdi.o
obj-$(CONFIG_MENU) += menu.o
diff --git a/common/lcd.c b/common/lcd.c
index f33942c..d408e08 100644
--- a/common/lcd.c
+++ b/common/lcd.c
@@ -47,11 +47,7 @@ DECLARE_GLOBAL_DATA_PTR;
static int lcd_init(void *lcdbase);
static void lcd_logo(void);
-static void lcd_setfgcolor(int color);
-static void lcd_setbgcolor(int color);
-static int lcd_color_fg;
-static int lcd_color_bg;
int lcd_line_length;
char lcd_is_enabled = 0;
static void *lcd_base; /* Start of framebuffer memory */
@@ -311,26 +307,6 @@ ulong lcd_setmem(ulong addr)
return addr;
}
-static void lcd_setfgcolor(int color)
-{
- lcd_color_fg = color;
-}
-
-int lcd_getfgcolor(void)
-{
- return lcd_color_fg;
-}
-
-static void lcd_setbgcolor(int color)
-{
- lcd_color_bg = color;
-}
-
-int lcd_getbgcolor(void)
-{
- return lcd_color_bg;
-}
-
#ifdef CONFIG_LCD_LOGO
__weak void lcd_logo_set_cmap(void)
{
diff --git a/common/lcd_console.c b/common/lcd_console.c
index 8bf83b9..b30fa3a 100644
--- a/common/lcd_console.c
+++ b/common/lcd_console.c
@@ -7,6 +7,7 @@
*/
#include <common.h>
+#include <ansi_console.h>
#include <lcd.h>
#include <video_font.h> /* Get font data, width and height */
@@ -14,11 +15,19 @@
#define CONSOLE_ROW_FIRST lcd_console_address
#define CONSOLE_SIZE (CONSOLE_ROW_SIZE * console_rows)
-static short console_curr_col;
-static short console_curr_row;
-static short console_cols;
-static short console_rows;
+static int console_curr_col;
+static int console_curr_row;
+static int console_cols;
+static int console_rows;
static void *lcd_console_address;
+static int lcd_color_fg;
+static int lcd_color_bg;
+
+static struct ansi_console_t ansi_console;
+
+static inline void lcd_putc_cr(int col, int row, const char c);
+static void console_scrollup(int rows);
+static inline void console_clear_line(int line, int begin, int end);
void lcd_init_console(void *address, int rows, int cols)
{
@@ -27,6 +36,23 @@ void lcd_init_console(void *address, int rows, int cols)
console_cols = cols;
console_rows = rows;
lcd_console_address = address;
+
+ memset(&ansi_console, 0, sizeof(ansi_console));
+ ansi_console.putc_cr = lcd_putc_cr;
+ ansi_console.cols = console_cols;
+ ansi_console.rows = console_rows;
+#if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
+#warning Cursor is not implemented for LCD ANSI console
+ ansi_console.cursor_set = NULL;
+ ansi_console.cursor_enable = NULL;
+#endif
+ ansi_console.sync = lcd_sync;
+ ansi_console.scroll = console_scrollup;
+ ansi_console.clear_line = console_clear_line;
+ ansi_console.clear = lcd_clear;
+ ansi_console.swap_colors = lcd_swap_colors;
+ ansi_console.console_col = &console_curr_col;
+ ansi_console.console_row = &console_curr_row;
}
void lcd_set_col(short col)
@@ -39,6 +65,33 @@ void lcd_set_row(short row)
console_curr_row = row;
}
+int lcd_getbgcolor(void)
+{
+ return lcd_color_bg;
+}
+
+void lcd_setbgcolor(int color)
+{
+ lcd_color_bg = color;
+}
+
+int lcd_getfgcolor(void)
+{
+ return lcd_color_fg;
+}
+
+void lcd_setfgcolor(int color)
+{
+ lcd_color_fg = color;
+}
+
+void lcd_swap_colors(void)
+{
+ int tmp = lcd_getbgcolor();
+ lcd_setbgcolor(lcd_getfgcolor());
+ lcd_setfgcolor(tmp);
+}
+
void lcd_position_cursor(unsigned col, unsigned row)
{
console_curr_col = min_t(short, col, console_cols - 1);
@@ -96,9 +149,13 @@ static inline void lcd_putc_xy(ushort x, ushort y, uchar c)
lcd_drawchars(x, y, &c, 1);
}
-static void console_scrollup(void)
+static inline void lcd_putc_cr(int col, int row, const char c)
+{
+ lcd_putc_xy(col * VIDEO_FONT_WIDTH, row * VIDEO_FONT_HEIGHT, (uchar)c);
+}
+
+static void console_scrollup(int rows)
{
- const int rows = CONFIG_CONSOLE_SCROLL_LINES;
int bg_color = lcd_getbgcolor();
/* Copy up rows ignoring those that will be overwritten */
@@ -124,27 +181,16 @@ static void console_scrollup(void)
console_curr_row -= rows;
}
-static inline void console_back(void)
+static inline void console_clear_line(int line, int begin, int end)
{
- if (--console_curr_col < 0) {
- console_curr_col = console_cols - 1;
- if (--console_curr_row < 0)
- console_curr_row = 0;
- }
+ short i = 0;
- lcd_putc_xy(console_curr_col * VIDEO_FONT_WIDTH,
- console_curr_row * VIDEO_FONT_HEIGHT, ' ');
-}
+ if (end == -1)
+ end = console_cols - 1;
-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();
+ for (i = begin; i < end; ++i)
+ lcd_putc_xy(i * VIDEO_FONT_WIDTH,
+ line * VIDEO_FONT_HEIGHT, ' ');
}
void lcd_putc(const char c)
@@ -155,33 +201,7 @@ void lcd_putc(const char 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();
- }
+ ansi_putc(&ansi_console, c);
}
void lcd_puts(const char *s)
diff --git a/include/lcd_console.h b/include/lcd_console.h
index 429214d..ea66ddb 100644
--- a/include/lcd_console.h
+++ b/include/lcd_console.h
@@ -40,6 +40,39 @@ void lcd_set_col(short col);
void lcd_set_row(short row);
/**
+ * lcd_getbgcolor() - Get current background color value
+ *
+ * @return: Color value
+ */
+int lcd_getbgcolor(void);
+
+/**
+ * lcd_setbgcolor() - Set background color value
+ *
+ * @color: Color value
+ */
+void lcd_setbgcolor(int color);
+
+/**
+ * lcd_getfgcolor() - Get current foreground color value
+ *
+ * @return: Color value
+ */
+int lcd_getfgcolor(void);
+
+/**
+ * lcd_setfgcolor() - Set foreground color value
+ *
+ * @color: Color value
+ */
+void lcd_setfgcolor(int color);
+
+/**
+ * lcd_swap_colors() - Swap background and foreground color values
+ */
+void lcd_swap_colors(void);
+
+/**
* lcd_position_cursor() - Position the cursor on the screen
*
* Position the cursor at the given coordinates on the screen.
--
1.9.1
More information about the U-Boot
mailing list