Re: [U-Boot] [PATCH 05/11] efi_loader: console support for color attributes

2017-10-11 Thread Alexander Graf


On 10.10.17 14:23, Rob Clark wrote:
> Shell.efi uses this, and supporting color attributes makes things look
> nicer.  Map the EFI fg/bg color attributes to ANSI escape sequences.
> Not all colors have a perfect match, but spec just says "Devices
> supporting a different number of text colors are required to emulate the
> above colors to the best of the device’s capabilities".
> 
> Signed-off-by: Rob Clark 

Reviewed-by: Alexander Graf 

Alex
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH 05/11] efi_loader: console support for color attributes

2017-10-10 Thread Heinrich Schuchardt



On 10/10/2017 02:23 PM, Rob Clark wrote:

Shell.efi uses this, and supporting color attributes makes things look
nicer.  Map the EFI fg/bg color attributes to ANSI escape sequences.
Not all colors have a perfect match, but spec just says "Devices
supporting a different number of text colors are required to emulate the
above colors to the best of the device’s capabilities".

Signed-off-by: Rob Clark 
---
  include/efi_api.h| 33 +
  lib/efi_loader/efi_console.c | 27 +--
  2 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/include/efi_api.h b/include/efi_api.h
index 58bf15b8e6..9610d03d47 100644
--- a/include/efi_api.h
+++ b/include/efi_api.h
@@ -427,6 +427,39 @@ struct simple_text_output_mode {
EFI_GUID(0x387477c2, 0x69c7, 0x11d2, \
 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
  
+#define EFI_BLACK0x00

+#define EFI_BLUE 0x01
+#define EFI_GREEN0x02
+#define EFI_CYAN 0x03
+#define EFI_RED  0x04
+#define EFI_MAGENTA  0x05
+#define EFI_BROWN0x06
+#define EFI_LIGHTGRAY0x07
+#define EFI_BRIGHT   0x08
+#define EFI_DARKGRAY 0x08
+#define EFI_LIGHTBLUE0x09
+#define EFI_LIGHTGREEN   0x0a
+#define EFI_LIGHTCYAN0x0b
+#define EFI_LIGHTRED 0x0c
+#define EFI_LIGHTMAGENTA 0x0d
+#define EFI_YELLOW   0x0e
+#define EFI_WHITE0x0f
+#define EFI_BACKGROUND_BLACK 0x00
+#define EFI_BACKGROUND_BLUE  0x10
+#define EFI_BACKGROUND_GREEN 0x20
+#define EFI_BACKGROUND_CYAN  0x30
+#define EFI_BACKGROUND_RED   0x40
+#define EFI_BACKGROUND_MAGENTA   0x50
+#define EFI_BACKGROUND_BROWN 0x60
+#define EFI_BACKGROUND_LIGHTGRAY 0x70
+
+/* extract foreground color from EFI attribute */
+#define EFI_ATTR_FG(attr)((attr) & 0x07)
+/* treat high bit of FG as bright/bold (similar to edk2) */
+#define EFI_ATTR_BOLD(attr)  (((attr) >> 3) & 0x01)
+/* extract background color from EFI attribute */
+#define EFI_ATTR_BG(attr)(((attr) >> 4) & 0x7)
+
  struct efi_simple_text_output_protocol {
void *reset;
efi_status_t (EFIAPI *output_string)(
diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c
index f508b79ab8..c25d6b16f2 100644
--- a/lib/efi_loader/efi_console.c
+++ b/lib/efi_loader/efi_console.c
@@ -316,14 +316,37 @@ static efi_status_t EFIAPI efi_cout_set_mode(
return EFI_EXIT(EFI_SUCCESS);
  }
  
+static const struct {

+   unsigned fg;
+   unsigned bg;
+} color[] = {
+   { 30, 40 }, /* 0: black */
+   { 34, 44 }, /* 1: blue */
+   { 32, 42 }, /* 2: green */
+   { 36, 46 }, /* 3: cyan */
+   { 31, 41 }, /* 4: red */
+   { 35, 45 }, /* 5: magenta */
+   { 33, 43 }, /* 6: brown, map to yellow as edk2 does*/
+   { 37, 47 }, /* 7: light grey, map to white */
+};
+
+/* See EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute(). */
  static efi_status_t EFIAPI efi_cout_set_attribute(
struct efi_simple_text_output_protocol *this,
unsigned long attribute)
  {
+   unsigned int bold = EFI_ATTR_BOLD(attribute);
+   unsigned int fg = EFI_ATTR_FG(attribute);
+   unsigned int bg = EFI_ATTR_BG(attribute);
+
EFI_ENTRY("%p, %lx", this, attribute);
  
-	/* Just ignore attributes (colors) for now */

-   return EFI_EXIT(EFI_UNSUPPORTED);
+   if (attribute)
+   printf(ESC"[%u;%u;%um", bold, color[fg].fg, color[bg].bg);
+   else


Maybe Alex can just add a comment here when merging:

/* EFI console expects attribute = 0 to result in default colors. */


+   printf(ESC"[0;37;40m");
+
+   return EFI_EXIT(EFI_SUCCESS);
  }
  
  static efi_status_t EFIAPI efi_cout_clear_screen(




Works fine.

See appended screenshot.

Tested-by: Heinrich Schuchardt 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot