All of lore.kernel.org
 help / color / mirror / Atom feed
* Grub & accessibility
@ 2009-07-07 13:50 Samuel Thibault
  2009-07-10 17:22 ` Robert Millan
  0 siblings, 1 reply; 7+ messages in thread
From: Samuel Thibault @ 2009-07-07 13:50 UTC (permalink / raw)
  To: phcoder; +Cc: grub-devel

[-- Attachment #1: Type: text/plain, Size: 2032 bytes --]

Hello,

(Cc-ing the grub-devel mailing list for the record)

Just a few short points:

- brltty GPL2+ and has a _lot_ of drivers for braille devices, it would
  be sad to not reuse them :)
- speakup is also GPL2+ and has drivers for hardware speech syntheses.
- qemu can emulate a Baum braille device through the -usbserial braille
  or -serial braille options.  The output needs to be done through
  brltty, thanks to its virtual braille device for instance.  I had
  written some howto on http://brl.thefreecat.org/text-apps-a11y-test.html
- I had already developed something to make grub accessible through
  braille devices, in GRUB1, as a prototype, I've attached it. I've
  never had the time to develop it more.

How I see things working concerning braille: you can have a look at my
prototype to see how I had done it, and probably more importantly, what
the interface with device drivers would look like: braille.h only has
braille_init() to initialize the serial port and braille_write() to
output text. One missing thing is a function that tells how large the
braille device is (usually it's 40 cells).

A simple way to proceed easily from the core grub part would be to write
a prototype that just outputs text on the serial port as is, so that you
just need to use -serial stdio for instance.  Glueing brltty drivers to
it could then be done independently, I can handle that as I know them
quite well.

Concerning screen reading, the way that is usually used is that normal
PC keyboard actions work as usual, the regular screen output works as
usual, and the braille device and speech output the text corresponding
to the current action (e.g. the currently selected menu entry).  That
should already be a good thing. One thing to remember is that it's
important to keep the regular output so that blind users can be easily
helped by sighted people.

Then there can be a more complete screen reader, by using keypresses
from the braille device or PC keyboard shortcuts, that permits to browse
around the screen.

Samuel

[-- Attachment #2: patch-grub-braille.diff --]
[-- Type: text/plain, Size: 32041 bytes --]

diff -urN grub-debian-patched/configure.ac grub-0.95+cvs20040624/configure.ac
--- grub-debian-patched/configure.ac	2005-09-05 03:57:02.000000000 +0200
+++ grub-0.95+cvs20040624/configure.ac	2005-09-05 03:56:54.000000000 +0200
@@ -610,6 +610,16 @@
   [  --disable-serial        disable serial terminal support])
 AM_CONDITIONAL(SERIAL_SUPPORT, test "x$enable_serial" != xno)
 
+dnl Braille terminal
+AC_ARG_ENABLE(braille,
+  [  --disable-braille       disable braille terminal support])
+AM_CONDITIONAL(BRAILLE_SUPPORT, test "x$enable_braille" != xno)
+
+dnl VisioBraille terminal
+AC_ARG_ENABLE(visiobraille,
+  [  --disable-visiobraille  disable visiobraille terminal support])
+AM_CONDITIONAL(VISIOBRAILLE_SUPPORT, test "x$enable_visiobraille" != xno)
+
 dnl Simulation of the slowness of a serial device.
 AC_ARG_ENABLE(serial-speed-simulation,
   [  --enable-serial-speed-simulation
diff -urN grub-debian-patched/stage2/Makefile.am grub-0.95+cvs20040624/stage2/Makefile.am
--- grub-debian-patched/stage2/Makefile.am	2005-09-05 03:57:03.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/Makefile.am	2005-09-05 03:56:57.000000000 +0200
@@ -7,7 +7,7 @@
         fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
 	imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
 	nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
-	terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h graphics.h
+	terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h graphics.h braille.h visiobraille.h
 EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
 
 # For <stage1.h>.
@@ -19,12 +19,13 @@
 	disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
 	fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
 	fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
-	terminfo.c tparm.c graphics.c
+	terminfo.c tparm.c graphics.c braille.c visiobraille.c
 libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
 	-DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
 	-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
 	-DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
 	-DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 \
+	-DSUPPORT_BRAILLE=1 -DSUPPORT_VISIOBRAILLE=1 \
 	-fwritable-strings
 
 # Stage 2 and Stage 1.5's.
@@ -86,8 +87,20 @@
 GRAPHICS_FLAGS =
 endif
 
+if BRAILLE_SUPPORT
+BRAILLE_FLAGS = -DSUPPORT_BRAILLE=1
+else
+BRAILLE_FLAGS =
+endif
+
+if VISIOBRAILLE_SUPPORT
+VISIOBRAILLE_FLAGS = -DSUPPORT_VISIOBRAILLE=1
+else
+VISIOBRAILLE_FLAGS =
+endif
+
 STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
-	$(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS)
+	$(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS) $(BRAILLE_FLAGS) $(VISIOBRAILLE_FLAGS)
 
 STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
 STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
@@ -98,7 +111,7 @@
 	fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
 	fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \
 	hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c \
-	graphics.c
+	graphics.c braille.c visiobraille.c
 pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
 pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
 pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)
diff -urN grub-debian-patched/stage2/boot.c grub-0.95+cvs20040624/stage2/boot.c
--- grub-debian-patched/stage2/boot.c	2005-09-05 03:57:03.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/boot.c	2005-09-05 03:56:57.000000000 +0200
@@ -25,6 +25,8 @@
 #include "imgact_aout.h"
 #include "i386-elf.h"
 
+#include "braille.h"
+
 static int cur_addr;
 entry_func entry_addr;
 static struct mod_list mll[99];
@@ -274,6 +276,7 @@
       if (! big_linux
 	  && text_len > linux_data_real_addr - (char *) LINUX_ZIMAGE_ADDR)
 	{
+	  braille_write("linux 'zImage' kernel too big, try 'make bzImage'", -1);
 	  grub_printf (" linux 'zImage' kernel too big, try 'make bzImage'\n");
 	  errnum = ERR_WONT_FIT;
 	}
diff -urN grub-debian-patched/stage2/braille.c grub-0.95+cvs20040624/stage2/braille.c
--- grub-debian-patched/stage2/braille.c	1970-01-01 01:00:00.000000000 +0100
+++ grub-0.95+cvs20040624/stage2/braille.c	2005-09-07 03:11:57.000000000 +0200
@@ -0,0 +1,78 @@
+#include <shared.h>
+#ifdef SUPPORT_BRAILLE
+#include <braille.h>
+#ifdef SUPPORT_VISIOBRAILLE
+#include <visiobraille.h>
+#endif
+static int x = 40, y = 1;
+static int inited;
+
+int braille_init (int unit, int hp)
+{
+#ifdef SUPPORT_VISIOBRAILLE
+  return (inited = vs_init (unit, &x, &y, hp));
+#endif
+  return 1;
+}
+
+static unsigned char latin1_2_dots_vs[256] = {
+0X00, 0X81, 0X83, 0X89, 0X99, 0X91, 0X8B, 0X9B,
+0X93, 0X8A, 0X9A, 0X85, 0X87, 0X8D, 0X9D, 0X95,
+0X8F, 0X9F, 0X97, 0X8E, 0X9E, 0XA5, 0XA7, 0XBA,
+0XAD, 0XBD, 0XB5, 0XFC, 0XA1, 0XA3, 0XA9, 0XB9,
+0X00, 0X16, 0X08, 0X28, 0X38, 0X18, 0X1C, 0X04,
+0X20, 0X14, 0X0C, 0X30, 0X02, 0X24, 0X32, 0X3F,
+0X3C, 0X21, 0X23, 0X29, 0X39, 0X31, 0X2B, 0X3B,
+0X33, 0X2A, 0X12, 0X06, 0X26, 0X36, 0X34, 0X22,
+0X2F, 0X41, 0X43, 0X49, 0X59, 0X51, 0X4B, 0X5B,
+0X53, 0X4A, 0X5A, 0X45, 0X47, 0X4D, 0X5D, 0X55,
+0X4F, 0X5F, 0X57, 0X4E, 0X5E, 0X65, 0X67, 0X7A,
+0X6D, 0X7D, 0X75, 0X37, 0X2E, 0X3E, 0X2C, 0X84,
+0X44, 0X01, 0X03, 0X09, 0X19, 0X11, 0X0B, 0X1B,
+0X13, 0X0A, 0X1A, 0X05, 0X07, 0X0D, 0X1D, 0X15,
+0X0F, 0X1F, 0X17, 0X0E, 0X1E, 0X25, 0X27, 0X3A,
+0X2D, 0X3D, 0X35, 0X60, 0X96, 0X94, 0XD0, 0X00,
+0XEF, 0XB3, 0X00, 0XA1, 0X9C, 0XB7, 0X00, 0XAF,
+0XA3, 0XAB, 0XAE, 0XBB, 0XA9, 0X00, 0XDC, 0X00,
+0XFF, 0X00, 0X00, 0XB9, 0XAA, 0X00, 0XB1, 0XBE,
+0XBB, 0XEA, 0XF3, 0X00, 0X00, 0X00, 0X00, 0X00,
+0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+0XF7, 0X00, 0XC1, 0X00, 0XD4, 0X00, 0X00, 0XEF,
+0X00, 0XFF, 0XE3, 0XEB, 0X00, 0X00, 0XE9, 0XFB,
+0X00, 0X00, 0X00, 0X00, 0XF5, 0X00, 0XEA, 0X00,
+0X00, 0XFE, 0X00, 0XF1, 0XF3, 0X00, 0X00, 0X00,
+0XB7, 0X00, 0XA1, 0X00, 0X9C, 0X00, 0X00, 0XAF,
+0XAE, 0XBF, 0XA3, 0XAB, 0X00, 0X00, 0XA9, 0XBB,
+0X00, 0X00, 0X00, 0X00, 0XB9, 0X00, 0XAA, 0X00,
+0X00, 0XBE, 0X00, 0XB1, 0XB3, 0X00, 0X00, 0X00
+};
+void braille_write (unsigned char *message, int cursor)
+{
+  int offset;
+  int i;
+  int size = strlen(message);
+  char buf[x];
+  if (!inited)
+    return;
+  if (cursor >= 0 && cursor <= size)
+    {
+      offset = (cursor / x) * x;
+      message += offset;
+      size -= offset;
+      cursor = cursor % x;
+    }
+  else
+    cursor = -1;
+  if (size > x)
+    size = x;
+  for (i=0; i<size; i++)
+    buf[i] = latin1_2_dots_vs[message[i]];
+  memset(&buf[i], 0, x-size);
+  if (cursor != -1)
+    buf[cursor] |= BRL_DOT7|BRL_DOT8;
+  vs_write(buf, size);
+}
+#endif
diff -urN grub-debian-patched/stage2/braille.h grub-0.95+cvs20040624/stage2/braille.h
--- grub-debian-patched/stage2/braille.h	1970-01-01 01:00:00.000000000 +0100
+++ grub-0.95+cvs20040624/stage2/braille.h	2005-09-07 03:26:34.000000000 +0200
@@ -0,0 +1,14 @@
+#ifdef SUPPORT_BRAILLE
+#define BRL_DOT1 (1<<(1-1))
+#define BRL_DOT2 (1<<(2-1))
+#define BRL_DOT3 (1<<(3-1))
+#define BRL_DOT4 (1<<(4-1))
+#define BRL_DOT5 (1<<(5-1))
+#define BRL_DOT6 (1<<(6-1))
+#define BRL_DOT7 (1<<(7-1))
+#define BRL_DOT8 (1<<(8-1))
+int braille_init(int unit, int hp);
+void braille_write(unsigned char *message, int cursor);
+#else
+#define braille_write(m, c) ((void)0)
+#endif
diff -urN grub-debian-patched/stage2/builtins.c grub-0.95+cvs20040624/stage2/builtins.c
--- grub-debian-patched/stage2/builtins.c	2005-09-05 03:57:04.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/builtins.c	2005-09-07 03:08:25.000000000 +0200
@@ -28,6 +28,8 @@
 #include <filesys.h>
 #include <term.h>
 
+#include <braille.h>
+
 #ifdef SUPPORT_NETBOOT
 # define GRUB	1
 # include <etherboot.h>
@@ -378,6 +380,28 @@
 #endif /* SUPPORT_NETBOOT */
 
 \f
+#ifdef SUPPORT_BRAILLE
+/* braille */
+static int
+braille_func (char *arg, int flags)
+{
+  int hp = 0;
+  if (substring ("--hp", arg) <= 0)
+    hp = 1;
+  return braille_init(0, hp);
+}
+
+static struct builtin builtin_braille =
+{
+  "braille",
+  braille_func,
+  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
+  "braille",
+  "Initialize a braille device."
+};
+#endif /* SUPPORT_BRAILLE */
+
+\f
 /* cat */
 static int
 cat_func (char *arg, int flags)
@@ -3086,6 +3110,7 @@
 static int
 pause_func (char *arg, int flags)
 {
+  braille_write(arg, -1);
   printf("%s\n", arg);
 
   /* If ESC is returned, then abort this entry.  */
@@ -4372,6 +4397,7 @@
 		    if (term_bitmap & (1 << i))
 		      {
 			current_term = term_table + i;
+			braille_write("Press any key to continue.", -1);
 			grub_printf ("\rPress any key to continue.\n");
 		      }
 		  
@@ -4952,6 +4978,9 @@
 #ifdef SUPPORT_NETBOOT
   &builtin_bootp,
 #endif /* SUPPORT_NETBOOT */
+#ifdef SUPPORT_BRAILLE
+  &builtin_braille,
+#endif /* SUPPORT_BRAILLE */
   &builtin_cat,
   &builtin_chainloader,
   &builtin_clear,
diff -urN grub-debian-patched/stage2/char_io.c grub-0.95+cvs20040624/stage2/char_io.c
--- grub-debian-patched/stage2/char_io.c	2005-09-05 03:57:04.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/char_io.c	2005-09-07 03:31:44.000000000 +0200
@@ -29,6 +29,8 @@
 # include <serial.h>
 #endif
 
+#include <braille.h>
+
 #ifndef STAGE1_5
 struct term_entry term_table[] =
   {
@@ -361,6 +363,7 @@
   void cl_backward (int count)
     {
       lpos -= count;
+      braille_write(buf, lpos);
       
       /* If the cursor is in the first section, display the first section
 	 instead of the second.  */
@@ -388,6 +391,7 @@
   void cl_forward (int count)
     {
       lpos += count;
+      braille_write(buf, lpos);
 
       /* If the cursor goes outside, scroll the screen to the right.  */
       if (xpos + count >= CMDLINE_WIDTH)
@@ -478,6 +482,7 @@
 	}
 
       /* Print BUF. If ECHO_CHAR is not zero, put it instead.  */
+      braille_write(buf, lpos);
       for (i = start; i < start + len && i < llen; i++)
 	{
 	  if (! echo_char)
@@ -830,6 +835,7 @@
 
       /* Print only the prompt. The contents of CMDLINE is simply discarded,
 	 even if it is not empty.  */
+      braille_write(prompt, -1);
       grub_printf ("%s", prompt);
 
       /* Gather characters until a newline is gotten.  */
@@ -845,6 +851,7 @@
 	  /* Printable characters are added into CMDLINE.  */
 	  if (c >= ' ' && c <= '~')
 	    {
+	      // TODO: put in some editing buffer for braille output.
 	      if (! (current_term->flags & TERM_NO_ECHO))
 		grub_putchar (c);
 
@@ -1076,6 +1083,7 @@
 	      if (current_term->setcolorstate)
 		current_term->setcolorstate (COLOR_STATE_HIGHLIGHT);
 	      
+	      braille_write ("[Hit return to continue]", -1);
 	      grub_printf ("[Hit return to continue]");
 
 	      if (current_term->setcolorstate)
diff -urN grub-debian-patched/stage2/cmdline.c grub-0.95+cvs20040624/stage2/cmdline.c
--- grub-debian-patched/stage2/cmdline.c	2005-09-05 03:57:04.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/cmdline.c	2005-09-05 03:56:57.000000000 +0200
@@ -25,6 +25,8 @@
 # include <etherboot.h>
 #endif
 
+#include <braille.h>
+
 grub_jmp_buf restart_cmdline_env;
 
 /* Find the next word from CMDLINE and return the pointer. If
@@ -203,6 +205,7 @@
 	     intervention.  */
 	  if (fallback_entry < 0)
 	    {
+	      braille_write("Press any key to continue...", -1);
 	      grub_printf ("\nPress any key to continue...");
 	      (void) getkey ();
 	    }
@@ -232,12 +235,15 @@
       builtin = find_command (heap);
       if (! builtin)
 	{
+	  braille_write(old_entry, -1);
 	  grub_printf ("%s\n", old_entry);
 	  continue;
 	}
 
-      if (! (builtin->flags & BUILTIN_NO_ECHO))
+      if (! (builtin->flags & BUILTIN_NO_ECHO)) {
+	braille_write(old_entry, -1);
 	grub_printf ("%s\n", old_entry);
+      }
 
       /* If BUILTIN cannot be run in the command-line, skip it.  */
       if (! (builtin->flags & BUILTIN_CMDLINE))
diff -urN grub-debian-patched/stage2/serial.c grub-0.95+cvs20040624/stage2/serial.c
--- grub-debian-patched/stage2/serial.c	2005-09-05 03:57:04.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/serial.c	2005-09-07 00:11:07.000000000 +0200
@@ -103,6 +103,16 @@
 	/* There is something wrong. But what can I do?  */
 	return;
     }
+  /* Wait until CTS is up.  */
+  timeout=1000;
+  while ((inb (serial_hw_port + UART_MSR) & UART_CLEAR_TO_SEND) == 0)
+    {
+      if (--timeout == 0)
+	/* There is something wrong. But what can I do?  */
+	//return;
+	/* Send anyway, just in case the device does actually not support RTS/CTS */
+	break;
+    }
 
   outb (serial_hw_port + UART_TX, c);
 }
diff -urN grub-debian-patched/stage2/serial.h grub-0.95+cvs20040624/stage2/serial.h
--- grub-debian-patched/stage2/serial.h	2005-09-05 03:57:04.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/serial.h	2005-09-04 21:29:49.000000000 +0200
@@ -41,6 +41,9 @@
 #define UART_DATA_READY		0x01
 #define UART_EMPTY_TRANSMITTER	0x20
 
+/* For MSR bits.  */
+#define UART_CLEAR_TO_SEND	0x10
+
 /* The type of parity.  */
 #define UART_NO_PARITY		0x00
 #define UART_ODD_PARITY		0x08
diff -urN grub-debian-patched/stage2/stage2.c grub-0.95+cvs20040624/stage2/stage2.c
--- grub-debian-patched/stage2/stage2.c	2005-09-05 03:57:04.000000000 +0200
+++ grub-0.95+cvs20040624/stage2/stage2.c	2005-09-06 02:37:14.000000000 +0200
@@ -19,6 +19,7 @@
 
 #include <shared.h>
 #include <term.h>
+#include <braille.h>
 
 grub_jmp_buf restart_env;
 
@@ -107,6 +108,8 @@
 
   gotoxy (2, y);
   grub_putchar (' ');
+  if (highlight)
+  	braille_write(entry, -1);
   for (x = 3; x < 75; x++)
     {
       if (*entry && x <= 72)
@@ -288,6 +291,7 @@
 	      grub_timeout--;
 	      
 	      /* Print a message.  */
+	      braille_write("Press `ESC' to enter the menu...", -1);
 	      grub_printf ("\rPress `ESC' to enter the menu... %d   ",
 			   grub_timeout);
 	    }
