[coreboot] libpayload, coreinfo: ACS support
Jordan Crouse
jordan.crouse at amd.com
Mon Aug 11 22:37:44 CEST 2008
On 10/08/08 16:42 +0200, Ulf Jordan wrote:
> This patch adds support for handling ACS (the alternate/special graphics
> character set) both on VGA and serial console in libpayload. It also
> updates coreinfo to use the ACS_ macros for line graphics.
>
> Build tested against svn HEAD. To actually get any output, the previously
> sent libpayload-kconfig patch, or equivalent, is needed too. Runtime
> tested with coreboot-v3 in QEMU.
>
> /ulf
> Add support for line drawing characters and the alternate character set.
> This enables using the ACS_ curses macros with libpayload.
>
> The translation from ACS_ macros (or characters with attribute A_ALTCHARSET)
> is done using one acs map for the video console, one for serial console
> (xterm/vt100/vt220), and one fallback, from which an ASCII substitute is
> taken if the device specific map doesn't contain an entry (ie NUL).
>
> coreinfo is also adapted to take advantage of the symbolic ACS_ constants.
>
> Signed-off-by: Ulf Jordan <jordan at chalmers.se>
Acked-by: Jordan Crouse <jordan.crouse at amd.com>
r3499 for libpayload
r3501 for coreinfo
In the future, please try to seperate the patches for the different modules.
I know they live in the same tree, but this way is easier if we happen to
need to revert something.
Jordan
> Index: libpayload/include/libpayload.h
> ===================================================================
> --- libpayload/include/libpayload.h.orig 2008-08-10 15:45:28.000000000 +0200
> +++ libpayload/include/libpayload.h 2008-08-10 15:47:03.000000000 +0200
> @@ -110,6 +110,8 @@
> void serial_clear(void);
> void serial_start_bold(void);
> void serial_end_bold(void);
> +void serial_start_altcharset(void);
> +void serial_end_altcharset(void);
> void serial_set_cursor(int y, int x);
>
> /* drivers/speaker.c */
> Index: libpayload/curses/tinycurses.c
> ===================================================================
> --- libpayload/curses/tinycurses.c.orig 2008-08-10 15:45:28.000000000 +0200
> +++ libpayload/curses/tinycurses.c 2008-08-10 15:47:03.000000000 +0200
> @@ -2,6 +2,7 @@
> * This file is part of the libpayload project.
> *
> * Copyright (C) 2007 Uwe Hermann <uwe at hermann-uwe.de>
> + * Copyright (C) 2008 Ulf Jordan <jordan at chalmers.se>
> *
> * Redistribution and use in source and binary forms, with or without
> * modification, are permitted provided that the following conditions
> @@ -88,6 +89,69 @@
> SCREEN *SP;
> chtype acs_map[128];
>
> +/* See terminfo(5). */
> +chtype fallback_acs_map[128] =
> + {
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', '>', '<', '^', 'v', ' ',
> + '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
> + '+', ':', ' ', ' ', ' ', ' ', '\\', '#',
> + '#', '#', '+', '+', '+', '+', '+', '~',
> + '-', '-', '-', '_', '+', '+', '+', '+',
> + '|', '<', '>', '*', '!', 'f', 'o', ' ',
> + };
> +
> +/* See acsc of vt100. */
> +chtype serial_acs_map[128] =
> + {
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + '`', 'a', 0, 0, 0, 0, 'f', 'g',
> + 0, 0, 'j', 'k', 'l', 'm', 'n', 'o',
> + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
> + 'x', 'y', 'z', '{', '|', '}', '~', 0,
> + };
> +
> +/* See acsc of linux. */
> +chtype console_acs_map[128] =
> + {
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, '\020', '\021', '\030', '\031', 0,
> + '\333', 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + 0, 0, 0, 0, 0, 0, 0, 0,
> + '\004', '\261', 0, 0, 0, 0, '\370', '\361',
> + '\260', '\316', '\331', '\277', '\332', '\300', '\305', '~',
> + '\304', '\304', '\304', '_', '\303', '\264', '\301', '\302',
> + '\263', '\363', '\362', '\342', '\330', '\234', '\376', 0,
> + };
> +
> // FIXME: Ugly (and insecure!) hack!
> char sprintf_tmp[1024];
>
> @@ -213,11 +277,14 @@
> /** Note: Must _not_ be called twice! */
> WINDOW *initscr(void)
> {
> - int x, y;
> + int x, y, i;
>
> // newterm(name, stdout, stdin);
> // def_prog_mode();
>
> + for (i = 0; i < 128; i++)
> + acs_map[i] = (chtype) i | A_ALTCHARSET;
> +
> if (curses_flags & F_ENABLE_SERIAL) {
> serial_clear();
> }
> @@ -409,12 +476,12 @@
> // NCURSES_CH_T wch;
> // SetChar2(wch, ch);
>
> - win->_line[win->_cury].text[win->_curx].chars[0] = ch;
> -
> - /* Use the window attributes - perhaps we also pull attributes from
> - the ch itself, I don't know */
> + win->_line[win->_cury].text[win->_curx].chars[0] =
> + ((ch) & (chtype)A_CHARTEXT);
>
> win->_line[win->_cury].text[win->_curx].attr = WINDOW_ATTRS(win);
> + win->_line[win->_cury].text[win->_curx].attr |=
> + ((ch) & (chtype)A_ATTRIBUTES);
> win->_curx++; // FIXME
>
> // if (win && (waddch_nosync(win, wch) != ERR)) {
> @@ -595,10 +662,14 @@
> {
> // FIXME.
> int serial_is_bold = 0;
> + int serial_is_altcharset = 0;
>
> int x, y;
> + chtype ch;
> + int need_altcharset;
>
> serial_end_bold();
> + serial_end_altcharset();
>
> for (y = 0; y <= win->_maxy; y++) {
>
> @@ -614,6 +685,7 @@
> ((int)color_pairs[PAIR_NUMBER(attr)]) << 8;
>
> if (curses_flags & F_ENABLE_SERIAL) {
> + ch = win->_line[y].text[x].chars[0];
>
> if (attr & A_BOLD) {
> if (!serial_is_bold) {
> @@ -628,10 +700,28 @@
> }
> }
>
> - serial_putchar(win->_line[y].text[x].chars[0]);
> + need_altcharset = 0;
> + if (attr & A_ALTCHARSET) {
> + if (serial_acs_map[ch & 0x7f]) {
> + ch = serial_acs_map[ch & 0x7f];
> + need_altcharset = 1;
> + } else
> + ch = fallback_acs_map[ch & 0x7f];
> + }
> + if (need_altcharset && !serial_is_altcharset) {
> + serial_start_altcharset();
> + serial_is_altcharset = 1;
> + }
> + if (!need_altcharset && serial_is_altcharset) {
> + serial_end_altcharset();
> + serial_is_altcharset = 0;
> + }
> +
> + serial_putchar(ch);
> }
>
> if (curses_flags & F_ENABLE_CONSOLE) {
> + ch = win->_line[y].text[x].chars[0];
>
> /* Handle some of the attributes. */
> if (attr & A_BOLD)
> @@ -643,6 +733,12 @@
> c = (c >> 4) & 0xf00;
> c |= tmp << 12;
> }
> + if (attr & A_ALTCHARSET) {
> + if (console_acs_map[ch & 0x7f])
> + ch = console_acs_map[ch & 0x7f];
> + else
> + ch = fallback_acs_map[ch & 0x7f];
> + }
>
> /*
> * FIXME: Somewhere along the line, the
> @@ -650,7 +746,7 @@
> * For now grab just the 8 bit character,
> * but this will break wide characters!
> */
> - c |= (chtype) (win->_line[y].text[x].chars[0] & 0xff);
> + c |= (chtype) (ch & 0xff);
> video_console_putc(win->_begy + y, win->_begx + x, c);
> }
> }
> Index: libpayload/drivers/serial.c
> ===================================================================
> --- libpayload/drivers/serial.c.orig 2008-08-10 15:45:28.000000000 +0200
> +++ libpayload/drivers/serial.c 2008-08-10 15:47:03.000000000 +0200
> @@ -2,6 +2,7 @@
> * This file is part of the libpayload project.
> *
> * Copyright (C) 2008 Advanced Micro Devices, Inc.
> + * Copyright (C) 2008 Ulf Jordan <jordan at chalmers.se>
> *
> * Redistribution and use in source and binary forms, with or without
> * modification, are permitted provided that the following conditions
> @@ -104,6 +105,10 @@
> #define VT100_SBOLD "\e[1m"
> #define VT100_EBOLD "\e[m"
> #define VT100_CURSOR_ADDR "\e[%d;%dH"
> +/* The following smacs/rmacs are actually for xterm; a real vt100 has
> + enacs=\E(B\E)0, smacs=^N, rmacs=^O. */
> +#define VT100_SMACS "\e(0"
> +#define VT100_RMACS "\e(B"
>
> static void serial_putcmd(char *str)
> {
> @@ -126,6 +131,16 @@
> serial_putcmd(VT100_EBOLD);
> }
>
> +void serial_start_altcharset(void)
> +{
> + serial_putcmd(VT100_SMACS);
> +}
> +
> +void serial_end_altcharset(void)
> +{
> + serial_putcmd(VT100_RMACS);
> +}
> +
> void serial_set_cursor(int y, int x)
> {
> char buffer[32];
> Index: coreinfo/coreinfo.c
> ===================================================================
> --- coreinfo/coreinfo.c.orig 2008-08-10 15:45:28.000000000 +0200
> +++ coreinfo/coreinfo.c 2008-08-10 15:47:03.000000000 +0200
> @@ -89,7 +89,7 @@
>
> wmove(win, 1, 1);
> for (i = 0; i < 78; i++)
> - waddch(win, '\304');
> + waddch(win, ACS_HLINE);
> }
>
> static void print_submenu(struct coreinfo_cat *cat)
> Index: coreinfo/pci_module.c
> ===================================================================
> --- coreinfo/pci_module.c.orig 2008-08-10 15:45:28.000000000 +0200
> +++ coreinfo/pci_module.c 2008-08-10 15:47:03.000000000 +0200
> @@ -144,11 +144,11 @@
>
> if (i == 0) {
> if (item != 0)
> - mvwprintw(win, 2 + i, 19, "\30");
> + mvwaddch(win, 2 + i, 19, ACS_UARROW);
> }
> if (i == MENU_VISIBLE - 1) {
> if ((item + 1) < devices_index)
> - mvwprintw(win, 2 + i, 19, "\31");
> + mvwaddch(win, 2 + i, 19, ACS_DARROW);
> }
> }
>
> @@ -160,12 +160,12 @@
> wmove(win, 3, 25);
>
> for (i = 0; i < 48; i++)
> - waddch(win, (i == 0) ? '\332' : '\304');
> + waddch(win, (i == 0) ? ACS_ULCORNER : ACS_HLINE);
>
> for (i = 0; i < 4; i++) {
> mvwprintw(win, 4 + i, 23, "%2.2X", i * 16);
> wmove(win, 4 + i, 25);
> - waddch(win, '\263');
> + waddch(win, ACS_VLINE);
> }
>
> show_config_space(win, 4, 26, menu_selected);
> Index: coreinfo/lar_module.c
> ===================================================================
> --- coreinfo/lar_module.c.orig 2008-08-10 15:45:28.000000000 +0200
> +++ coreinfo/lar_module.c 2008-08-10 15:47:03.000000000 +0200
> @@ -66,7 +66,7 @@
>
> /* Draw a line down the middle. */
> for (i = 2; i < 21; i++)
> - mvwaddch(win, i, 30, '\263');
> + mvwaddch(win, i, 30, ACS_VLINE);
>
> /* Draw the names down the left side. */
> for (i = 0; i < lcount; i++) {
> Index: coreinfo/nvram_module.c
> ===================================================================
> --- coreinfo/nvram_module.c.orig 2008-08-10 15:45:28.000000000 +0200
> +++ coreinfo/nvram_module.c 2008-08-10 15:47:03.000000000 +0200
> @@ -36,9 +36,9 @@
>
> /* Print vertical and horizontal line. */
> for (i = 0; i < 18; i++)
> - mvwaddch(win, 3 + i, 3, '\263');
> + mvwaddch(win, 3 + i, 3, ACS_VLINE);
> for (i = 0; i < 48; i++)
> - mvwaddch(win, 3, 3 + i, (i == 0) ? '\332' : '\304');
> + mvwaddch(win, 3, 3 + i, (i == 0) ? ACS_ULCORNER : ACS_HLINE);
>
> /* Dump NVRAM contents. */
> for (i = 1; i < 257; i++) {
> --
> coreboot mailing list
> coreboot at coreboot.org
> http://www.coreboot.org/mailman/listinfo/coreboot
--
Jordan Crouse
Systems Software Development Engineer
Advanced Micro Devices, Inc.
More information about the coreboot
mailing list