All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Pali Rohár" <pali.rohar@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 09/15] drivers/video/cfb_console.c: Add support for some ANSI terminal escape codes
Date: Sun, 18 Dec 2011 22:34:05 +0100	[thread overview]
Message-ID: <1324244051-25756-9-git-send-email-pali.rohar@gmail.com> (raw)
In-Reply-To: <1324244051-25756-1-git-send-email-pali.rohar@gmail.com>

 * This patch add support for move cursor and reverse colors
   via ANSI espace codes in cfb_console driver
 * ANSI escape codes can be enabled/disabled via CONFIG_CFB_CONSOLE_ANSI

Signed-off-by: Pali Roh?r <pali.rohar@gmail.com>
---
 drivers/video/cfb_console.c |  216 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 215 insertions(+), 1 deletions(-)

diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c
index 3823eae..dc8d99b 100644
--- a/drivers/video/cfb_console.c
+++ b/drivers/video/cfb_console.c
@@ -377,6 +377,10 @@ static int console_row;		/* cursor row */
 
 static u32 eorx, fgx, bgx;	/* color pats */
 
+static char ansi_buf[10] = { 0, };
+static int ansi_buf_size;
+static int ansi_colors_need_revert;
+
 static const int video_font_draw_table8[] = {
 	0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff,
 	0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff,
@@ -602,6 +606,14 @@ static void video_putchar(int xx, int yy, unsigned char c)
 	video_drawchars(xx, yy + video_logo_height, &c, 1);
 }
 
+static void console_swap_colors(void)
+{
+	eorx = fgx;
+	fgx = bgx;
+	bgx = eorx;
+	eorx = fgx ^ bgx;
+}
+
 #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
 static void video_set_cursor(void)
 {
@@ -845,7 +857,7 @@ static void console_cr(void)
 	console_col = 0;
 }
 
-void video_putc(const char c)
+static void parse_putc(const char c)
 {
 	static int nl = 1;
 
@@ -888,6 +900,208 @@ void video_putc(const char c)
 	CURSOR_SET;
 }
 