@@ -378,8 +382,10 @@
 	  /* Key was pressed, show which entry is selected before GETKEY,
 	     since we're comming in here also on GRUB_TIMEOUT == -1 and
 	     hang in GETKEY */
-	  if (current_term->flags & TERM_DUMB)
+	  if (current_term->flags & TERM_DUMB) {
+	    braille_write(get_entry (menu_entries, first_entry + entryno, 0), -1);
 	    grub_printf ("\r    Highlighted entry is %d: ", entryno);
+	  }
 
 	  c = ASCII_CHAR (getkey ());
 
@@ -611,6 +617,7 @@
 		    }
 		  else
 		    {
+		      braille_write("Failed! Press any key to continue...", -1);
 		      grub_printf ("Failed!\n      Press any key to continue...");
 		      getkey ();
 		      goto restart;
@@ -727,11 +734,14 @@
   
   while (1)
     {
-      if (config_entries)
+      if (config_entries) {
+	braille_write("  Booting", -1);
 	printf ("  Booting \'%s\'\n\n",
 		get_entry (menu_entries, first_entry + entryno, 0));
-      else
+      } else {
+	braille_write("  Booting", -1);
 	printf ("  Booting command-list\n\n");
+      }
 
       if (! cur_entry)
 	cur_entry = get_entry (config_entries, first_entry + entryno, 1);
diff -urN grub-debian-patched/stage2/visiobraille.c grub-0.95+cvs20040624/stage2/visiobraille.c
--- grub-debian-patched/stage2/visiobraille.c	1970-01-01 01:00:00.000000000 +0100
+++ grub-0.95+cvs20040624/stage2/visiobraille.c	2005-09-07 03:15:43.000000000 +0200
@@ -0,0 +1,334 @@
+#ifdef SUPPORT_VISIOBRAILLE
+#include <braille.h>
+#include <visiobraille.h>
+#include <serial.h>
+#include <shared.h>
+#define WIDTH 40
+#define SOH 1
+#define STX 2
+#define ETX 3
+#define EOT 4
+#define ENQ 5
+
+
+int vs_init(int unit, int *x, int *y, int hp) {
+  if (hp) {
+    if (!(serial_hw_init(serial_hw_get_port(unit), 9600, UART_8BITS_WORD, UART_NO_PARITY, UART_1_STOP_BIT))) {
+      grub_printf ("groumpf");
+      getkey ();
+    }
+  } else {
+    if (!(serial_hw_init(serial_hw_get_port(unit), 57600, UART_8BITS_WORD, UART_ODD_PARITY, UART_1_STOP_BIT))) {
+      grub_printf ("groumpf");
+      getkey ();
+    }
+  }
+  *x = WIDTH;
+  *y = 1;
+  return 1;
+}
+#define BRL_DOT_1 (1<<(1-1))
+#define BRL_DOT_2 (1<<(2-1))
+#define BRL_DOT_3 (1<<(3-1))
+#define BRL_DOT_4 (1<<(4-1))
+#define BRL_DOT_5 (1<<(5-1))
+#define BRL_DOT_6 (1<<(6-1))
+#define BRL_DOT_7 (1<<(7-1))
+#define BRL_DOT_8 (1<<(8-1))
+
+  static unsigned char outputTable[256] = {
+    [0] = 0X20,
+    [BRL_DOT1] = 0X41,
+    [BRL_DOT1 | BRL_DOT2] = 0X42,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3] = 0X4C,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4] = 0X50,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X51,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X2F,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XEF,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6F,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XAF,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X11,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X91,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XD1,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X40,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X00,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X80,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XC0,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0X10,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X90,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XD0,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5] = 0X52,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X5b,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X1B,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9B,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XDB,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0X12,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X92,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XD2,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6] = 0X56,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0X16,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X96,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XD6,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT7] = 0X0C,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X8C,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT3 | BRL_DOT8] = 0XCC,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4] = 0X46,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5] = 0X47,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X37,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF7,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X77,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB7,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X07,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X87,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XC7,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6] = 0X36,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XF6,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X76,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XB6,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT7] = 0X06,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X86,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT4 | BRL_DOT8] = 0XC6,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5] = 0X48,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6] = 0X38,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF8,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X78,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB8,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT7] = 0X08,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X88,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT5 | BRL_DOT8] = 0XC8,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT6] = 0X32,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT6 | BRL_DOT7] = 0XF2,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X72,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT6 | BRL_DOT8] = 0XB2,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT7] = 0X02,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT7 | BRL_DOT8] = 0X82,
+    [BRL_DOT1 | BRL_DOT2 | BRL_DOT8] = 0XC2,
+    [BRL_DOT1 | BRL_DOT3] = 0X4B,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4] = 0X4D,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X4E,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X59,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X19,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X99,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XD9,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X0E,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X8E,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XCE,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X58,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X18,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X98,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XD8,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0X0D,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X8D,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XCD,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5] = 0X4F,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X5A,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X1A,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9A,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XDA,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0X0F,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X8F,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XCF,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT6] = 0X55,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0X15,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X95,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XD5,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT7] = 0X0B,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X8B,
+    [BRL_DOT1 | BRL_DOT3 | BRL_DOT8] = 0XCB,
+    [BRL_DOT1 | BRL_DOT4] = 0X43,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5] = 0X44,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X34,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF4,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X74,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB4,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X04,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X84,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XC4,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT6] = 0X33,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XF3,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X73,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XB3,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT7] = 0X03,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X83,
+    [BRL_DOT1 | BRL_DOT4 | BRL_DOT8] = 0XC3,
+    [BRL_DOT1 | BRL_DOT5] = 0X45,
+    [BRL_DOT1 | BRL_DOT5 | BRL_DOT6] = 0X35,
+    [BRL_DOT1 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF5,
+    [BRL_DOT1 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X75,
+    [BRL_DOT1 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB5,
+    [BRL_DOT1 | BRL_DOT5 | BRL_DOT7] = 0X05,
+    [BRL_DOT1 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X85,
+    [BRL_DOT1 | BRL_DOT5 | BRL_DOT8] = 0XC5,
+    [BRL_DOT1 | BRL_DOT6] = 0X31,
+    [BRL_DOT1 | BRL_DOT6 | BRL_DOT7] = 0XF1,
+    [BRL_DOT1 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X71,
+    [BRL_DOT1 | BRL_DOT6 | BRL_DOT8] = 0XB1,
+    [BRL_DOT1 | BRL_DOT7] = 0X01,
+    [BRL_DOT1 | BRL_DOT7 | BRL_DOT8] = 0X81,
+    [BRL_DOT1 | BRL_DOT8] = 0XC1,
+    [BRL_DOT2] = 0X2C,
+    [BRL_DOT2 | BRL_DOT3] = 0X3B,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4] = 0X53,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X54,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X5D,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X1D,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9D,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XDD,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X14,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X94,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XD4,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X5C,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X1C,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9C,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XDC,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0X13,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X93,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XD3,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5] = 0X21,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X3D,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0Xfd,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7D,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XBD,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0XE1,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X61,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XA1,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT6] = 0X3C,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0XFC,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7C,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XBC,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT7] = 0XFB,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X7B,
+    [BRL_DOT2 | BRL_DOT3 | BRL_DOT8] = 0XBB,
+    [BRL_DOT2 | BRL_DOT4] = 0X49,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5] = 0X4A,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X57,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0X17,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X97,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XD7,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0X0A,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X8A,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XCA,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT6] = 0X39,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XF9,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X79,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XB9,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT7] = 0X09,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X89,
+    [BRL_DOT2 | BRL_DOT4 | BRL_DOT8] = 0XC9,
+    [BRL_DOT2 | BRL_DOT5] = 0X3A,
+    [BRL_DOT2 | BRL_DOT5 | BRL_DOT6] = 0X2E,
+    [BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XEE,
+    [BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6E,
+    [BRL_DOT2 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XAE,
+    [BRL_DOT2 | BRL_DOT5 | BRL_DOT7] = 0XFA,
+    [BRL_DOT2 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X7A,
+    [BRL_DOT2 | BRL_DOT5 | BRL_DOT8] = 0XBA,
+    [BRL_DOT2 | BRL_DOT6] = 0X3F,
+    [BRL_DOT2 | BRL_DOT6 | BRL_DOT7] = 0XFF,
+    [BRL_DOT2 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7F,
+    [BRL_DOT2 | BRL_DOT6 | BRL_DOT8] = 0XBF,
+    [BRL_DOT2 | BRL_DOT7] = 0XEC,
+    [BRL_DOT2 | BRL_DOT7 | BRL_DOT8] = 0X6C,
+    [BRL_DOT2 | BRL_DOT8] = 0XAC,
+    [BRL_DOT3] = 0X27,
+    [BRL_DOT3 | BRL_DOT4] = 0X2A,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5] = 0X26,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X30,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XF0,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X70,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XB0,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0XE6,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X66,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XA6,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT6] = 0X5E,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0X1E,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X9E,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XDE,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT7] = 0XEA,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X6A,
+    [BRL_DOT3 | BRL_DOT4 | BRL_DOT8] = 0XAA,
+    [BRL_DOT3 | BRL_DOT5] = 0X29,
+    [BRL_DOT3 | BRL_DOT5 | BRL_DOT6] = 0X3E,
+    [BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XFE,
+    [BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X7E,
+    [BRL_DOT3 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XBE,
+    [BRL_DOT3 | BRL_DOT5 | BRL_DOT7] = 0XE9,
+    [BRL_DOT3 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X69,
+    [BRL_DOT3 | BRL_DOT5 | BRL_DOT8] = 0XA9,
+    [BRL_DOT3 | BRL_DOT6] = 0X2D,
+    [BRL_DOT3 | BRL_DOT6 | BRL_DOT7] = 0XED,
+    [BRL_DOT3 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6D,
+    [BRL_DOT3 | BRL_DOT6 | BRL_DOT8] = 0XAD,
+    [BRL_DOT3 | BRL_DOT7] = 0XE7,
+    [BRL_DOT3 | BRL_DOT7 | BRL_DOT8] = 0X67,
+    [BRL_DOT3 | BRL_DOT8] = 0XA7,
+    [BRL_DOT4] = 0X22,
+    [BRL_DOT4 | BRL_DOT5] = 0X25,
+    [BRL_DOT4 | BRL_DOT5 | BRL_DOT6] = 0X24,
+    [BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XE4,
+    [BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X64,
+    [BRL_DOT4 | BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XA4,
+    [BRL_DOT4 | BRL_DOT5 | BRL_DOT7] = 0XE5,
+    [BRL_DOT4 | BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X65,
+    [BRL_DOT4 | BRL_DOT5 | BRL_DOT8] = 0XA5,
+    [BRL_DOT4 | BRL_DOT6] = 0X23,
+    [BRL_DOT4 | BRL_DOT6 | BRL_DOT7] = 0XE3,
+    [BRL_DOT4 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X63,
+    [BRL_DOT4 | BRL_DOT6 | BRL_DOT8] = 0XA3,
+    [BRL_DOT4 | BRL_DOT7] = 0XE2,
+    [BRL_DOT4 | BRL_DOT7 | BRL_DOT8] = 0X62,
+    [BRL_DOT4 | BRL_DOT8] = 0XA2,
+    [BRL_DOT5] = 0X5F,
+    [BRL_DOT5 | BRL_DOT6] = 0X2B,
+    [BRL_DOT5 | BRL_DOT6 | BRL_DOT7] = 0XEB,
+    [BRL_DOT5 | BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X6B,
+    [BRL_DOT5 | BRL_DOT6 | BRL_DOT8] = 0XAB,
+    [BRL_DOT5 | BRL_DOT7] = 0X1F,
+    [BRL_DOT5 | BRL_DOT7 | BRL_DOT8] = 0X9F,
+    [BRL_DOT5 | BRL_DOT8] = 0XDF,
+    [BRL_DOT6] = 0X28,
+    [BRL_DOT6 | BRL_DOT7] = 0XE8,
+    [BRL_DOT6 | BRL_DOT7 | BRL_DOT8] = 0X68,
+    [BRL_DOT6 | BRL_DOT8] = 0XA8,
+    [BRL_DOT7] = 0XE0,
+    [BRL_DOT7 | BRL_DOT8] = 0X60,
+    [BRL_DOT8] = 0XA0
+  };
+static void serialWrite(unsigned char *buf, int num) {
+  int i;
+  for (i=0;i<num;i++)
+    serial_hw_put(buf[i]);
+}
+
+void vs_write(unsigned char *dots, int num) {
+  unsigned char csum = '>';
+  static unsigned char outbuf[1+1+2*WIDTH+2+1] = { STX, '>' };
+  int i;
+  unsigned char *s, c;
+  int tries=3;
+  int timeout;
+  int res;
+  for (i=0, s = outbuf+1+1; i<num; i++) {
+    c = dots[i];
+    c = outputTable[c];
+    csum ^= c;
+    if (c <= 5) {
+      *s++ = SOH;
+      *s++ = c|0x40;
+    } else *s++ = c;
+  }
+  if (csum <=5) {
+    *s++ = SOH;
+    *s++ = csum|0x40;
+  } else *s++ = csum;
+  *s++ = ETX;
+  while(--tries) {
+    serialWrite(outbuf, s-outbuf);
+    for (timeout = 100000; timeout; timeout--) {
+      res = serial_hw_fetch();
+      if (res == EOT) return;
+      if (res == ENQ) break;
+    }
+  }
+}
+#endif
diff -urN grub-debian-patched/stage2/visiobraille.h grub-0.95+cvs20040624/stage2/visiobraille.h
--- grub-debian-patched/stage2/visiobraille.h	1970-01-01 01:00:00.000000000 +0100
+++ grub-0.95+cvs20040624/stage2/visiobraille.h	2005-09-07 03:15:26.000000000 +0200
@@ -0,0 +1,2 @@
+int vs_init(int unit, int *x, int *y, int hp);
+void vs_write(unsigned char *dots, int num);

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Grub & accessibility
  2009-07-07 13:50 Grub & accessibility Samuel Thibault
@ 2009-07-10 17:22 ` Robert Millan
       [not found]   ` <20090710174321.GB5471@const.bordeaux.inria.fr>
  0 siblings, 1 reply; 7+ messages in thread
From: Robert Millan @ 2009-07-10 17:22 UTC (permalink / raw)
  To: The development of GRUB 2; +Cc: phcoder

On Tue, Jul 07, 2009 at 03:50:23PM +0200, Samuel Thibault wrote:
> Hello,
> 
> (Cc-ing the grub-devel mailing list for the record)
> 
> Just a few short points:
> 
> - brltty GPL2+ and has a _lot_ of drivers for braille devices, it would
>   be sad to not reuse them :)
> - speakup is also GPL2+ and has drivers for hardware speech syntheses.
> - qemu can emulate a Baum braille device through the -usbserial braille
>   or -serial braille options.  The output needs to be done through
>   brltty, thanks to its virtual braille device for instance.  I had
>   written some howto on http://brl.thefreecat.org/text-apps-a11y-test.html
> - I had already developed something to make grub accessible through
>   braille devices, in GRUB1, as a prototype, I've attached it. I've
>   never had the time to develop it more.

Hi Samuel,

We've made some exceptions, but in general, we'd like to keep the GRUB
codebase made entirely of FSF-copyrighted code, or at least code we
have disclaimers for.

OTOH, we don't want to discard valuable work that wasn't written specifically
for GRUB.  Perhaps Marco or Okuji will allow an exception for this case.

Another possibility is integrating those drivers in the grub-extras
repository.  grub-extras is a collection of 3rd party add-ons for GRUB.
It's not officially part of GRUB, but distributions (e.g. debian) can
integrate it into their builds.

About your patch:

> diff -urN grub-debian-patched/configure.ac grub-0.95+cvs20040624/configure.ac
> --- grub-debian-patched/configure.ac	2005-09-05 03:57:02.000000000 +0200
> +++ grub-0.95+cvs20040624/configure.ac	2005-09-05 03:56:54.000000000 +0200

Only GRUB 2 is in development.  New features won't be added to GRUB Legacy
anymore.

> +static unsigned char latin1_2_dots_vs[256] = {
> +0X00, 0X81, 0X83, 0X89, 0X99, 0X91, 0X8B, 0X9B,
> +[...]

This needs some clarification.  Opaque blobs are not acceptable, but arrays
whose content is documented/understandable should be ok.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Grub & accessibility
       [not found]   ` <20090710174321.GB5471@const.bordeaux.inria.fr>
@ 2009-07-10 18:13     ` Samuel Thibault
  2009-07-12 14:51       ` Pavel Roskin
  0 siblings, 1 reply; 7+ messages in thread
From: Samuel Thibault @ 2009-07-10 18:13 UTC (permalink / raw)
  To: The development of GRUB 2; +Cc: phcoder

(sorry phcoder for the duplication)

Robert Millan, le Fri 10 Jul 2009 19:22:48 +0200, a écrit :
> We've made some exceptions, but in general, we'd like to keep the GRUB
> codebase made entirely of FSF-copyrighted code, or at least code we
> have disclaimers for.
> 
> OTOH, we don't want to discard valuable work that wasn't written specifically
> for GRUB.  Perhaps Marco or Okuji will allow an exception for this case.

The thing is that it would be sad to re-implement these drivers, as
getting hardware to make sure they work is hard.

> Another possibility is integrating those drivers in the grub-extras
> repository.  grub-extras is a collection of 3rd party add-ons for GRUB.
> It's not officially part of GRUB, but distributions (e.g. debian) can
> integrate it into their builds.

That seems like a good way. The core of screen reading can be
implemented in GRUB and drivers be modules.

> > diff -urN grub-debian-patched/configure.ac grub-0.95+cvs20040624/configure.ac
> > --- grub-debian-patched/configure.ac	2005-09-05 03:57:02.000000000 +0200
> > +++ grub-0.95+cvs20040624/configure.ac	2005-09-05 03:56:54.000000000 +0200
> 
> Only GRUB 2 is in development.  New features won't be added to GRUB Legacy
> anymore.

I know.  I didn't send the patch for inclusion, but for hpcoder to have
a look.  The story is that I met him at lsm and found he was interested
in implementing something so since I had already done some stuff it
could be a good thing for him to have a look at it.

> > +static unsigned char latin1_2_dots_vs[256] = {
> > +0X00, 0X81, 0X83, 0X89, 0X99, 0X91, 0X8B, 0X9B,
> > +[...]
> 
> This needs some clarification.  Opaque blobs are not acceptable, but arrays
> whose content is documented/understandable should be ok.

Same reason: that wasn't code meant for inclusion, it wouldn't be
implemented this way, though for this precise driver there would be such
array, converting from the ISO 11548-1 encoding of braille dots into
VisioBraille's own encoding of braille dots.

Samuel



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Grub & accessibility
  2009-07-10 18:13     ` Samuel Thibault
@ 2009-07-12 14:51       ` Pavel Roskin
  2009-07-13 21:44         ` Vladimir 'phcoder' Serbinenko
  2009-07-18 20:03         ` Robert Millan
  0 siblings, 2 replies; 7+ messages in thread
From: Pavel Roskin @ 2009-07-12 14:51 UTC (permalink / raw)
  To: grub-devel

Quoting Samuel Thibault <samuel.thibault@ens-lyon.org>:

> (sorry phcoder for the duplication)
>
> Robert Millan, le Fri 10 Jul 2009 19:22:48 +0200, a écrit :
>> We've made some exceptions, but in general, we'd like to keep the GRUB
>> codebase made entirely of FSF-copyrighted code, or at least code we
>> have disclaimers for.
>>
>> OTOH, we don't want to discard valuable work that wasn't written   
>> specifically
>> for GRUB.  Perhaps Marco or Okuji will allow an exception for this case.
>
> The thing is that it would be sad to re-implement these drivers, as
> getting hardware to make sure they work is hard.

One of the main advantages of Free Software is that it allows code  
sharing.  For a GNU project to reject accessibility code solely  
because it's copyrighted by others would be a very bad move from the  
PR perspective.  I can easily imagine stories badmouthing FSF and  
GPLv3 over the issue.  Someone or something hurting disabled people is  
the kind of story journalists like.

It would still be legal for another entity to take the GRUB code and  
combine it with the accessibility code, but it would be an unnecessary  
fork.

-- 
Regards,
Pavel Roskin



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Grub & accessibility
  2009-07-12 14:51       ` Pavel Roskin
@ 2009-07-13 21:44         ` Vladimir 'phcoder' Serbinenko
  2009-07-18 20:03         ` Robert Millan
  1 sibling, 0 replies; 7+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-07-13 21:44 UTC (permalink / raw)
  To: The development of GRUB 2

On Sun, Jul 12, 2009 at 4:51 PM, Pavel Roskin<proski@gnu.org> wrote:
> Quoting Samuel Thibault <samuel.thibault@ens-lyon.org>:
>
>> (sorry phcoder for the duplication)
>>
>> Robert Millan, le Fri 10 Jul 2009 19:22:48 +0200, a écrit :
>>>
>>> We've made some exceptions, but in general, we'd like to keep the GRUB
>>> codebase made entirely of FSF-copyrighted code, or at least code we
>>> have disclaimers for.
>>>
>>> OTOH, we don't want to discard valuable work that wasn't written
>>>  specifically
>>> for GRUB.  Perhaps Marco or Okuji will allow an exception for this case.
>>
>> The thing is that it would be sad to re-implement these drivers, as
>> getting hardware to make sure they work is hard.
>
> One of the main advantages of Free Software is that it allows code sharing.
>  For a GNU project to reject accessibility code solely because it's
> copyrighted by others would be a very bad move from the PR perspective.  I
> can easily imagine stories badmouthing FSF and GPLv3 over the issue.
>  Someone or something hurting disabled people is the kind of story
> journalists like.
>
I don't care what journalists talk. They are free to write anything.
But I believe that not integrating accessibility just because the code
can't be protected by FSF would be a collective egoism and would
restrict the freedom of user. I believe the most sane decision here is
to contact the corresponding authors for license and papers. In cases
when we have license but not papers we could put drivers to separate
directory.
> It would still be legal for another entity to take the GRUB code and combine
> it with the accessibility code, but it would be an unnecessary fork.
>
> --
> Regards,
> Pavel Roskin
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Grub & accessibility
  2009-07-12 14:51       ` Pavel Roskin
  2009-07-13 21:44         ` Vladimir 'phcoder' Serbinenko
@ 2009-07-18 20:03         ` Robert Millan
  2009-07-18 20:08           ` Samuel Thibault
  1 sibling, 1 reply; 7+ messages in thread
From: Robert Millan @ 2009-07-18 20:03 UTC (permalink / raw)
  To: The development of GRUB 2

On Sun, Jul 12, 2009 at 10:51:04AM -0400, Pavel Roskin wrote:
> Quoting Samuel Thibault <samuel.thibault@ens-lyon.org>:
>
>> (sorry phcoder for the duplication)
>>
>> Robert Millan, le Fri 10 Jul 2009 19:22:48 +0200, a écrit :
>>> We've made some exceptions, but in general, we'd like to keep the GRUB
>>> codebase made entirely of FSF-copyrighted code, or at least code we
>>> have disclaimers for.
>>>
>>> OTOH, we don't want to discard valuable work that wasn't written   
>>> specifically
>>> for GRUB.  Perhaps Marco or Okuji will allow an exception for this case.
>>
>> The thing is that it would be sad to re-implement these drivers, as
>> getting hardware to make sure they work is hard.
>
> One of the main advantages of Free Software is that it allows code  
> sharing.  For a GNU project to reject accessibility code solely because 
> it's copyrighted by others would be a very bad move from the PR 
> perspective.

Hi,

We're not going to reject that code, or duplicate their work.  I discussed
this with Marco two days ago.  He approves of the grub-extras project, and
thinks we can make this the recommended approach for situations in which we
want to import code that wasn't written specifically for GRUB.

Had I known about his position, I'd have proposed that some things like LUA
be put there.  Anyhow, I look forward to more stuff being added to it.
grub-extras is integrated with the Debian package, so additions there are
merged with it semi-automatically.

I won't allow, however, grub-extras to be used as an excuse to avoid
paperwork for code specifically written for GRUB.  We've had some bad
experience with uncooperative developers who refused even signing a
disclaimer (which essentially said they wrote the code themselves without
infringing someone else's copyright).

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Grub & accessibility
  2009-07-18 20:03         ` Robert Millan
@ 2009-07-18 20:08           ` Samuel Thibault
  0 siblings, 0 replies; 7+ messages in thread
From: Samuel Thibault @ 2009-07-18 20:08 UTC (permalink / raw)
  To: The development of GRUB 2

Robert Millan, le Sat 18 Jul 2009 22:03:25 +0200, a écrit :
> I won't allow, however, grub-extras to be used as an excuse to avoid
> paperwork for code specifically written for GRUB.

That's fine with me at least, since I've already signed the papers :)

Samuel



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-07-18 20:08 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-07 13:50 Grub & accessibility Samuel Thibault
2009-07-10 17:22 ` Robert Millan
     [not found]   ` <20090710174321.GB5471@const.bordeaux.inria.fr>
2009-07-10 18:13     ` Samuel Thibault
2009-07-12 14:51       ` Pavel Roskin
2009-07-13 21:44         ` Vladimir 'phcoder' Serbinenko
2009-07-18 20:03         ` Robert Millan
2009-07-18 20:08           ` Samuel Thibault

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.