[coreboot] [PATCH 2/2] libpayload: support color over serial

Ulf Jordan jordan at chalmers.se
Sun Aug 10 16:47:14 CEST 2008


This patch adds support for color output over serial from 
libpayload/tinycurses. It assumes that the ACS patch has been applied 
first.

Build and run tested (coreinfo+libpayload+coreboot-v3 in QEMU) the same 
way as the ACS patch.

/ulf
-------------- next part --------------
Add support for curses color output over serial.

Note that the sequence \e[m for turning off bold resets all attributes,
including color.

Signed-off-by: Ulf Jordan <jordan at chalmers.se>

Index: libpayload/curses/tinycurses.c
===================================================================
--- libpayload/curses/tinycurses.c.orig	2008-08-10 15:47:03.000000000 +0200
+++ libpayload/curses/tinycurses.c	2008-08-10 16:09:22.000000000 +0200
@@ -663,6 +663,7 @@
 	// FIXME.
 	int serial_is_bold = 0;
 	int serial_is_altcharset = 0;
+	int serial_cur_color = color_pairs[0];
 
 	int x, y;
 	chtype ch;
@@ -682,7 +683,7 @@
 			attr_t attr = win->_line[y].text[x].attr;
 
 			unsigned int c =
-				((int)color_pairs[PAIR_NUMBER(attr)]) << 8;
+				((int)color_pairs[PAIR_NUMBER(attr)]);
 
 			if (curses_flags & F_ENABLE_SERIAL) {
 				ch = win->_line[y].text[x].chars[0];
@@ -697,6 +698,7 @@
 					if (serial_is_bold) {
 						serial_end_bold();
 						serial_is_bold = 0;
+						serial_cur_color = color_pairs[0];
 					}
 				}
 
@@ -717,9 +719,16 @@
 					serial_is_altcharset = 0;
 				}
 
+				if (serial_cur_color != c) {
+					serial_set_color(c);
+					serial_cur_color = c;
+				}
+
 				serial_putchar(ch);
 			}
 
+			c <<= 8;
+
 			if (curses_flags & F_ENABLE_CONSOLE) {
 				ch = win->_line[y].text[x].chars[0];
 
Index: libpayload/drivers/serial.c
===================================================================
--- libpayload/drivers/serial.c.orig	2008-08-10 15:47:03.000000000 +0200
+++ libpayload/drivers/serial.c	2008-08-10 16:09:22.000000000 +0200
@@ -109,6 +109,8 @@
    enacs=\E(B\E)0, smacs=^N, rmacs=^O.  */
 #define VT100_SMACS       "\e(0"
 #define VT100_RMACS       "\e(B"
+/* A plain vt100 doesn't do color, setaf/setab below are from xterm. */
+#define VT100_SET_COLOR   "\e[3%d;4%dm"
 
 static void serial_putcmd(char *str)
 {
@@ -141,6 +143,14 @@
 	serial_putcmd(VT100_RMACS);
 }
 
+void serial_set_color(unsigned char color)
+{
+	char buffer[32];
+	snprintf(buffer, sizeof(buffer), VT100_SET_COLOR, color & 0xf,
+		(color >> 4) & 0xf);
+	serial_putcmd(buffer);
+}
+
 void serial_set_cursor(int y, int x)
 {
 	char buffer[32];
Index: libpayload/include/libpayload.h
===================================================================
--- libpayload/include/libpayload.h.orig	2008-08-10 16:02:00.000000000 +0200
+++ libpayload/include/libpayload.h	2008-08-10 16:09:22.000000000 +0200
@@ -112,6 +112,7 @@
 void serial_end_bold(void);
 void serial_start_altcharset(void);
 void serial_end_altcharset(void);
+void serial_set_color(unsigned char color);
 void serial_set_cursor(int y, int x);
 
 /* drivers/speaker.c */


More information about the coreboot mailing list