+void video_putc(const char c)
+{
+#ifdef CONFIG_CFB_CONSOLE_ANSI
+	int i;
+
+	if (c == 27) {
+		for (i = 0; i < ansi_buf_size; ++i)
+			parse_putc(ansi_buf[i]);
+		ansi_buf[0] = 27;
+		ansi_buf_size = 1;
+		return;
+	}
+
+	if (ansi_buf_size > 0) {
+		/*
+		0 - ESC
+		1 - [
+		2 - num1
+		3 - ..
+		4 - ;
+		5 - num2
+		6 - ..
+		7 - cchar
+		*/
+		int next = 0;
+
+		int flush = 0;
+		int fail = 0;
+
+		int num1 = 0;
+		int num2 = 0;
+		int cchar = 0;
+
+		ansi_buf[ansi_buf_size++] = c;
+
+		if (ansi_buf_size >= sizeof(ansi_buf))
+			fail = 1;
+
+		for (i = 0; i < ansi_buf_size; ++i) {
+			if (fail)
+				break;
+
+			switch (next) {
+			case 0:
+				if (ansi_buf[i] == 27)
+					next = 1;
+				else
+					fail = 1;
+				break;
+
+			case 1:
+				if (ansi_buf[i] == '[')
+					next = 2;
+				else
+					fail = 1;
+				break;
+
+			case 2:
+				if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
+					num1 = ansi_buf[i]-'0';
+					next = 3;
+				} else {
+					--i;
+					num1 = 1;
+					next = 4;
+				}
+				break;
+
+			case 3:
+				if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
+					num1 *= 10;
+					num1 += ansi_buf[i]-'0';
+				} else {
+					--i;
+					next = 4;
+				}
+				break;
+
+			case 4:
+				if (ansi_buf[i] != ';') {
+					--i;
+					next = 7;
+				} else
+					next = 5;
+				break;
+
+			case 5:
+				if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
+					num2 = ansi_buf[i]-'0';
+					next = 6;
+				} else
+					fail = 1;
+				break;
+
+			case 6:
+				if (ansi_buf[i] >= '0' && ansi_buf[i] <= '9') {
+					num2 *= 10;
+					num2 += ansi_buf[i]-'0';
+				} else {
+					--i;
+					next = 7;
+				}
+				break;
+
+			case 7:
+				if ((ansi_buf[i] >= 'A' && ansi_buf[i] <= 'H')
+					|| ansi_buf[i] == 'J'
+					|| ansi_buf[i] == 'K'
+					|| ansi_buf[i] == 'm') {
+					cchar = ansi_buf[i];
+					flush = 1;
+				} else
+					fail = 1;
+				break;
+			}
+		}
+
+		if (fail) {
+			for (i = 0; i < ansi_buf_size; ++i)
+				parse_putc(ansi_buf[i]);
+			ansi_buf_size = 0;
+			return;
+		}
+
+		if (flush) {
+			CURSOR_OFF;
+			ansi_buf_size = 0;
+			switch (cchar) {
+			case 'A':
+				/* move cursor num1 rows up */
+				console_cursor_up(num1);
+				break;
+			case 'B':
+				/* move cursor num1 rows down */
+				console_cursor_down(num1);
+				break;
+			case 'C':
+				/* move cursor num1 columns forward */
+				console_cursor_right(num1);
+				break;
+			case 'D':
+				/* move cursor num1 columns back */
+				console_cursor_left(num1);
+				break;
+			case 'E':
+				/* move cursor num1 rows up at begin of row */
+				console_previewsline(num1);
+				break;
+			case 'F':
+				/* move cursor num1 rows down@begin of row */
+				console_newline(num1);
+				break;
+			case 'G':
+				/* move cursor to column num1 */
+				console_cursor_set_position(-1, num1-1);
+				break;
+			case 'H':
+				/* move cursor to row num1, column num2 */
+				console_cursor_set_position(num1-1, num2-1);
+				break;
+			case 'J':
+				/* clear console and move cursor to 0, 0 */
+				console_clear();
+				console_cursor_set_position(0, 0);
+				break;
+			case 'K':
+				/* clear line */
+				if (num1 == 0)
+					console_clear_line(console_row,
+							console_col,
+							CONSOLE_COLS-1);
+				else if (num1 == 1)
+					console_clear_line(console_row,
+							0, console_col);
+				else
+					console_clear_line(console_row,
+							0, CONSOLE_COLS-1);
+				break;
+			case 'm':
+				if (num1 == 0) { /* reset swapped colors */
+					if (ansi_colors_need_revert) {
+						console_swap_colors();
+						ansi_colors_need_revert = 0;
+					}
+				} else if (num1 == 7) { /* once swap colors */
+					if (!ansi_colors_need_revert) {
+						console_swap_colors();
+						ansi_colors_need_revert = 1;
+					}
+				}
+				break;
+			}
+			CURSOR_SET;
+		}
+	} else {
+		parse_putc(c);
+	}
+#else
+	parse_putc(c);
+#endif
+}
+
 void video_puts(const char *s)
 {
 	int count = strlen(s);
-- 
1.7.5.4

  parent reply	other threads:[~2011-12-18 21:34 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-01  8:42 [U-Boot] Help: U-Boot on Nokia RX-51 (aka N900) Pali Rohár
2011-09-01  8:46 ` Marek Vasut
2011-09-01  9:06   ` Pali Rohár
2011-09-01  9:39     ` Marek Vasut
2011-09-01  9:02 ` Stefano Babic
2011-09-01  9:09   ` Pali Rohár
2011-09-01  9:24     ` Stefano Babic
2011-09-01 10:49       ` Pali Rohár
2011-09-01 11:04         ` Marek Vasut
2011-09-01 11:34           ` [U-Boot] [PATCH 01/15] Make bootm optionally use pre-existing atags for Linux kernel boot Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 02/15] Store existing atags at startup if chainloading Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 03/15] Nokia RX-51 aka N900 support Pali Rohár
2011-09-01 13:57               ` Mike Frysinger
2011-10-09  0:20                 ` Pali Rohár
2011-10-09 15:59                   ` Mike Frysinger
2011-10-12 15:10                     ` Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 04/15] Only delay boot if keyboard open Pali Rohár
2011-09-01 13:58               ` Mike Frysinger
2011-10-08 23:29                 ` Pali Rohár
2011-10-09 16:00                   ` Mike Frysinger
2011-09-01 11:34             ` [U-Boot] [PATCH 05/15] Change Wireless LAN mode from M4 to M0 Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 06/15] Look for boot.scr on 'mmc 0:3' instead 'mmc 0' and add support for loading boot.scr from 'mmc 2:1' Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 07/15] RX-51: Fixed compilation on top of master (changes from Beagle Board) Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 08/15] RX-51: Add support for resetting twl4030 watchdog Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 09/15] RX-51: Fix keymap Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 10/15] include/common.h: Add some macros for ANSI escape codes Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 11/15] drivers/video/cfb_console.c: Added support " Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 12/15] New command bootmenu: ANSI terminal Boot Menu support Pali Rohár
2011-09-01 13:59               ` Mike Frysinger
2011-10-08 23:31                 ` Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 13/15] New config variable CONFIG_MENU Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 14/15] New config variable CONFIG_PREMONITOR Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 15/15] RX-51: Add support for bootmenu Pali Rohár
2011-09-01 13:52             ` [U-Boot] [PATCH 01/15] Make bootm optionally use pre-existing atags for Linux kernel boot Mike Frysinger
2011-10-08 23:37               ` Pali Rohár
2011-09-01 11:53         ` [U-Boot] Help: U-Boot on Nokia RX-51 (aka N900) Wolfgang Denk
2011-10-09  0:24           ` Pali Rohár
2011-09-01 17:11 ` Pali Rohár
2011-12-17 16:59 ` [U-Boot] " Pali Rohár
2011-12-17 17:03   ` [U-Boot] [PATCH 01/16] arch/arm/cpu/armv7/omap3/lowlevel_init.S: save_boot_params Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 02/16] arch/arm/lib/bootm.c: Optionally use existing atags Pali Rohár
2011-12-18 18:54       ` Mike Frysinger
2011-12-18 20:12         ` Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 03/16] include/twl4030.h: Add power bus message definitions Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 04/16] include/common.h: Add some ANSI escape codes definitions Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 05/16] common/main.c: Fix function readline Pali Rohár
2011-12-18 18:58       ` Mike Frysinger
2011-12-18 20:12         ` Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 06/16] drivers/video/cfb_console.c: Fix function console_scrollup Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 07/16] drivers/video/cfb_console.c: Add function console_swap_colors Pali Rohár
2011-12-18 18:57       ` Mike Frysinger
2011-12-18 19:00         ` Pali Rohár
2011-12-18 20:06           ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 08/16] drivers/video/cfb_console.c: Add function console_clear and console_clear_line Pali Rohár
2011-12-18 19:00       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 09/16] drivers/video/cfb_console.c: Add functions for moving with cursor Pali Rohár
2011-12-18 19:00       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 10/16] drivers/video/cfb_console.c: Add support for some ANSI terminal escape codes Pali Rohár
2011-12-18 19:01       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 11/16] New command clr: Clear the ANSI terminal Pali Rohár
2011-12-18 18:56       ` Mike Frysinger
2011-12-18 19:20         ` Pali Rohár
2011-12-18 20:07           ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 12/16] New config variable CONFIG_MENUCMD Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 13/16] New config variable CONFIG_PREMONITOR Pali Rohár
2011-12-18 19:05       ` Mike Frysinger
2011-12-18 19:37         ` Pali Rohár
2011-12-18 20:08           ` Mike Frysinger
2011-12-18 20:14             ` Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 14/16] New board support: Nokia RX-51 aka N900 Pali Rohár
2011-12-18 19:06       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 15/16] New command bootmenu: ANSI terminal Boot Menu support Pali Rohár
2011-12-18 19:07       ` Mike Frysinger
2011-12-18 19:12         ` Pali Rohár
2011-12-18 20:07           ` Mike Frysinger
2011-12-18 20:16             ` Pali Rohár
2012-01-06  6:59               ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 16/16] RX-51: Add support for bootmenu Pali Rohár
2011-12-17 19:25   ` [U-Boot] U-Boot on Nokia RX-51 (aka N900) Wolfgang Denk
2011-12-18 10:13     ` Pali Rohár
2011-12-18 12:42       ` Wolfgang Denk
2011-12-18 19:01   ` Mike Frysinger
2011-12-18 20:10     ` Pali Rohár
2011-12-18 21:33   ` [U-Boot] [PATCH v3] " Pali Rohár
2011-12-18 21:33     ` [U-Boot] [PATCH 01/15] arch/arm/cpu/armv7/omap3/lowlevel_init.S: save_boot_params Pali Rohár
2011-12-18 21:33       ` [U-Boot] [PATCH 02/15] arch/arm/lib/bootm.c: Optionally use existing atags Pali Rohár
2011-12-18 21:33       ` [U-Boot] [PATCH 03/15] include/twl4030.h: Add power bus message definitions Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 04/15] include/common.h: Add some ANSI escape codes definitions Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 05/15] common/main.c: Fix function readline Pali Rohár
2012-01-06 20:15         ` Mike Frysinger
2012-01-07  8:51           ` Pali Rohár
2012-02-27  4:33             ` Mike Frysinger
2012-02-27 18:40               ` Pali Rohár
2012-02-27 20:20                 ` Mike Frysinger
2011-12-18 21:34       ` [U-Boot] [PATCH 06/15] drivers/video/cfb_console.c: Fix function console_scrollup Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 07/15] drivers/video/cfb_console.c: Add function console_clear and console_clear_line Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 08/15] drivers/video/cfb_console.c: Add functions for moving with cursor Pali Rohár
2011-12-18 21:34       ` Pali Rohár [this message]
2011-12-18 21:34       ` [U-Boot] [PATCH 10/15] New command clear: Clear the ANSI terminal Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 11/15] New config variable CONFIG_MENUCMD Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 12/15] New config variable CONFIG_PREMONITOR Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 13/15] New board support: Nokia RX-51 aka N900 Pali Rohár
2012-01-03 16:05         ` Tom Rini
2012-01-10 13:14           ` Pali Rohár
2012-01-10 14:53             ` Tom Rini
2011-12-18 21:34       ` [U-Boot] [PATCH 14/15] New command bootmenu: ANSI terminal Boot Menu support Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 15/15] RX-51: Add support for bootmenu Pali Rohár
2012-01-03 16:06         ` Tom Rini
2011-12-18 23:57     ` [U-Boot] [PATCH v3] U-Boot on Nokia RX-51 (aka N900) Wolfgang Denk
2011-12-19  7:17       ` Pali Rohár
2011-12-19  8:43         ` Graeme Russ

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1324244051-25756-9-git-send-email-pali.rohar@gmail.com \
    --to=pali.rohar@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.