LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] Basic braille screen reader support
@ 2008-02-04  3:18 Samuel Thibault
  2008-02-04  3:22 ` Samuel Thibault
                   ` (2 more replies)
  0 siblings, 3 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-02-04  3:18 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel

This adds a minimalistic braille screen reader support.
This is meant to be used by blind people e.g. on boot failures or when /
cannot be mounted etc and thus the userland screen readers can not work.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org

--- linux-2.6.24-orig/drivers/char/consolemap.c	2008-01-25 08:32:05.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/consolemap.c	2008-02-03 21:27:04.000000000 +0000
@@ -277,6 +277,7 @@
 			return p->inverse_translations[m][glyph];
 	}
 }
+EXPORT_SYMBOL_GPL(inverse_translate);
 
 static void update_user_maps(void)
 {
--- linux-2.6.24-orig/drivers/char/vt.c	2008-01-25 08:32:06.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/vt.c	2008-02-03 21:27:04.000000000 +0000
@@ -3982,6 +3982,7 @@
 		c |= 0x100;
 	return c;
 }
+EXPORT_SYMBOL_GPL(screen_glyph);
 
 /* used by vcs - note the word offset */
 unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
--- linux-2.6.24-orig/drivers/char/keyboard.c	2008-01-25 08:32:06.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/keyboard.c	2008-02-04 02:44:37.000000000 +0000
@@ -110,6 +110,7 @@
 const int NR_TYPES = ARRAY_SIZE(max_vals);
 
 struct kbd_struct kbd_table[MAX_NR_CONSOLES];
+EXPORT_SYMBOL_GPL(kbd_table);
 static struct kbd_struct *kbd = kbd_table;
 
 struct vt_spawn_console vt_spawn_con = {
@@ -260,6 +261,7 @@
 	} else
 		kd_nosound(0);
 }
+EXPORT_SYMBOL_GPL(kd_mksound);
 
 /*
  * Setting the keyboard rate.
--- linux-2.6.24-orig/drivers/Kconfig	2008-01-25 08:32:04.000000000 +0000
+++ linux-2.6.24-perso/drivers/Kconfig	2008-02-04 01:32:17.000000000 +0000
@@ -95,4 +95,6 @@
 source "drivers/uio/Kconfig"
 
 source "drivers/virtio/Kconfig"
+
+source "drivers/a11y/Kconfig"
 endmenu
--- linux-2.6.24-orig/drivers/Makefile	2008-01-25 08:32:04.000000000 +0000
+++ linux-2.6.24-perso/drivers/Makefile	2008-02-04 01:33:27.000000000 +0000
@@ -28,6 +28,8 @@
 obj-$(CONFIG_FB_INTEL)          += video/intelfb/
 
 obj-y				+= serial/
+# a11y comes after serial because it depends on it
+obj-$(CONFIG_A11Y)		+= a11y/
 obj-$(CONFIG_PARPORT)		+= parport/
 obj-y				+= base/ block/ misc/ mfd/ net/ media/
 obj-$(CONFIG_NUBUS)		+= nubus/
--- linux-2.6.24-orig/include/linux/serial_8250.h	2007-10-09 21:31:38.000000000 +0100
+++ linux-2.6.24-perso/include/linux/serial_8250.h	2008-02-03 21:28:40.000000000 +0000
@@ -66,4 +66,6 @@
 extern int serial8250_find_port_for_earlycon(void);
 extern int setup_early_serial8250_console(char *cmdline);
 
+extern struct console serial8250_console;
+
 #endif
--- linux-2.6.24-orig/drivers/serial/8250.c	2007-10-09 21:31:38.000000000 +0100
+++ linux-2.6.24-perso/drivers/serial/8250.c	2008-02-03 21:29:54.000000000 +0000
@@ -2547,7 +2547,7 @@
 }
 
 static struct uart_driver serial8250_reg;
-static struct console serial8250_console = {
+struct console serial8250_console = {
 	.name		= "ttyS",
 	.write		= serial8250_console_write,
 	.device		= uart_console_device,
@@ -2557,6 +2557,7 @@
 	.index		= -1,
 	.data		= &serial8250_reg,
 };
+EXPORT_SYMBOL_GPL(serial8250_console);
 
 static int __init serial8250_console_init(void)
 {
diff -urN linux-2.6.24-orig/drivers/a11y/braille/braille_console.c linux-2.6.24-perso/drivers/a11y/braille/braille_console.c
--- linux-2.6.24-orig/drivers/a11y/braille/braille_console.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/braille/braille_console.c	2008-02-04 01:58:16.000000000 +0000
@@ -0,0 +1,390 @@
+/*
+ * Minimalistic braille device kernel support.
+ *
+ * By default, shows console messages on the braille device.
+ * Pressing Insert switches to VC browsing.
+ *
+ *  Copyright (C) Samuel Thibault <samuel.thibault@ens-lyon.org>
+ *
+ * This program is free software ; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation ; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY ; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the program ; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/autoconf.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/console.h>
+#include <linux/notifier.h>
+
+#include <linux/selection.h>
+#include <linux/vt_kern.h>
+#include <linux/consolemap.h>
+
+#include <linux/keyboard.h>
+#include <linux/kbd_kern.h>
+#include <linux/input.h>
+
+#include <linux/serial_8250.h>
+
+MODULE_AUTHOR("samuel.thibault@ens-lyon.org");
+MODULE_DESCRIPTION("braille device");
+MODULE_LICENSE("GPL");
+
+/*
+ * Braille device support part.
+ */
+
+/* Emit various sounds */
+static int sound;
+module_param(sound, bool, 0);
+MODULE_PARM_DESC(sound, "emit sounds");
+#define beep(freq) do { if (sound) kd_mksound(freq, HZ/10); } while(0)
+
+/* mini console */
+#define WIDTH 40
+#define BRAILLE_KEY KEY_INSERT
+static u16 console_buf[WIDTH];
+static int console_cursor = 0;
+
+/* mini view of VC */
+static int vc_x, vc_y, lastvc_x, lastvc_y;
+
+/* show console ? (or show VC) */
+static int console_show = 1;
+/* pending newline ? */
+static int console_newline = 1;
+static int lastVC = -1;
+
+static struct console *braille_co;
+
+/* Very VisioBraille-specific */
+static void braille_write(u16 *buf)
+{
+	static u16 lastwrite[WIDTH];
+	unsigned char data[1 + 1 + 2*WIDTH + 2 + 1], csum = 0, *c;
+	u16 out;
+	int i;
+
+	if (!braille_co)
+		return;
+
+	if (!memcmp(lastwrite, buf, WIDTH * sizeof(*buf)))
+		return;
+	memcpy(lastwrite, buf, WIDTH * sizeof(*buf));
+
+#define SOH 1
+#define STX 2
+#define ETX 2
+#define EOT 4
+#define ENQ 5
+	data[0] = STX;
+	data[1] = '>';
+	csum ^= '>';
+	c = &data[2];
+	for (i=0; i<WIDTH; i++) {
+		out = buf[i];
+		if (out >= 0x100)
+			out = '?';
+		else if (out == 0x00)
+			out = ' ';
+		csum ^= out;
+		if (out <= 0x05) {
+			*c++ = SOH;
+			out |= 0x40;
+		}
+		*c++ = out;
+	}
+
+	if (csum <= 0x05) {
+		*c++ = SOH;
+		csum = 0x40;
+	}
+	*c++ = csum;
+	*c++ = ETX;
+
+	serial8250_console.write(braille_co, data, c - data);
+}
+
+/* Follow the VC cursor*/
+static void vc_follow_cursor(struct vc_data *vc)
+{
+	vc_x = vc->vc_x - (vc->vc_x % WIDTH);
+	vc_y = vc->vc_y;
+	lastvc_x = vc->vc_x;
+	lastvc_y = vc->vc_y;
+}
+
+/* Maybe the VC cursor moved, if so follow it */
+static void vc_maybe_cursor_moved(struct vc_data *vc)
+{
+	if (vc->vc_x != lastvc_x || vc->vc_y != lastvc_y)
+		vc_follow_cursor(vc);
+}
+
+/* Show portion of VC at vc_x, vc_y */
+static void vc_refresh(struct vc_data *vc)
+{
+	u16 buf[WIDTH];
+	int i;
+
+	for (i = 0; i<WIDTH; i++) {
+		u16 glyph = screen_glyph(vc, 2 * (vc_x + i) + vc_y * vc->vc_size_row);
+		buf[i] = inverse_translate(vc, glyph, 1);
+	}
+	braille_write(buf);
+}
+
+/*
+ * Link to keyboard
+ */
+
+static int keyboard_notifier_call(struct notifier_block *blk, unsigned long code, void *_param)
+{
+	struct keyboard_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	int ret = NOTIFY_OK;
+
+	if (!param->down)
+		return ret;
+
+	switch (code) {
+		case KBD_KEYCODE:
+			if (console_show) {
+				if (param->value == BRAILLE_KEY) {
+					console_show = 0;
+					beep(880);
+					vc_maybe_cursor_moved(vc);
+					vc_refresh(vc);
+					ret = NOTIFY_STOP;
+				}
+			} else {
+				ret = NOTIFY_STOP;
+				switch (param->value) {
+					case KEY_INSERT:
+						beep(440);
+						console_show = 1;
+						lastVC = -1;
+						braille_write(console_buf);
+						break;
+					case KEY_LEFT:
+						if (vc_x > 0) {
+							vc_x -= WIDTH;
+							if (vc_x < 0)
+								vc_x = 0;
+						} else if (vc_y >= 1) {
+							beep(880);
+							vc_y--;
+							vc_x = vc->vc_cols-WIDTH;
+						} else
+							beep(220);
+						break;
+					case KEY_RIGHT:
+						if (vc_x + WIDTH < vc->vc_cols) {
+							vc_x += WIDTH;
+						} else if (vc_y + 1 < vc->vc_rows) {
+							beep(880);
+							vc_y++;
+							vc_x = 0;
+						} else
+							beep(220);
+						break;
+					case KEY_DOWN:
+						if (vc_y + 1 < vc->vc_rows)
+							vc_y++;
+						else
+							beep(220);
+						break;
+					case KEY_UP:
+						if (vc_y >= 1)
+							vc_y--;
+						else
+							beep(220);
+						break;
+					case KEY_HOME:
+						vc_follow_cursor(vc);
+						break;
+					case KEY_PAGEUP:
+						vc_x = 0;
+						vc_y = 0;
+						break;
+					case KEY_PAGEDOWN:
+						vc_x = 0;
+						vc_y = vc->vc_rows-1;
+						break;
+					default:
+						ret = NOTIFY_OK;
+						break;
+				}
+				if (ret == NOTIFY_STOP)
+					vc_refresh(vc);
+			}
+			break;
+		case KBD_POST_KEYSYM:
+		{
+			unsigned char type = KTYP(param->value) - 0xf0;
+			if (type == KT_SPEC) {
+				unsigned char val = KVAL(param->value);
+				int on_off = -1;
+
+				switch(val) {
+					case KVAL(K_CAPS):
+						on_off = vc_kbd_led(kbd_table + fg_console, VC_CAPSLOCK);
+						break;
+					case KVAL(K_NUM):
+						on_off = vc_kbd_led(kbd_table + fg_console, VC_NUMLOCK);
+						break;
+					case KVAL(K_HOLD):
+						on_off = vc_kbd_led(kbd_table + fg_console, VC_SCROLLOCK);
+						break;
+				}
+				if (on_off == 1)
+					beep(880);
+				else if (on_off == 0)
+					beep(440);
+			}
+		}
+		case KBD_UNBOUND_KEYCODE:
+		case KBD_UNICODE:
+		case KBD_KEYSYM:
+			/* Unused */
+			break;
+	}
+	return ret;
+}
+
+static struct notifier_block keyboard_notifier_block = {
+	.notifier_call = keyboard_notifier_call,
+};
+
+static int vt_notifier_call(struct notifier_block *blk, unsigned long code, void *_param)
+{
+	struct vt_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	switch (code) {
+		case VT_ALLOCATE:
+			break;
+		case VT_DEALLOCATE:
+			break;
+		case VT_WRITE:
+		{
+			unsigned char c = param->c;
+			switch (c) {
+				case '\b':
+				case 127:
+					if (console_cursor > 0) {
+						console_cursor--;
+						console_buf[console_cursor] = ' ';
+					}
+					break;
+				case '\n':
+				case '\v':
+				case '\f':
+				case '\r':
+					console_newline = 1;
+					break;
+				case '\t':
+					c = ' ';
+					/* Fallthrough */
+				default:
+					if (c < 32)
+						/* Ignore other control sequences */
+						break;
+					if (console_newline) {
+						memset(console_buf, 0, sizeof(console_buf));
+						console_cursor = 0;
+						console_newline = 0;
+					}
+					if (console_cursor == WIDTH)
+						memmove(console_buf, &console_buf[1], (WIDTH-1) * sizeof(*console_buf));
+					else
+						console_cursor++;
+					console_buf[console_cursor-1] = c;
+					break;
+			}
+			if (console_show)
+				braille_write(console_buf);
+			else {
+				vc_maybe_cursor_moved(vc);
+				vc_refresh(vc);
+			}
+			break;
+		}
+		case VT_UPDATE:
+			/* Maybe a VT switch, flush */
+			if (console_show) {
+				if (vc->vc_num != lastVC) {
+					lastVC = vc->vc_num;
+					memset(console_buf, 0, sizeof(console_buf));
+					console_cursor = 0;
+					braille_write(console_buf);
+				}
+			} else {
+				vc_maybe_cursor_moved(vc);
+				vc_refresh(vc);
+			}
+			break;
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block vt_notifier_block = {
+	.notifier_call = vt_notifier_call,
+};
+
+/*
+ * Link to serial console
+ */
+
+static int __init braille_console_setup(struct console *co, char *options)
+{
+	int ret = 0;
+	if (co->index == -1)
+		co->index = 0;
+#ifndef MODULE
+	ret = serial8250_console.setup(co, options);
+	if (ret < 0)
+		return ret;
+#endif
+	braille_co = co;
+	return ret;
+}
+
+static struct console braille_console = {
+	.name		= "brl",
+	.setup		= braille_console_setup,
+	.flags		= CON_PRINTBUFFER,
+	.index		= -1,
+};
+
+/*
+ * Module access
+ */
+
+static int __init checkinit(void)
+{
+	register_console(&braille_console);
+	register_keyboard_notifier(&keyboard_notifier_block);
+	register_vt_notifier(&vt_notifier_block);
+	return 0;
+}
+static void __exit checkexit(void)
+{
+	unregister_vt_notifier(&vt_notifier_block);
+	unregister_keyboard_notifier(&keyboard_notifier_block);
+	unregister_console(&braille_console);
+}
+
+module_init(checkinit);
+module_exit(checkexit);
diff -urN linux-2.6.24-orig/drivers/a11y/Kconfig linux-2.6.24-perso/drivers/a11y/Kconfig
--- linux-2.6.24-orig/drivers/a11y/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/Kconfig	2008-02-04 01:54:36.000000000 +0000
@@ -0,0 +1,22 @@
+menuconfig A11Y
+	bool "Accessibility support"
+	---help---
+	  Enable a submenu where accessibility items may be enabled.
+
+	  If unsure, say N.
+
+if A11Y
+config A11Y_BRAILLE_CONSOLE
+	tristate "Console on braille device"
+	depends on SERIAL_8250_CONSOLE
+	---help---
+	  Enables console output on a braille device connected to a 8250
+	  serial port. For now only the VisioBraille device is supported.
+
+	  To actually enable it, you need to pass option
+	  console=brl0
+	  to the kernel. Options are the same as for serial console.
+
+	  If unsure, say N.
+
+endif # A11Y
diff -urN linux-2.6.24-orig/drivers/a11y/Makefile linux-2.6.24-perso/drivers/a11y/Makefile
--- linux-2.6.24-orig/drivers/a11y/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/Makefile	2008-02-04 01:42:32.000000000 +0000
@@ -0,0 +1 @@
+obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille/braille_console.o

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

* Re: [PATCH] Basic braille screen reader support
  2008-02-04  3:18 [PATCH] Basic braille screen reader support Samuel Thibault
@ 2008-02-04  3:22 ` Samuel Thibault
  2008-02-04 17:10 ` Greg KH
  2008-02-05 22:00 ` [PATCH,RESEND] " Samuel Thibault
  2 siblings, 0 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-02-04  3:22 UTC (permalink / raw)
  To: torvalds, linux-kernel

Note: as said in the comments, this is currently only for the
VisioBraille device, but having this in the vanilla kernel will help a
lot to get people testing drivers for other devices, as they will not
have to recompile a patched kernel but just insert test modules
(remember that for blind people it is already not so easy to just _use_
computers...)

Samuel

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

* Re: [PATCH] Basic braille screen reader support
  2008-02-04  3:18 [PATCH] Basic braille screen reader support Samuel Thibault
  2008-02-04  3:22 ` Samuel Thibault
@ 2008-02-04 17:10 ` Greg KH
  2008-02-04 17:24   ` Samuel Thibault
  2008-02-05 22:00 ` [PATCH,RESEND] " Samuel Thibault
  2 siblings, 1 reply; 22+ messages in thread
From: Greg KH @ 2008-02-04 17:10 UTC (permalink / raw)
  To: Samuel Thibault, torvalds, linux-kernel

On Mon, Feb 04, 2008 at 03:18:43AM +0000, Samuel Thibault wrote:
> This adds a minimalistic braille screen reader support.
> This is meant to be used by blind people e.g. on boot failures or when /
> cannot be mounted etc and thus the userland screen readers can not work.

Will this api work with the SpeakUp kernel drivers?  Are the hooks
sufficient for what those drivers are expecting?

> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org

You forgot a trailing '>'  :)

thanks,

greg k-h

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

* Re: [PATCH] Basic braille screen reader support
  2008-02-04 17:10 ` Greg KH
@ 2008-02-04 17:24   ` Samuel Thibault
  2008-02-04 18:06     ` Greg KH
  0 siblings, 1 reply; 22+ messages in thread
From: Samuel Thibault @ 2008-02-04 17:24 UTC (permalink / raw)
  To: Greg KH; +Cc: torvalds, linux-kernel

Hello,

Greg KH, le Mon 04 Feb 2008 09:10:08 -0800, a écrit :
> On Mon, Feb 04, 2008 at 03:18:43AM +0000, Samuel Thibault wrote:
> > This adds a minimalistic braille screen reader support.
> > This is meant to be used by blind people e.g. on boot failures or when /
> > cannot be mounted etc and thus the userland screen readers can not work.
> 
> Will this api work with the SpeakUp kernel drivers?  Are the hooks
> sufficient for what those drivers are expecting?

SpeakUp and this are quite independant (though they will probably both
end up in the drivers/a11y/ directory), at least just because the way
they review the screen is very different.  Speech synthesis' matter is
the time to say things, while braille's matter is the space to show
things.

However, they share the same low-level primitives: the recently added
keyboard and vc notifiers, screen_glyph(), inverse_translate(),
kd_mksound, etc.

> > Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org
> 
> You forgot a trailing '>'  :)

Ergl :)

Samuel

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

* Re: [PATCH] Basic braille screen reader support
  2008-02-04 17:24   ` Samuel Thibault
@ 2008-02-04 18:06     ` Greg KH
  2008-02-04 18:15       ` Samuel Thibault
  0 siblings, 1 reply; 22+ messages in thread
From: Greg KH @ 2008-02-04 18:06 UTC (permalink / raw)
  To: Samuel Thibault, torvalds, linux-kernel

On Mon, Feb 04, 2008 at 05:24:41PM +0000, Samuel Thibault wrote:
> Hello,
> 
> Greg KH, le Mon 04 Feb 2008 09:10:08 -0800, a ?crit :
> > On Mon, Feb 04, 2008 at 03:18:43AM +0000, Samuel Thibault wrote:
> > > This adds a minimalistic braille screen reader support.
> > > This is meant to be used by blind people e.g. on boot failures or when /
> > > cannot be mounted etc and thus the userland screen readers can not work.
> > 
> > Will this api work with the SpeakUp kernel drivers?  Are the hooks
> > sufficient for what those drivers are expecting?
> 
> SpeakUp and this are quite independant (though they will probably both
> end up in the drivers/a11y/ directory), at least just because the way
> they review the screen is very different.  Speech synthesis' matter is
> the time to say things, while braille's matter is the space to show
> things.
> 
> However, they share the same low-level primitives: the recently added
> keyboard and vc notifiers, screen_glyph(), inverse_translate(),
> kd_mksound, etc.

I guess I'm worried that the hooks that you add here will not be usable
by speakup, and we'll have to add more in places close to this, but not
quite the same.

I know speaking and "showing" are two different things, but they both
require the same data flow going into them in order to achieve their
goals, I just don't want to see this work being done without considering
both needs.

But, if you feel that both will work properly with these limited
exports, I have no objections.

thanks,

greg k-h

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

* Re: [PATCH] Basic braille screen reader support
  2008-02-04 18:06     ` Greg KH
@ 2008-02-04 18:15       ` Samuel Thibault
  2008-02-04 18:27         ` Greg KH
  0 siblings, 1 reply; 22+ messages in thread
From: Samuel Thibault @ 2008-02-04 18:15 UTC (permalink / raw)
  To: Greg KH; +Cc: torvalds, linux-kernel

Greg KH, le Mon 04 Feb 2008 10:06:17 -0800, a écrit :
> > However, they share the same low-level primitives: the recently added
> > keyboard and vc notifiers, screen_glyph(), inverse_translate(),
> > kd_mksound, etc.
> 
> I guess I'm worried that the hooks that you add here will not be usable
> by speakup, and we'll have to add more in places close to this, but not
> quite the same.

Actually, speakup already just use these and no others.

> I know speaking and "showing" are two different things, but they both
> require the same data flow going into them in order to achieve their
> goals, I just don't want to see this work being done without considering
> both needs.

I _am_ considering both needs.  Actually, most of the recent commits to
SpeakUp are mines :)

> But, if you feel that both will work properly with these limited
> exports, I have no objections.

They already both do :)

Samuel

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

* Re: [PATCH] Basic braille screen reader support
  2008-02-04 18:15       ` Samuel Thibault
@ 2008-02-04 18:27         ` Greg KH
  0 siblings, 0 replies; 22+ messages in thread
From: Greg KH @ 2008-02-04 18:27 UTC (permalink / raw)
  To: Samuel Thibault, torvalds, linux-kernel

On Mon, Feb 04, 2008 at 06:15:12PM +0000, Samuel Thibault wrote:
> Greg KH, le Mon 04 Feb 2008 10:06:17 -0800, a ?crit :
> > > However, they share the same low-level primitives: the recently added
> > > keyboard and vc notifiers, screen_glyph(), inverse_translate(),
> > > kd_mksound, etc.
> > 
> > I guess I'm worried that the hooks that you add here will not be usable
> > by speakup, and we'll have to add more in places close to this, but not
> > quite the same.
> 
> Actually, speakup already just use these and no others.

Great.  I have no objection to this patch then :)

thanks,

greg k-h

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

* [PATCH,RESEND] Basic braille screen reader support
  2008-02-04  3:18 [PATCH] Basic braille screen reader support Samuel Thibault
  2008-02-04  3:22 ` Samuel Thibault
  2008-02-04 17:10 ` Greg KH
@ 2008-02-05 22:00 ` Samuel Thibault
  2008-02-06  0:58   ` Andrew Morton
  2008-03-19 18:57   ` [mmotm build error] Re: [PATCH,RESEND] " Randy Dunlap
  2 siblings, 2 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-02-05 22:00 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel

This adds a minimalistic braille screen reader support.
This is meant to be used by blind people e.g. on boot failures or when /
cannot be mounted etc and thus the userland screen readers can not work.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

---
Greg KH was OK with this patch and there was no other complains, so I
resubmit it, with a fixed signed-off-by.
I think it should fine for mainline, as it is not enable by default and
doesn't change anything else and exporting a few functions that will be
needed for SpeakUp too.

--- linux-2.6.24-orig/drivers/char/consolemap.c	2008-01-25 08:32:05.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/consolemap.c	2008-02-03 21:27:04.000000000 +0000
@@ -277,6 +277,7 @@
 			return p->inverse_translations[m][glyph];
 	}
 }
+EXPORT_SYMBOL_GPL(inverse_translate);
 
 static void update_user_maps(void)
 {
--- linux-2.6.24-orig/drivers/char/vt.c	2008-01-25 08:32:06.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/vt.c	2008-02-03 21:27:04.000000000 +0000
@@ -3982,6 +3982,7 @@
 		c |= 0x100;
 	return c;
 }
+EXPORT_SYMBOL_GPL(screen_glyph);
 
 /* used by vcs - note the word offset */
 unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
--- linux-2.6.24-orig/drivers/char/keyboard.c	2008-01-25 08:32:06.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/keyboard.c	2008-02-04 02:44:37.000000000 +0000
@@ -110,6 +110,7 @@
 const int NR_TYPES = ARRAY_SIZE(max_vals);
 
 struct kbd_struct kbd_table[MAX_NR_CONSOLES];
+EXPORT_SYMBOL_GPL(kbd_table);
 static struct kbd_struct *kbd = kbd_table;
 
 struct vt_spawn_console vt_spawn_con = {
@@ -260,6 +261,7 @@
 	} else
 		kd_nosound(0);
 }
+EXPORT_SYMBOL_GPL(kd_mksound);
 
 /*
  * Setting the keyboard rate.
--- linux-2.6.24-orig/drivers/Kconfig	2008-01-25 08:32:04.000000000 +0000
+++ linux-2.6.24-perso/drivers/Kconfig	2008-02-04 01:32:17.000000000 +0000
@@ -95,4 +95,6 @@
 source "drivers/uio/Kconfig"
 
 source "drivers/virtio/Kconfig"
+
+source "drivers/a11y/Kconfig"
 endmenu
--- linux-2.6.24-orig/drivers/Makefile	2008-01-25 08:32:04.000000000 +0000
+++ linux-2.6.24-perso/drivers/Makefile	2008-02-04 01:33:27.000000000 +0000
@@ -28,6 +28,8 @@
 obj-$(CONFIG_FB_INTEL)          += video/intelfb/
 
 obj-y				+= serial/
+# a11y comes after serial because it depends on it
+obj-$(CONFIG_A11Y)		+= a11y/
 obj-$(CONFIG_PARPORT)		+= parport/
 obj-y				+= base/ block/ misc/ mfd/ net/ media/
 obj-$(CONFIG_NUBUS)		+= nubus/
--- linux-2.6.24-orig/include/linux/serial_8250.h	2007-10-09 21:31:38.000000000 +0100
+++ linux-2.6.24-perso/include/linux/serial_8250.h	2008-02-03 21:28:40.000000000 +0000
@@ -66,4 +66,6 @@
 extern int serial8250_find_port_for_earlycon(void);
 extern int setup_early_serial8250_console(char *cmdline);
 
+extern struct console serial8250_console;
+
 #endif
--- linux-2.6.24-orig/drivers/serial/8250.c	2007-10-09 21:31:38.000000000 +0100
+++ linux-2.6.24-perso/drivers/serial/8250.c	2008-02-03 21:29:54.000000000 +0000
@@ -2547,7 +2547,7 @@
 }
 
 static struct uart_driver serial8250_reg;
-static struct console serial8250_console = {
+struct console serial8250_console = {
 	.name		= "ttyS",
 	.write		= serial8250_console_write,
 	.device		= uart_console_device,
@@ -2557,6 +2557,7 @@
 	.index		= -1,
 	.data		= &serial8250_reg,
 };
+EXPORT_SYMBOL_GPL(serial8250_console);
 
 static int __init serial8250_console_init(void)
 {
diff -urN linux-2.6.24-orig/drivers/a11y/braille/braille_console.c linux-2.6.24-perso/drivers/a11y/braille/braille_console.c
--- linux-2.6.24-orig/drivers/a11y/braille/braille_console.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/braille/braille_console.c	2008-02-04 01:58:16.000000000 +0000
@@ -0,0 +1,390 @@
+/*
+ * Minimalistic braille device kernel support.
+ *
+ * By default, shows console messages on the braille device.
+ * Pressing Insert switches to VC browsing.
+ *
+ *  Copyright (C) Samuel Thibault <samuel.thibault@ens-lyon.org>
+ *
+ * This program is free software ; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation ; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY ; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the program ; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/autoconf.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/console.h>
+#include <linux/notifier.h>
+
+#include <linux/selection.h>
+#include <linux/vt_kern.h>
+#include <linux/consolemap.h>
+
+#include <linux/keyboard.h>
+#include <linux/kbd_kern.h>
+#include <linux/input.h>
+
+#include <linux/serial_8250.h>
+
+MODULE_AUTHOR("samuel.thibault@ens-lyon.org");
+MODULE_DESCRIPTION("braille device");
+MODULE_LICENSE("GPL");
+
+/*
+ * Braille device support part.
+ */
+
+/* Emit various sounds */
+static int sound;
+module_param(sound, bool, 0);
+MODULE_PARM_DESC(sound, "emit sounds");
+#define beep(freq) do { if (sound) kd_mksound(freq, HZ/10); } while(0)
+
+/* mini console */
+#define WIDTH 40
+#define BRAILLE_KEY KEY_INSERT
+static u16 console_buf[WIDTH];
+static int console_cursor = 0;
+
+/* mini view of VC */
+static int vc_x, vc_y, lastvc_x, lastvc_y;
+
+/* show console ? (or show VC) */
+static int console_show = 1;
+/* pending newline ? */
+static int console_newline = 1;
+static int lastVC = -1;
+
+static struct console *braille_co;
+
+/* Very VisioBraille-specific */
+static void braille_write(u16 *buf)
+{
+	static u16 lastwrite[WIDTH];
+	unsigned char data[1 + 1 + 2*WIDTH + 2 + 1], csum = 0, *c;
+	u16 out;
+	int i;
+
+	if (!braille_co)
+		return;
+
+	if (!memcmp(lastwrite, buf, WIDTH * sizeof(*buf)))
+		return;
+	memcpy(lastwrite, buf, WIDTH * sizeof(*buf));
+
+#define SOH 1
+#define STX 2
+#define ETX 2
+#define EOT 4
+#define ENQ 5
+	data[0] = STX;
+	data[1] = '>';
+	csum ^= '>';
+	c = &data[2];
+	for (i=0; i<WIDTH; i++) {
+		out = buf[i];
+		if (out >= 0x100)
+			out = '?';
+		else if (out == 0x00)
+			out = ' ';
+		csum ^= out;
+		if (out <= 0x05) {
+			*c++ = SOH;
+			out |= 0x40;
+		}
+		*c++ = out;
+	}
+
+	if (csum <= 0x05) {
+		*c++ = SOH;
+		csum = 0x40;
+	}
+	*c++ = csum;
+	*c++ = ETX;
+
+	serial8250_console.write(braille_co, data, c - data);
+}
+
+/* Follow the VC cursor*/
+static void vc_follow_cursor(struct vc_data *vc)
+{
+	vc_x = vc->vc_x - (vc->vc_x % WIDTH);
+	vc_y = vc->vc_y;
+	lastvc_x = vc->vc_x;
+	lastvc_y = vc->vc_y;
+}
+
+/* Maybe the VC cursor moved, if so follow it */
+static void vc_maybe_cursor_moved(struct vc_data *vc)
+{
+	if (vc->vc_x != lastvc_x || vc->vc_y != lastvc_y)
+		vc_follow_cursor(vc);
+}
+
+/* Show portion of VC at vc_x, vc_y */
+static void vc_refresh(struct vc_data *vc)
+{
+	u16 buf[WIDTH];
+	int i;
+
+	for (i = 0; i<WIDTH; i++) {
+		u16 glyph = screen_glyph(vc, 2 * (vc_x + i) + vc_y * vc->vc_size_row);
+		buf[i] = inverse_translate(vc, glyph, 1);
+	}
+	braille_write(buf);
+}
+
+/*
+ * Link to keyboard
+ */
+
+static int keyboard_notifier_call(struct notifier_block *blk, unsigned long code, void *_param)
+{
+	struct keyboard_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	int ret = NOTIFY_OK;
+
+	if (!param->down)
+		return ret;
+
+	switch (code) {
+		case KBD_KEYCODE:
+			if (console_show) {
+				if (param->value == BRAILLE_KEY) {
+					console_show = 0;
+					beep(880);
+					vc_maybe_cursor_moved(vc);
+					vc_refresh(vc);
+					ret = NOTIFY_STOP;
+				}
+			} else {
+				ret = NOTIFY_STOP;
+				switch (param->value) {
+					case KEY_INSERT:
+						beep(440);
+						console_show = 1;
+						lastVC = -1;
+						braille_write(console_buf);
+						break;
+					case KEY_LEFT:
+						if (vc_x > 0) {
+							vc_x -= WIDTH;
+							if (vc_x < 0)
+								vc_x = 0;
+						} else if (vc_y >= 1) {
+							beep(880);
+							vc_y--;
+							vc_x = vc->vc_cols-WIDTH;
+						} else
+							beep(220);
+						break;
+					case KEY_RIGHT:
+						if (vc_x + WIDTH < vc->vc_cols) {
+							vc_x += WIDTH;
+						} else if (vc_y + 1 < vc->vc_rows) {
+							beep(880);
+							vc_y++;
+							vc_x = 0;
+						} else
+							beep(220);
+						break;
+					case KEY_DOWN:
+						if (vc_y + 1 < vc->vc_rows)
+							vc_y++;
+						else
+							beep(220);
+						break;
+					case KEY_UP:
+						if (vc_y >= 1)
+							vc_y--;
+						else
+							beep(220);
+						break;
+					case KEY_HOME:
+						vc_follow_cursor(vc);
+						break;
+					case KEY_PAGEUP:
+						vc_x = 0;
+						vc_y = 0;
+						break;
+					case KEY_PAGEDOWN:
+						vc_x = 0;
+						vc_y = vc->vc_rows-1;
+						break;
+					default:
+						ret = NOTIFY_OK;
+						break;
+				}
+				if (ret == NOTIFY_STOP)
+					vc_refresh(vc);
+			}
+			break;
+		case KBD_POST_KEYSYM:
+		{
+			unsigned char type = KTYP(param->value) - 0xf0;
+			if (type == KT_SPEC) {
+				unsigned char val = KVAL(param->value);
+				int on_off = -1;
+
+				switch(val) {
+					case KVAL(K_CAPS):
+						on_off = vc_kbd_led(kbd_table + fg_console, VC_CAPSLOCK);
+						break;
+					case KVAL(K_NUM):
+						on_off = vc_kbd_led(kbd_table + fg_console, VC_NUMLOCK);
+						break;
+					case KVAL(K_HOLD):
+						on_off = vc_kbd_led(kbd_table + fg_console, VC_SCROLLOCK);
+						break;
+				}
+				if (on_off == 1)
+					beep(880);
+				else if (on_off == 0)
+					beep(440);
+			}
+		}
+		case KBD_UNBOUND_KEYCODE:
+		case KBD_UNICODE:
+		case KBD_KEYSYM:
+			/* Unused */
+			break;
+	}
+	return ret;
+}
+
+static struct notifier_block keyboard_notifier_block = {
+	.notifier_call = keyboard_notifier_call,
+};
+
+static int vt_notifier_call(struct notifier_block *blk, unsigned long code, void *_param)
+{
+	struct vt_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	switch (code) {
+		case VT_ALLOCATE:
+			break;
+		case VT_DEALLOCATE:
+			break;
+		case VT_WRITE:
+		{
+			unsigned char c = param->c;
+			switch (c) {
+				case '\b':
+				case 127:
+					if (console_cursor > 0) {
+						console_cursor--;
+						console_buf[console_cursor] = ' ';
+					}
+					break;
+				case '\n':
+				case '\v':
+				case '\f':
+				case '\r':
+					console_newline = 1;
+					break;
+				case '\t':
+					c = ' ';
+					/* Fallthrough */
+				default:
+					if (c < 32)
+						/* Ignore other control sequences */
+						break;
+					if (console_newline) {
+						memset(console_buf, 0, sizeof(console_buf));
+						console_cursor = 0;
+						console_newline = 0;
+					}
+					if (console_cursor == WIDTH)
+						memmove(console_buf, &console_buf[1], (WIDTH-1) * sizeof(*console_buf));
+					else
+						console_cursor++;
+					console_buf[console_cursor-1] = c;
+					break;
+			}
+			if (console_show)
+				braille_write(console_buf);
+			else {
+				vc_maybe_cursor_moved(vc);
+				vc_refresh(vc);
+			}
+			break;
+		}
+		case VT_UPDATE:
+			/* Maybe a VT switch, flush */
+			if (console_show) {
+				if (vc->vc_num != lastVC) {
+					lastVC = vc->vc_num;
+					memset(console_buf, 0, sizeof(console_buf));
+					console_cursor = 0;
+					braille_write(console_buf);
+				}
+			} else {
+				vc_maybe_cursor_moved(vc);
+				vc_refresh(vc);
+			}
+			break;
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block vt_notifier_block = {
+	.notifier_call = vt_notifier_call,
+};
+
+/*
+ * Link to serial console
+ */
+
+static int __init braille_console_setup(struct console *co, char *options)
+{
+	int ret = 0;
+	if (co->index == -1)
+		co->index = 0;
+#ifndef MODULE
+	ret = serial8250_console.setup(co, options);
+	if (ret < 0)
+		return ret;
+#endif
+	braille_co = co;
+	return ret;
+}
+
+static struct console braille_console = {
+	.name		= "brl",
+	.setup		= braille_console_setup,
+	.flags		= CON_PRINTBUFFER,
+	.index		= -1,
+};
+
+/*
+ * Module access
+ */
+
+static int __init checkinit(void)
+{
+	register_console(&braille_console);
+	register_keyboard_notifier(&keyboard_notifier_block);
+	register_vt_notifier(&vt_notifier_block);
+	return 0;
+}
+static void __exit checkexit(void)
+{
+	unregister_vt_notifier(&vt_notifier_block);
+	unregister_keyboard_notifier(&keyboard_notifier_block);
+	unregister_console(&braille_console);
+}
+
+module_init(checkinit);
+module_exit(checkexit);
diff -urN linux-2.6.24-orig/drivers/a11y/Kconfig linux-2.6.24-perso/drivers/a11y/Kconfig
--- linux-2.6.24-orig/drivers/a11y/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/Kconfig	2008-02-04 01:54:36.000000000 +0000
@@ -0,0 +1,22 @@
+menuconfig A11Y
+	bool "Accessibility support"
+	---help---
+	  Enable a submenu where accessibility items may be enabled.
+
+	  If unsure, say N.
+
+if A11Y
+config A11Y_BRAILLE_CONSOLE
+	tristate "Console on braille device"
+	depends on SERIAL_8250_CONSOLE
+	---help---
+	  Enables console output on a braille device connected to a 8250
+	  serial port. For now only the VisioBraille device is supported.
+
+	  To actually enable it, you need to pass option
+	  console=brl0
+	  to the kernel. Options are the same as for serial console.
+
+	  If unsure, say N.
+
+endif # A11Y
diff -urN linux-2.6.24-orig/drivers/a11y/Makefile linux-2.6.24-perso/drivers/a11y/Makefile
--- linux-2.6.24-orig/drivers/a11y/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/Makefile	2008-02-04 01:42:32.000000000 +0000
@@ -0,0 +1 @@
+obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille/braille_console.o

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

* Re: [PATCH,RESEND] Basic braille screen reader support
  2008-02-05 22:00 ` [PATCH,RESEND] " Samuel Thibault
@ 2008-02-06  0:58   ` Andrew Morton
  2008-02-06  2:04     ` Samuel Thibault
  2008-03-19 18:57   ` [mmotm build error] Re: [PATCH,RESEND] " Randy Dunlap
  1 sibling, 1 reply; 22+ messages in thread
From: Andrew Morton @ 2008-02-06  0:58 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: torvalds, linux-kernel, Dmitry Torokhov, Jiri Kosina

On Tue, 5 Feb 2008 22:00:54 +0000
Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:

> This adds a minimalistic braille screen reader support.
> This is meant to be used by blind people e.g. on boot failures or when /
> cannot be mounted etc and thus the userland screen readers can not work.

Could you feed it through scritps/checkpatch.pl please?  That finds a lot
of trivial stuff which we'd prefer be fixed.

> +#define beep(freq) do { if (sound) kd_mksound(freq, HZ/10); } while(0)

This can (and hence should!) be impemented in a C function (I think?).

> +
> +/* mini console */
> +#define WIDTH 40
> +#define BRAILLE_KEY KEY_INSERT
> +static u16 console_buf[WIDTH];
> +static int console_cursor = 0;

Unneeded initialisation (checkpatch will tell you about this)

> +/* mini view of VC */
> +static int vc_x, vc_y, lastvc_x, lastvc_y;
> +
> +/* show console ? (or show VC) */
> +static int console_show = 1;
> +/* pending newline ? */
> +static int console_newline = 1;
> +static int lastVC = -1;
> +
> +static struct console *braille_co;
> +
> +/* Very VisioBraille-specific */
> +static void braille_write(u16 *buf)
> +{
> +	static u16 lastwrite[WIDTH];
> +	unsigned char data[1 + 1 + 2*WIDTH + 2 + 1], csum = 0, *c;
> +	u16 out;
> +	int i;
> +
> +	if (!braille_co)
> +		return;
> +
> +	if (!memcmp(lastwrite, buf, WIDTH * sizeof(*buf)))
> +		return;
> +	memcpy(lastwrite, buf, WIDTH * sizeof(*buf));

`lastwrite' is a kernel-wide singleton and hence at least needs some
locking protecting its consistency.

If this is a single-opener-only device then I _guess_ this approach is OK. 
If not, `lastwrite' really should be some dynamically-allocated, per-open thing,
presumably accessed by file.private_data.

> +#define SOH 1
> +#define STX 2
> +#define ETX 2
> +#define EOT 4
> +#define ENQ 5
> +	data[0] = STX;
> +	data[1] = '>';
> +	csum ^= '>';
> +	c = &data[2];
> +	for (i=0; i<WIDTH; i++) {
> +		out = buf[i];
> +		if (out >= 0x100)
> +			out = '?';
> +		else if (out == 0x00)
> +			out = ' ';
> +		csum ^= out;
> +		if (out <= 0x05) {
> +			*c++ = SOH;
> +			out |= 0x40;
> +		}
> +		*c++ = out;
> +	}
> +
> +	if (csum <= 0x05) {
> +		*c++ = SOH;
> +		csum = 0x40;
> +	}
> +	*c++ = csum;
> +	*c++ = ETX;
> +
> +	serial8250_console.write(braille_co, data, c - data);
> +}

hm.  Is it appropriate that this driver wire itself directly into
serial8250?  What if the screen reader is attached to some other sort of
uart, or a terminal server, or...

Maybe this all should be implemented as a line discipline, or something
like that?

> +/*
> + * Link to keyboard
> + */
> +
> +static int keyboard_notifier_call(struct notifier_block *blk, unsigned long code, void *_param)
> +{
> +	struct keyboard_notifier_param *param = _param;
> +	struct vc_data *vc = param->vc;
> +	int ret = NOTIFY_OK;
> +
> +	if (!param->down)
> +		return ret;
> +
> +	switch (code) {
> +		case KBD_KEYCODE:

Maybe Dmitry and Jiri would have time to review this code?

> +static struct notifier_block keyboard_notifier_block = {
> +	.notifier_call = keyboard_notifier_call,
> +};
> +
> +static int vt_notifier_call(struct notifier_block *blk, unsigned long code, void *_param)
> +{
> +	struct vt_notifier_param *param = _param;
> +	struct vc_data *vc = param->vc;
> +	switch (code) {
> +		case VT_ALLOCATE:
> +			break;
> +		case VT_DEALLOCATE:
> +			break;
> +		case VT_WRITE:
> +		{
> +			unsigned char c = param->c;
> +			switch (c) {
> +				case '\b':
> +				case 127:
> +					if (console_cursor > 0) {
> +						console_cursor--;
> +						console_buf[console_cursor] = ' ';
> +					}
> +					break;
> +				case '\n':
> +				case '\v':
> +				case '\f':
> +				case '\r':
> +					console_newline = 1;
> +					break;
> +				case '\t':
> +					c = ' ';
> +					/* Fallthrough */
> +				default:
> +					if (c < 32)
> +						/* Ignore other control sequences */
> +						break;
> +					if (console_newline) {
> +						memset(console_buf, 0, sizeof(console_buf));
> +						console_cursor = 0;
> +						console_newline = 0;
> +					}
> +					if (console_cursor == WIDTH)
> +						memmove(console_buf, &console_buf[1], (WIDTH-1) * sizeof(*console_buf));
> +					else
> +						console_cursor++;
> +					console_buf[console_cursor-1] = c;
> +					break;
> +			}
> +			if (console_show)
> +				braille_write(console_buf);
> +			else {
> +				vc_maybe_cursor_moved(vc);
> +				vc_refresh(vc);
> +			}
> +			break;
> +		}
> +		case VT_UPDATE:
> +			/* Maybe a VT switch, flush */
> +			if (console_show) {
> +				if (vc->vc_num != lastVC) {
> +					lastVC = vc->vc_num;
> +					memset(console_buf, 0, sizeof(console_buf));
> +					console_cursor = 0;
> +					braille_write(console_buf);
> +				}
> +			} else {
> +				vc_maybe_cursor_moved(vc);
> +				vc_refresh(vc);
> +			}
> +			break;
> +	}
> +	return NOTIFY_OK;
> +}
> +
> +static struct notifier_block vt_notifier_block = {
> +	.notifier_call = vt_notifier_call,
> +};
> +
> +/*
> + * Link to serial console
> + */
> +
> +static int __init braille_console_setup(struct console *co, char *options)
> +{
> +	int ret = 0;
> +	if (co->index == -1)
> +		co->index = 0;
> +#ifndef MODULE
> +	ret = serial8250_console.setup(co, options);
> +	if (ret < 0)
> +		return ret;
> +#endif

That's pretty ungainly.  Again, if we had some clear spearation between the
protocol layer and the device-driver layer and some way of binding them
under userspace control (like a line discipline), all this would get better.

> +	braille_co = co;
> +	return ret;
> +}
> +
> +static struct console braille_console = {
> +	.name		= "brl",
> +	.setup		= braille_console_setup,
> +	.flags		= CON_PRINTBUFFER,
> +	.index		= -1,
> +};
> +
>
> ...
>
> diff -urN linux-2.6.24-orig/drivers/a11y/Kconfig linux-2.6.24-perso/drivers/a11y/Kconfig
> --- linux-2.6.24-orig/drivers/a11y/Kconfig	1970-01-01 01:00:00.000000000 +0100
> +++ linux-2.6.24-perso/drivers/a11y/Kconfig	2008-02-04 01:54:36.000000000 +0000
> @@ -0,0 +1,22 @@
> +menuconfig A11Y
> +	bool "Accessibility support"

That's cute, but perhaps we should be boring and call it
CONFIG_ACCESSIBILITY.  That would be more accessible ;)

> +	---help---
> +	  Enable a submenu where accessibility items may be enabled.
> +
> +	  If unsure, say N.
> +
> +if A11Y
> +config A11Y_BRAILLE_CONSOLE

And that would get very lengthy.

> +	tristate "Console on braille device"
> +	depends on SERIAL_8250_CONSOLE
> +	---help---
> +	  Enables console output on a braille device connected to a 8250
> +	  serial port. For now only the VisioBraille device is supported.
> +
> +	  To actually enable it, you need to pass option
> +	  console=brl0
> +	  to the kernel. Options are the same as for serial console.
> +
> +	  If unsure, say N.
> +
> +endif # A11Y


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

* Re: [PATCH,RESEND] Basic braille screen reader support
  2008-02-06  0:58   ` Andrew Morton
@ 2008-02-06  2:04     ` Samuel Thibault
  2008-02-22  0:28       ` [PATCH2] " Samuel Thibault
  0 siblings, 1 reply; 22+ messages in thread
From: Samuel Thibault @ 2008-02-06  2:04 UTC (permalink / raw)
  To: Andrew Morton; +Cc: torvalds, linux-kernel, Dmitry Torokhov, Jiri Kosina

Andrew Morton, le Tue 05 Feb 2008 16:58:53 -0800, a écrit :
> On Tue, 5 Feb 2008 22:00:54 +0000
> Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:
> 
> > This adds a minimalistic braille screen reader support.
> > This is meant to be used by blind people e.g. on boot failures or when /
> > cannot be mounted etc and thus the userland screen readers can not work.
> 
> Could you feed it through scritps/checkpatch.pl please?  That finds a lot
> of trivial stuff which we'd prefer be fixed.

Oops, sorry, it's probably been some time since I last read
SubmittingPatches.  Actually, this discovered a false positive in
checkpatch.pl for kbd_table :)

> `lastwrite' is a kernel-wide singleton and hence at least needs some
> locking protecting its consistency.
> 
> If this is a single-opener-only device then I _guess_ this approach is OK. 

It is meant to be yes, though it was lacking protection against this.
Fixed in this new version.

> > +	serial8250_console.write(braille_co, data, c - data);
> 
> hm.  Is it appropriate that this driver wire itself directly into
> serial8250?

We want to have output as early as possible for debugging, just like
early serial consoles.

> What if the screen reader is attached to some other sort of
> uart, or a terminal server, or...

Indeed that's an issue.  For now, there is no clean way to attach to the
early serial drivers, that's why I chose 8250, which should be correct
99% of the time for the current users of this.  We could add a parameter
to the console=brl option that specifies which early serial console to
use.

> Maybe this all should be implemented as a line discipline, or something
> like that?

For a permanent screen reader, yes (that's what we will probably do for
SpeakUp), but for an boot reader, I don't think it may even work.

> > +#ifndef MODULE
> > +	ret = serial8250_console.setup(co, options);
> > +	if (ret < 0)
> > +		return ret;
> > +#endif
> 
> That's pretty ungainly.

The problem is that there is currently no better way to setup the serial
port so early.

> Again, if we had some clear spearation between the
> protocol layer and the device-driver layer and some way of binding them
> under userspace control (like a line discipline), all this would get better.

Again, we need the screen reader working during boot, even before init
exists.  A line discipline would indeed be fine if we had userspace
control, but this tool is precisely intended for the case when userspace
can't be booted :)

> > @@ -0,0 +1,22 @@
> > +menuconfig A11Y
> > +	bool "Accessibility support"
> 
> That's cute,

Well, that's the official name (www.a11y.org) :)

> but perhaps we should be boring and call it
> CONFIG_ACCESSIBILITY.  That would be more accessible ;)

Why not :)

> > +	---help---
> > +	  Enable a submenu where accessibility items may be enabled.
> > +
> > +	  If unsure, say N.
> > +
> > +if A11Y
> > +config A11Y_BRAILLE_CONSOLE
> 
> And that would get very lengthy.

Then keep A11Y here?

Here is a revised patch.

Samuel

This adds a minimalistic braille screen reader support.
This is meant to be used by blind people e.g. on boot failures or when /
cannot be mounted etc and thus the userland screen readers can not work.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

--- linux-2.6.24-orig/drivers/char/consolemap.c	2008-01-25 08:32:05.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/consolemap.c	2008-02-03 21:27:04.000000000 +0000
@@ -277,6 +277,7 @@
 			return p->inverse_translations[m][glyph];
 	}
 }
+EXPORT_SYMBOL_GPL(inverse_translate);
 
 static void update_user_maps(void)
 {
--- linux-2.6.24-orig/drivers/char/vt.c	2008-01-25 08:32:06.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/vt.c	2008-02-03 21:27:04.000000000 +0000
@@ -3982,6 +3982,7 @@
 		c |= 0x100;
 	return c;
 }
+EXPORT_SYMBOL_GPL(screen_glyph);
 
 /* used by vcs - note the word offset */
 unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
--- linux-2.6.24-orig/drivers/char/keyboard.c	2008-01-25 08:32:06.000000000 +0000
+++ linux-2.6.24-perso/drivers/char/keyboard.c	2008-02-04 02:44:37.000000000 +0000
@@ -110,6 +110,7 @@
 const int NR_TYPES = ARRAY_SIZE(max_vals);
 
 struct kbd_struct kbd_table[MAX_NR_CONSOLES];
+EXPORT_SYMBOL_GPL(kbd_table);
 static struct kbd_struct *kbd = kbd_table;
 
 struct vt_spawn_console vt_spawn_con = {
@@ -260,6 +261,7 @@
 	} else
 		kd_nosound(0);
 }
+EXPORT_SYMBOL_GPL(kd_mksound);
 
 /*
  * Setting the keyboard rate.
--- linux-2.6.24-orig/drivers/Kconfig	2008-01-25 08:32:04.000000000 +0000
+++ linux-2.6.24-perso/drivers/Kconfig	2008-02-04 01:32:17.000000000 +0000
@@ -95,4 +95,6 @@
 source "drivers/uio/Kconfig"
 
 source "drivers/virtio/Kconfig"
+
+source "drivers/a11y/Kconfig"
 endmenu
--- linux-2.6.24-orig/drivers/Makefile	2008-01-25 08:32:04.000000000 +0000
+++ linux-2.6.24-perso/drivers/Makefile	2008-02-04 01:33:27.000000000 +0000
@@ -28,6 +28,8 @@
 obj-$(CONFIG_FB_INTEL)          += video/intelfb/
 
 obj-y				+= serial/
+# a11y comes after serial because it depends on it
+obj-$(CONFIG_ACCESSIBILITY)	+= a11y/
 obj-$(CONFIG_PARPORT)		+= parport/
 obj-y				+= base/ block/ misc/ mfd/ net/ media/
 obj-$(CONFIG_NUBUS)		+= nubus/
--- linux-2.6.24-orig/include/linux/serial_8250.h	2007-10-09 21:31:38.000000000 +0100
+++ linux-2.6.24-perso/include/linux/serial_8250.h	2008-02-03 21:28:40.000000000 +0000
@@ -66,4 +66,6 @@
 extern int serial8250_find_port_for_earlycon(void);
 extern int setup_early_serial8250_console(char *cmdline);
 
+extern struct console serial8250_console;
+
 #endif
--- linux-2.6.24-orig/drivers/serial/8250.c	2007-10-09 21:31:38.000000000 +0100
+++ linux-2.6.24-perso/drivers/serial/8250.c	2008-02-03 21:29:54.000000000 +0000
@@ -2547,7 +2547,7 @@
 }
 
 static struct uart_driver serial8250_reg;
-static struct console serial8250_console = {
+struct console serial8250_console = {
 	.name		= "ttyS",
 	.write		= serial8250_console_write,
 	.device		= uart_console_device,
@@ -2557,6 +2557,7 @@
 	.index		= -1,
 	.data		= &serial8250_reg,
 };
+EXPORT_SYMBOL_GPL(serial8250_console);
 
 static int __init serial8250_console_init(void)
 {
diff -urN linux-2.6.24-orig/drivers/a11y/braille/braille_console.c linux-2.6.24-perso/drivers/a11y/braille/braille_console.c
--- linux-2.6.24-orig/drivers/a11y/braille/braille_console.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/braille/braille_console.c	2008-02-04 01:58:16.000000000 +0000
@@ -0,0 +1,404 @@
+/*
+ * Minimalistic braille device kernel support.
+ *
+ * By default, shows console messages on the braille device.
+ * Pressing Insert switches to VC browsing.
+ *
+ *  Copyright (C) Samuel Thibault <samuel.thibault@ens-lyon.org>
+ *
+ * This program is free software ; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation ; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY ; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the program ; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/autoconf.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/console.h>
+#include <linux/notifier.h>
+
+#include <linux/selection.h>
+#include <linux/vt_kern.h>
+#include <linux/consolemap.h>
+
+#include <linux/keyboard.h>
+#include <linux/kbd_kern.h>
+#include <linux/input.h>
+
+#include <linux/serial_8250.h>
+
+MODULE_AUTHOR("samuel.thibault@ens-lyon.org");
+MODULE_DESCRIPTION("braille device");
+MODULE_LICENSE("GPL");
+
+/*
+ * Braille device support part.
+ */
+
+/* Emit various sounds */
+static int sound;
+module_param(sound, bool, 0);
+MODULE_PARM_DESC(sound, "emit sounds");
+
+static void beep(unsigned int freq)
+{
+	if (sound)
+		kd_mksound(freq, HZ/10);
+}
+
+/* mini console */
+#define WIDTH 40
+#define BRAILLE_KEY KEY_INSERT
+static u16 console_buf[WIDTH];
+static int console_cursor;
+
+/* mini view of VC */
+static int vc_x, vc_y, lastvc_x, lastvc_y;
+
+/* show console ? (or show VC) */
+static int console_show = 1;
+/* pending newline ? */
+static int console_newline = 1;
+static int lastVC = -1;
+
+static struct console *braille_co;
+
+/* Very VisioBraille-specific */
+static void braille_write(u16 *buf)
+{
+	static u16 lastwrite[WIDTH];
+	unsigned char data[1 + 1 + 2*WIDTH + 2 + 1], csum = 0, *c;
+	u16 out;
+	int i;
+
+	if (!braille_co)
+		return;
+
+	if (!memcmp(lastwrite, buf, WIDTH * sizeof(*buf)))
+		return;
+	memcpy(lastwrite, buf, WIDTH * sizeof(*buf));
+
+#define SOH 1
+#define STX 2
+#define ETX 2
+#define EOT 4
+#define ENQ 5
+	data[0] = STX;
+	data[1] = '>';
+	csum ^= '>';
+	c = &data[2];
+	for (i = 0; i < WIDTH; i++) {
+		out = buf[i];
+		if (out >= 0x100)
+			out = '?';
+		else if (out == 0x00)
+			out = ' ';
+		csum ^= out;
+		if (out <= 0x05) {
+			*c++ = SOH;
+			out |= 0x40;
+		}
+		*c++ = out;
+	}
+
+	if (csum <= 0x05) {
+		*c++ = SOH;
+		csum = 0x40;
+	}
+	*c++ = csum;
+	*c++ = ETX;
+
+	serial8250_console.write(braille_co, data, c - data);
+}
+
+/* Follow the VC cursor*/
+static void vc_follow_cursor(struct vc_data *vc)
+{
+	vc_x = vc->vc_x - (vc->vc_x % WIDTH);
+	vc_y = vc->vc_y;
+	lastvc_x = vc->vc_x;
+	lastvc_y = vc->vc_y;
+}
+
+/* Maybe the VC cursor moved, if so follow it */
+static void vc_maybe_cursor_moved(struct vc_data *vc)
+{
+	if (vc->vc_x != lastvc_x || vc->vc_y != lastvc_y)
+		vc_follow_cursor(vc);
+}
+
+/* Show portion of VC at vc_x, vc_y */
+static void vc_refresh(struct vc_data *vc)
+{
+	u16 buf[WIDTH];
+	int i;
+
+	for (i = 0; i < WIDTH; i++) {
+		u16 glyph = screen_glyph(vc,
+				2 * (vc_x + i) + vc_y * vc->vc_size_row);
+		buf[i] = inverse_translate(vc, glyph, 1);
+	}
+	braille_write(buf);
+}
+
+/*
+ * Link to keyboard
+ */
+
+static int keyboard_notifier_call(struct notifier_block *blk,
+				  unsigned long code, void *_param)
+{
+	struct keyboard_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	int ret = NOTIFY_OK;
+
+	if (!param->down)
+		return ret;
+
+	switch (code) {
+	case KBD_KEYCODE:
+		if (console_show) {
+			if (param->value == BRAILLE_KEY) {
+				console_show = 0;
+				beep(880);
+				vc_maybe_cursor_moved(vc);
+				vc_refresh(vc);
+				ret = NOTIFY_STOP;
+			}
+		} else {
+			ret = NOTIFY_STOP;
+			switch (param->value) {
+			case KEY_INSERT:
+				beep(440);
+				console_show = 1;
+				lastVC = -1;
+				braille_write(console_buf);
+				break;
+			case KEY_LEFT:
+				if (vc_x > 0) {
+					vc_x -= WIDTH;
+					if (vc_x < 0)
+						vc_x = 0;
+				} else if (vc_y >= 1) {
+					beep(880);
+					vc_y--;
+					vc_x = vc->vc_cols-WIDTH;
+				} else
+					beep(220);
+				break;
+			case KEY_RIGHT:
+				if (vc_x + WIDTH < vc->vc_cols) {
+					vc_x += WIDTH;
+				} else if (vc_y + 1 < vc->vc_rows) {
+					beep(880);
+					vc_y++;
+					vc_x = 0;
+				} else
+					beep(220);
+				break;
+			case KEY_DOWN:
+				if (vc_y + 1 < vc->vc_rows)
+					vc_y++;
+				else
+					beep(220);
+				break;
+			case KEY_UP:
+				if (vc_y >= 1)
+					vc_y--;
+				else
+					beep(220);
+				break;
+			case KEY_HOME:
+				vc_follow_cursor(vc);
+				break;
+			case KEY_PAGEUP:
+				vc_x = 0;
+				vc_y = 0;
+				break;
+			case KEY_PAGEDOWN:
+				vc_x = 0;
+				vc_y = vc->vc_rows-1;
+				break;
+			default:
+				ret = NOTIFY_OK;
+				break;
+			}
+			if (ret == NOTIFY_STOP)
+				vc_refresh(vc);
+		}
+		break;
+	case KBD_POST_KEYSYM:
+	{
+		unsigned char type = KTYP(param->value) - 0xf0;
+		if (type == KT_SPEC) {
+			unsigned char val = KVAL(param->value);
+			int on_off = -1;
+
+			switch (val) {
+			case KVAL(K_CAPS):
+				on_off = vc_kbd_led(kbd_table + fg_console,
+						VC_CAPSLOCK);
+				break;
+			case KVAL(K_NUM):
+				on_off = vc_kbd_led(kbd_table + fg_console,
+						VC_NUMLOCK);
+				break;
+			case KVAL(K_HOLD):
+				on_off = vc_kbd_led(kbd_table + fg_console,
+						VC_SCROLLOCK);
+				break;
+			}
+			if (on_off == 1)
+				beep(880);
+			else if (on_off == 0)
+				beep(440);
+		}
+	}
+	case KBD_UNBOUND_KEYCODE:
+	case KBD_UNICODE:
+	case KBD_KEYSYM:
+		/* Unused */
+		break;
+	}
+	return ret;
+}
+
+static struct notifier_block keyboard_notifier_block = {
+	.notifier_call = keyboard_notifier_call,
+};
+
+static int vt_notifier_call(struct notifier_block *blk,
+			    unsigned long code, void *_param)
+{
+	struct vt_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	switch (code) {
+	case VT_ALLOCATE:
+		break;
+	case VT_DEALLOCATE:
+		break;
+	case VT_WRITE:
+	{
+		unsigned char c = param->c;
+		switch (c) {
+		case '\b':
+		case 127:
+			if (console_cursor > 0) {
+				console_cursor--;
+				console_buf[console_cursor] = ' ';
+			}
+			break;
+		case '\n':
+		case '\v':
+		case '\f':
+		case '\r':
+			console_newline = 1;
+			break;
+		case '\t':
+			c = ' ';
+			/* Fallthrough */
+		default:
+			if (c < 32)
+				/* Ignore other control sequences */
+				break;
+			if (console_newline) {
+				memset(console_buf, 0, sizeof(console_buf));
+				console_cursor = 0;
+				console_newline = 0;
+			}
+			if (console_cursor == WIDTH)
+				memmove(console_buf, &console_buf[1],
+					(WIDTH-1) * sizeof(*console_buf));
+			else
+				console_cursor++;
+			console_buf[console_cursor-1] = c;
+			break;
+		}
+		if (console_show)
+			braille_write(console_buf);
+		else {
+			vc_maybe_cursor_moved(vc);
+			vc_refresh(vc);
+		}
+		break;
+	}
+	case VT_UPDATE:
+		/* Maybe a VT switch, flush */
+		if (console_show) {
+			if (vc->vc_num != lastVC) {
+				lastVC = vc->vc_num;
+				memset(console_buf, 0, sizeof(console_buf));
+				console_cursor = 0;
+				braille_write(console_buf);
+			}
+		} else {
+			vc_maybe_cursor_moved(vc);
+			vc_refresh(vc);
+		}
+		break;
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block vt_notifier_block = {
+	.notifier_call = vt_notifier_call,
+};
+
+/*
+ * Link to serial console
+ */
+
+static int __init braille_console_setup(struct console *co, char *options)
+{
+	int ret = 0;
+	if (braille_co)
+		return -ENODEV;
+	if (co->index == -1)
+		co->index = 0;
+#ifndef MODULE
+	ret = serial8250_console.setup(co, options);
+	if (ret < 0)
+		return ret;
+#endif
+	braille_co = co;
+	return ret;
+}
+
+static struct console braille_console = {
+	.name		= "brl",
+	.setup		= braille_console_setup,
+	.flags		= CON_PRINTBUFFER,
+	.index		= -1,
+};
+
+/*
+ * Module access
+ */
+
+static int __init checkinit(void)
+{
+	register_console(&braille_console);
+	register_keyboard_notifier(&keyboard_notifier_block);
+	register_vt_notifier(&vt_notifier_block);
+	return 0;
+}
+static void __exit checkexit(void)
+{
+	unregister_vt_notifier(&vt_notifier_block);
+	unregister_keyboard_notifier(&keyboard_notifier_block);
+	unregister_console(&braille_console);
+}
+
+module_init(checkinit);
+module_exit(checkexit);
diff -urN linux-2.6.24-orig/drivers/a11y/Kconfig linux-2.6.24-perso/drivers/a11y/Kconfig
--- linux-2.6.24-orig/drivers/a11y/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/Kconfig	2008-02-04 01:54:36.000000000 +0000
@@ -0,0 +1,22 @@
+menuconfig ACCESSIBILITY
+	bool "Accessibility support"
+	---help---
+	  Enable a submenu where accessibility items may be enabled.
+
+	  If unsure, say N.
+
+if ACCESSIBILITY
+config A11Y_BRAILLE_CONSOLE
+	tristate "Console on braille device"
+	depends on SERIAL_8250_CONSOLE
+	---help---
+	  Enables console output on a braille device connected to a 8250
+	  serial port. For now only the VisioBraille device is supported.
+
+	  To actually enable it, you need to pass option
+	  console=brl0
+	  to the kernel. Options are the same as for serial console.
+
+	  If unsure, say N.
+
+endif # ACCESSIBILITY
diff -urN linux-2.6.24-orig/drivers/a11y/Makefile linux-2.6.24-perso/drivers/a11y/Makefile
--- linux-2.6.24-orig/drivers/a11y/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24-perso/drivers/a11y/Makefile	2008-02-04 01:42:32.000000000 +0000
@@ -0,0 +1 @@
+obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille/braille_console.o

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

* [PATCH2] Basic braille screen reader support
  2008-02-06  2:04     ` Samuel Thibault
@ 2008-02-22  0:28       ` Samuel Thibault
  2008-02-23  8:04         ` Andrew Morton
  0 siblings, 1 reply; 22+ messages in thread
From: Samuel Thibault @ 2008-02-22  0:28 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel, Dmitry Torokhov, Jiri Kosina

Samuel Thibault, le Wed 06 Feb 2008 02:04:23 +0000, a écrit :
> Andrew Morton, le Tue 05 Feb 2008 16:58:53 -0800, a écrit :
> > On Tue, 5 Feb 2008 22:00:54 +0000
> > Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:
> > > +	serial8250_console.write(braille_co, data, c - data);
> > 
> > hm.  Is it appropriate that this driver wire itself directly into
> > serial8250?
> > What if the screen reader is attached to some other sort of
> > uart, or a terminal server, or...
> 
> Indeed that's an issue.  For now, there is no clean way to attach to the
> early serial drivers, that's why I chose 8250,

In the patch below, I hook into kernel/printk.c's console= parser, which
now gives me attachment to any kind of console.




This adds a minimalistic braille screen reader support.
This is meant to be used by blind people e.g. on boot failures or when /
cannot be mounted etc and thus the userland screen readers can not work.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

diff -ur linux-2.6.24.1-orig/drivers/char/consolemap.c linux-2.6.24.1-perso/drivers/char/consolemap.c
--- linux-2.6.24.1-orig/drivers/char/consolemap.c	2008-01-25 09:32:05.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/char/consolemap.c	2008-02-03 22:27:04.000000000 +0100
@@ -277,6 +277,7 @@
 			return p->inverse_translations[m][glyph];
 	}
 }
+EXPORT_SYMBOL_GPL(inverse_translate);
 
 static void update_user_maps(void)
 {
diff -ur linux-2.6.24.1-orig/drivers/char/keyboard.c linux-2.6.24.1-perso/drivers/char/keyboard.c
--- linux-2.6.24.1-orig/drivers/char/keyboard.c	2008-01-25 09:32:06.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/char/keyboard.c	2008-02-04 03:44:37.000000000 +0100
@@ -110,6 +110,7 @@
 const int NR_TYPES = ARRAY_SIZE(max_vals);
 
 struct kbd_struct kbd_table[MAX_NR_CONSOLES];
+EXPORT_SYMBOL_GPL(kbd_table);
 static struct kbd_struct *kbd = kbd_table;
 
 struct vt_spawn_console vt_spawn_con = {
@@ -260,6 +261,7 @@
 	} else
 		kd_nosound(0);
 }
+EXPORT_SYMBOL_GPL(kd_mksound);
 
 /*
  * Setting the keyboard rate.
diff -ur linux-2.6.24.1-orig/drivers/char/vt.c linux-2.6.24.1-perso/drivers/char/vt.c
--- linux-2.6.24.1-orig/drivers/char/vt.c	2008-01-25 09:32:06.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/char/vt.c	2008-02-03 22:27:04.000000000 +0100
@@ -3982,6 +3982,7 @@
 		c |= 0x100;
 	return c;
 }
+EXPORT_SYMBOL_GPL(screen_glyph);
 
 /* used by vcs - note the word offset */
 unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
diff -ur linux-2.6.24.1-orig/drivers/Kconfig linux-2.6.24.1-perso/drivers/Kconfig
--- linux-2.6.24.1-orig/drivers/Kconfig	2008-01-25 09:32:04.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/Kconfig	2008-02-20 21:52:54.000000000 +0100
@@ -95,4 +95,6 @@
 source "drivers/uio/Kconfig"
 
 source "drivers/virtio/Kconfig"
+
+source "drivers/accessibility/Kconfig"
 endmenu
diff -ur linux-2.6.24.1-orig/drivers/Makefile linux-2.6.24.1-perso/drivers/Makefile
--- linux-2.6.24.1-orig/drivers/Makefile	2008-01-25 09:32:04.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/Makefile	2008-02-20 21:55:38.000000000 +0100
@@ -5,6 +5,7 @@
 # Rewritten to use lists instead of if-statements.
 #
 
+obj-$(CONFIG_ACCESSIBILITY)	+= accessibility/
 obj-$(CONFIG_PCI)		+= pci/
 obj-$(CONFIG_PARISC)		+= parisc/
 obj-$(CONFIG_RAPIDIO)		+= rapidio/
diff -ur linux-2.6.24.1-orig/include/linux/console.h linux-2.6.24.1-perso/include/linux/console.h
--- linux-2.6.24.1-orig/include/linux/console.h	2008-01-25 09:32:44.000000000 +0100
+++ linux-2.6.24.1-perso/include/linux/console.h	2008-02-21 12:11:08.000000000 +0100
@@ -91,6 +91,7 @@
 #define CON_ENABLED	(4)
 #define CON_BOOT	(8)
 #define CON_ANYTIME	(16) /* Safe to call when cpu is offline */
+#define CON_BRL		(32) /* Used for a braille device */
 
 struct console {
 	char	name[16];
@@ -121,6 +122,9 @@
 extern void console_stop(struct console *);
 extern void console_start(struct console *);
 extern int is_console_locked(void);
+extern int braille_register_console(struct console *, int index,
+		char *console_options, char *braille_options);
+extern int braille_unregister_console(struct console *);
 
 extern int console_suspend_enabled;
 
diff -ur linux-2.6.24.1-orig/kernel/printk.c linux-2.6.24.1-perso/kernel/printk.c
--- linux-2.6.24.1-orig/kernel/printk.c	2008-02-20 21:47:09.000000000 +0100
+++ linux-2.6.24.1-perso/kernel/printk.c	2008-02-21 12:09:06.000000000 +0100
@@ -105,6 +105,7 @@
 	char	name[8];			/* Name of the driver	    */
 	int	index;				/* Minor dev. to use	    */
 	char	*options;			/* Options for the driver   */
+	char	*brl_options;			/* Options for braille driver */
 };
 
 #define MAX_CMDLINECONSOLES 8
@@ -766,15 +767,59 @@
 
 #endif
 
+static int __add_preferred_console(char *name, int idx, char *options,
+				   char *brl_options)
+{
+	struct console_cmdline *c;
+	int i;
+
+	/*
+	 *	See if this tty is not yet registered, and
+	 *	if we have a slot free.
+	 */
+	for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
+		if (strcmp(console_cmdline[i].name, name) == 0 &&
+			  console_cmdline[i].index == idx) {
+				if (!brl_options)
+					selected_console = i;
+				return 0;
+		}
+	if (i == MAX_CMDLINECONSOLES)
+		return -E2BIG;
+	if (!brl_options)
+		selected_console = i;
+	c = &console_cmdline[i];
+	memcpy(c->name, name, sizeof(c->name));
+	c->name[sizeof(c->name) - 1] = 0;
+	c->options = options;
+	c->brl_options = brl_options;
+	c->index = idx;
+	return 0;
+}
 /*
  * Set up a list of consoles.  Called from init/main.c
  */
 static int __init console_setup(char *str)
 {
 	char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */
-	char *s, *options;
+	char *s, *options, *brl_options = NULL;
 	int idx;
 
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+	if (!memcmp(str, "brl,", 4)) {
+		brl_options = "";
+		str += 4;
+	} else if (!memcmp(str, "brl=", 4)) {
+		brl_options = str + 4;
+		str = strchr(brl_options, ',');
+		if (!str) {
+			printk(KERN_ERR "need port name after brl=\n");
+			return 1;
+		}
+		*(str++) = 0;
+	}
+#endif
+
 	/*
 	 * Decode str into name, index, options.
 	 */
@@ -799,7 +844,7 @@
 	idx = simple_strtoul(s, NULL, 10);
 	*s = 0;
 
-	add_preferred_console(buf, idx, options);
+	__add_preferred_console(buf, idx, options, brl_options);
 	return 1;
 }
 __setup("console=", console_setup);
@@ -819,28 +864,7 @@
  */
 int add_preferred_console(char *name, int idx, char *options)
 {
-	struct console_cmdline *c;
-	int i;
-
-	/*
-	 *	See if this tty is not yet registered, and
-	 *	if we have a slot free.
-	 */
-	for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
-		if (strcmp(console_cmdline[i].name, name) == 0 &&
-			  console_cmdline[i].index == idx) {
-				selected_console = i;
-				return 0;
-		}
-	if (i == MAX_CMDLINECONSOLES)
-		return -E2BIG;
-	selected_console = i;
-	c = &console_cmdline[i];
-	memcpy(c->name, name, sizeof(c->name));
-	c->name[sizeof(c->name) - 1] = 0;
-	c->options = options;
-	c->index = idx;
-	return 0;
+	return __add_preferred_console(name, idx, options, NULL);
 }
 
 int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
@@ -1121,6 +1145,16 @@
 			continue;
 		if (console->index < 0)
 			console->index = console_cmdline[i].index;
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+		if (console_cmdline[i].brl_options) {
+			console->flags |= CON_BRL;
+			braille_register_console(console,
+					console_cmdline[i].index,
+					console_cmdline[i].options,
+					console_cmdline[i].brl_options);
+			return;
+		}
+#endif
 		if (console->setup &&
 		    console->setup(console, console_cmdline[i].options) != 0)
 			break;
@@ -1179,6 +1213,11 @@
         struct console *a, *b;
 	int res = 1;
 
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+	if (console->flags & CON_BRL)
+		return braille_unregister_console(console);
+#endif
+
 	acquire_console_sem();
 	if (console_drivers == console) {
 		console_drivers=console->next;
diff -urN linux-2.6.24.1-orig/drivers/accessibility/braille/braille_console.c linux-2.6.24.1-perso/drivers/accessibility/braille/braille_console.c
--- linux-2.6.24.1-orig/drivers/accessibility/braille/braille_console.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/accessibility/braille/braille_console.c	2008-02-21 12:27:41.000000000 +0100
@@ -0,0 +1,397 @@
+/*
+ * Minimalistic braille device kernel support.
+ *
+ * By default, shows console messages on the braille device.
+ * Pressing Insert switches to VC browsing.
+ *
+ *  Copyright (C) Samuel Thibault <samuel.thibault@ens-lyon.org>
+ *
+ * This program is free software ; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation ; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY ; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the program ; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/autoconf.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/console.h>
+#include <linux/notifier.h>
+
+#include <linux/selection.h>
+#include <linux/vt_kern.h>
+#include <linux/consolemap.h>
+
+#include <linux/keyboard.h>
+#include <linux/kbd_kern.h>
+#include <linux/input.h>
+
+MODULE_AUTHOR("samuel.thibault@ens-lyon.org");
+MODULE_DESCRIPTION("braille device");
+MODULE_LICENSE("GPL");
+
+/*
+ * Braille device support part.
+ */
+
+/* Emit various sounds */
+static int sound;
+module_param(sound, bool, 0);
+MODULE_PARM_DESC(sound, "emit sounds");
+
+static void beep(unsigned int freq)
+{
+	if (sound)
+		kd_mksound(freq, HZ/10);
+}
+
+/* mini console */
+#define WIDTH 40
+#define BRAILLE_KEY KEY_INSERT
+static u16 console_buf[WIDTH];
+static int console_cursor;
+
+/* mini view of VC */
+static int vc_x, vc_y, lastvc_x, lastvc_y;
+
+/* show console ? (or show VC) */
+static int console_show = 1;
+/* pending newline ? */
+static int console_newline = 1;
+static int lastVC = -1;
+
+static struct console *braille_co;
+
+/* Very VisioBraille-specific */
+static void braille_write(u16 *buf)
+{
+	static u16 lastwrite[WIDTH];
+	unsigned char data[1 + 1 + 2*WIDTH + 2 + 1], csum = 0, *c;
+	u16 out;
+	int i;
+
+	if (!braille_co)
+		return;
+
+	if (!memcmp(lastwrite, buf, WIDTH * sizeof(*buf)))
+		return;
+	memcpy(lastwrite, buf, WIDTH * sizeof(*buf));
+
+#define SOH 1
+#define STX 2
+#define ETX 2
+#define EOT 4
+#define ENQ 5
+	data[0] = STX;
+	data[1] = '>';
+	csum ^= '>';
+	c = &data[2];
+	for (i = 0; i < WIDTH; i++) {
+		out = buf[i];
+		if (out >= 0x100)
+			out = '?';
+		else if (out == 0x00)
+			out = ' ';
+		csum ^= out;
+		if (out <= 0x05) {
+			*c++ = SOH;
+			out |= 0x40;
+		}
+		*c++ = out;
+	}
+
+	if (csum <= 0x05) {
+		*c++ = SOH;
+		csum |= 0x40;
+	}
+	*c++ = csum;
+	*c++ = ETX;
+
+	braille_co->write(braille_co, data, c - data);
+}
+
+/* Follow the VC cursor*/
+static void vc_follow_cursor(struct vc_data *vc)
+{
+	vc_x = vc->vc_x - (vc->vc_x % WIDTH);
+	vc_y = vc->vc_y;
+	lastvc_x = vc->vc_x;
+	lastvc_y = vc->vc_y;
+}
+
+/* Maybe the VC cursor moved, if so follow it */
+static void vc_maybe_cursor_moved(struct vc_data *vc)
+{
+	if (vc->vc_x != lastvc_x || vc->vc_y != lastvc_y)
+		vc_follow_cursor(vc);
+}
+
+/* Show portion of VC at vc_x, vc_y */
+static void vc_refresh(struct vc_data *vc)
+{
+	u16 buf[WIDTH];
+	int i;
+
+	for (i = 0; i < WIDTH; i++) {
+		u16 glyph = screen_glyph(vc,
+				2 * (vc_x + i) + vc_y * vc->vc_size_row);
+		buf[i] = inverse_translate(vc, glyph, 1);
+	}
+	braille_write(buf);
+}
+
+/*
+ * Link to keyboard
+ */
+
+static int keyboard_notifier_call(struct notifier_block *blk,
+				  unsigned long code, void *_param)
+{
+	struct keyboard_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	int ret = NOTIFY_OK;
+
+	if (!param->down)
+		return ret;
+
+	switch (code) {
+	case KBD_KEYCODE:
+		if (console_show) {
+			if (param->value == BRAILLE_KEY) {
+				console_show = 0;
+				beep(880);
+				vc_maybe_cursor_moved(vc);
+				vc_refresh(vc);
+				ret = NOTIFY_STOP;
+			}
+		} else {
+			ret = NOTIFY_STOP;
+			switch (param->value) {
+			case KEY_INSERT:
+				beep(440);
+				console_show = 1;
+				lastVC = -1;
+				braille_write(console_buf);
+				break;
+			case KEY_LEFT:
+				if (vc_x > 0) {
+					vc_x -= WIDTH;
+					if (vc_x < 0)
+						vc_x = 0;
+				} else if (vc_y >= 1) {
+					beep(880);
+					vc_y--;
+					vc_x = vc->vc_cols-WIDTH;
+				} else
+					beep(220);
+				break;
+			case KEY_RIGHT:
+				if (vc_x + WIDTH < vc->vc_cols) {
+					vc_x += WIDTH;
+				} else if (vc_y + 1 < vc->vc_rows) {
+					beep(880);
+					vc_y++;
+					vc_x = 0;
+				} else
+					beep(220);
+				break;
+			case KEY_DOWN:
+				if (vc_y + 1 < vc->vc_rows)
+					vc_y++;
+				else
+					beep(220);
+				break;
+			case KEY_UP:
+				if (vc_y >= 1)
+					vc_y--;
+				else
+					beep(220);
+				break;
+			case KEY_HOME:
+				vc_follow_cursor(vc);
+				break;
+			case KEY_PAGEUP:
+				vc_x = 0;
+				vc_y = 0;
+				break;
+			case KEY_PAGEDOWN:
+				vc_x = 0;
+				vc_y = vc->vc_rows-1;
+				break;
+			default:
+				ret = NOTIFY_OK;
+				break;
+			}
+			if (ret == NOTIFY_STOP)
+				vc_refresh(vc);
+		}
+		break;
+	case KBD_POST_KEYSYM:
+	{
+		unsigned char type = KTYP(param->value) - 0xf0;
+		if (type == KT_SPEC) {
+			unsigned char val = KVAL(param->value);
+			int on_off = -1;
+
+			switch (val) {
+			case KVAL(K_CAPS):
+				on_off = vc_kbd_led(kbd_table + fg_console,
+						VC_CAPSLOCK);
+				break;
+			case KVAL(K_NUM):
+				on_off = vc_kbd_led(kbd_table + fg_console,
+						VC_NUMLOCK);
+				break;
+			case KVAL(K_HOLD):
+				on_off = vc_kbd_led(kbd_table + fg_console,
+						VC_SCROLLOCK);
+				break;
+			}
+			if (on_off == 1)
+				beep(880);
+			else if (on_off == 0)
+				beep(440);
+		}
+	}
+	case KBD_UNBOUND_KEYCODE:
+	case KBD_UNICODE:
+	case KBD_KEYSYM:
+		/* Unused */
+		break;
+	}
+	return ret;
+}
+
+static struct notifier_block keyboard_notifier_block = {
+	.notifier_call = keyboard_notifier_call,
+};
+
+static int vt_notifier_call(struct notifier_block *blk,
+			    unsigned long code, void *_param)
+{
+	struct vt_notifier_param *param = _param;
+	struct vc_data *vc = param->vc;
+	switch (code) {
+	case VT_ALLOCATE:
+		break;
+	case VT_DEALLOCATE:
+		break;
+	case VT_WRITE:
+	{
+		unsigned char c = param->c;
+		if (vc->vc_num != fg_console)
+			break;
+		switch (c) {
+		case '\b':
+		case 127:
+			if (console_cursor > 0) {
+				console_cursor--;
+				console_buf[console_cursor] = ' ';
+			}
+			break;
+		case '\n':
+		case '\v':
+		case '\f':
+		case '\r':
+			console_newline = 1;
+			break;
+		case '\t':
+			c = ' ';
+			/* Fallthrough */
+		default:
+			if (c < 32)
+				/* Ignore other control sequences */
+				break;
+			if (console_newline) {
+				memset(console_buf, 0, sizeof(console_buf));
+				console_cursor = 0;
+				console_newline = 0;
+			}
+			if (console_cursor == WIDTH)
+				memmove(console_buf, &console_buf[1],
+					(WIDTH-1) * sizeof(*console_buf));
+			else
+				console_cursor++;
+			console_buf[console_cursor-1] = c;
+			break;
+		}
+		if (console_show)
+			braille_write(console_buf);
+		else {
+			vc_maybe_cursor_moved(vc);
+			vc_refresh(vc);
+		}
+		break;
+	}
+	case VT_UPDATE:
+		/* Maybe a VT switch, flush */
+		if (console_show) {
+			if (vc->vc_num != lastVC) {
+				lastVC = vc->vc_num;
+				memset(console_buf, 0, sizeof(console_buf));
+				console_cursor = 0;
+				braille_write(console_buf);
+			}
+		} else {
+			vc_maybe_cursor_moved(vc);
+			vc_refresh(vc);
+		}
+		break;
+	}
+	return NOTIFY_OK;
+}
+
+static struct notifier_block vt_notifier_block = {
+	.notifier_call = vt_notifier_call,
+};
+
+/*
+ * Called from printk.c when console=brl is given
+ */
+
+int braille_register_console(struct console *console, int index,
+		char *console_options, char *braille_options)
+{
+	int ret;
+	if (!console_options)
+		/* Only support VisioBraille for now */
+		console_options = "57600o8";
+	if (braille_co)
+		return -ENODEV;
+	if (console->setup) {
+		ret = console->setup(console, console_options);
+		if (ret != 0)
+			return ret;
+	}
+	console->flags |= CON_ENABLED;
+	console->index = index;
+	braille_co = console;
+	return 0;
+}
+
+int braille_unregister_console(struct console *console)
+{
+	if (braille_co != console)
+		return -EINVAL;
+	braille_co = NULL;
+	return 0;
+}
+
+static int __init braille_init(void)
+{
+	register_keyboard_notifier(&keyboard_notifier_block);
+	register_vt_notifier(&vt_notifier_block);
+	return 0;
+}
+
+console_initcall(braille_init);
diff -urN linux-2.6.24.1-orig/drivers/accessibility/Kconfig linux-2.6.24.1-perso/drivers/accessibility/Kconfig
--- linux-2.6.24.1-orig/drivers/accessibility/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/accessibility/Kconfig	2008-02-20 21:54:26.000000000 +0100
@@ -0,0 +1,22 @@
+menuconfig ACCESSIBILITY
+	bool "Accessibility support"
+	---help---
+	  Enable a submenu where accessibility items may be enabled.
+
+	  If unsure, say N.
+
+if ACCESSIBILITY
+config A11Y_BRAILLE_CONSOLE
+	bool "Console on braille device"
+	depends on SERIAL_CORE_CONSOLE
+	---help---
+	  Enables console output on a braille device connected to a 8250
+	  serial port. For now only the VisioBraille device is supported.
+
+	  To actually enable it, you need to pass option
+	  console=brl,ttyS0
+	  to the kernel. Options are the same as for serial console.
+
+	  If unsure, say N.
+
+endif # ACCESSIBILITY
diff -urN linux-2.6.24.1-orig/drivers/accessibility/Makefile linux-2.6.24.1-perso/drivers/accessibility/Makefile
--- linux-2.6.24.1-orig/drivers/accessibility/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/accessibility/Makefile	2008-02-04 02:42:32.000000000 +0100
@@ -0,0 +1 @@
+obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille/braille_console.o

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

* Re: [PATCH2] Basic braille screen reader support
  2008-02-22  0:28       ` [PATCH2] " Samuel Thibault
@ 2008-02-23  8:04         ` Andrew Morton
  2008-02-23 13:10           ` Samuel Thibault
  0 siblings, 1 reply; 22+ messages in thread
From: Andrew Morton @ 2008-02-23  8:04 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: linux-kernel, Dmitry Torokhov, Jiri Kosina

On Fri, 22 Feb 2008 01:28:22 +0100 Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:

> Samuel Thibault, le Wed 06 Feb 2008 02:04:23 +0000, a __crit :
> > Andrew Morton, le Tue 05 Feb 2008 16:58:53 -0800, a __crit :
> > > On Tue, 5 Feb 2008 22:00:54 +0000
> > > Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:
> > > > +	serial8250_console.write(braille_co, data, c - data);
> > > 
> > > hm.  Is it appropriate that this driver wire itself directly into
> > > serial8250?
> > > What if the screen reader is attached to some other sort of
> > > uart, or a terminal server, or...
> > 
> > Indeed that's an issue.  For now, there is no clean way to attach to the
> > early serial drivers, that's why I chose 8250,
> 
> In the patch below, I hook into kernel/printk.c's console= parser, which
> now gives me attachment to any kind of console.
> 
> 
> 
> 
> This adds a minimalistic braille screen reader support.
> This is meant to be used by blind people e.g. on boot failures or when /
> cannot be mounted etc and thus the userland screen readers can not work.
> 

Sorry, but I can't say that this is my favoritest ever patch.  But I can't
immediately think of any way of significantly improving it :( Jiri and
Dmitry appear to be hiding.

> +++ linux-2.6.24.1-perso/kernel/printk.c	2008-02-21 12:09:06.000000000 +0100
> @@ -105,6 +105,7 @@

Please use `diff -p'

>  	char	name[8];			/* Name of the driver	    */
>  	int	index;				/* Minor dev. to use	    */
>  	char	*options;			/* Options for the driver   */
> +	char	*brl_options;			/* Options for braille driver */
>  };

Should this depend on CONFIG_A11Y_BRAILLE_CONSOLE or whatever?

>  #define MAX_CMDLINECONSOLES 8
> @@ -766,15 +767,59 @@
>  
>  #endif
>  
> +static int __add_preferred_console(char *name, int idx, char *options,
> +				   char *brl_options)
> +{
> +	struct console_cmdline *c;
> +	int i;
> +
> +	/*
> +	 *	See if this tty is not yet registered, and
> +	 *	if we have a slot free.
> +	 */
> +	for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
> +		if (strcmp(console_cmdline[i].name, name) == 0 &&
> +			  console_cmdline[i].index == idx) {
> +				if (!brl_options)
> +					selected_console = i;
> +				return 0;
> +		}
> +	if (i == MAX_CMDLINECONSOLES)
> +		return -E2BIG;

Does the array of consles have any locking here?

> +	if (!brl_options)
> +		selected_console = i;
> +	c = &console_cmdline[i];
> +	memcpy(c->name, name, sizeof(c->name));
> +	c->name[sizeof(c->name) - 1] = 0;

strlcpy()?

> +	c->options = options;
> +	c->brl_options = brl_options;
> +	c->index = idx;
> +	return 0;
> +}
>  /*
>   * Set up a list of consoles.  Called from init/main.c
>   */
>  static int __init console_setup(char *str)
>  {
>  	char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */
> -	char *s, *options;
> +	char *s, *options, *brl_options = NULL;
>  	int idx;
>  
> +#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
> +	if (!memcmp(str, "brl,", 4)) {
> +		brl_options = "";
> +		str += 4;
> +	} else if (!memcmp(str, "brl=", 4)) {
> +		brl_options = str + 4;
> +		str = strchr(brl_options, ',');
> +		if (!str) {
> +			printk(KERN_ERR "need port name after brl=\n");
> +			return 1;
> +		}
> +		*(str++) = 0;
> +	}
> +#endif

Update Documentation/kernel-parameters.txt, please.  And additional
documentation would be nice, if justified?

>  	/*
>  	 * Decode str into name, index, options.
>  	 */
> @@ -799,7 +844,7 @@
>  	idx = simple_strtoul(s, NULL, 10);
>  	*s = 0;
>  
> -	add_preferred_console(buf, idx, options);
> +	__add_preferred_console(buf, idx, options, brl_options);
>  	return 1;
>  }
>
> ...
>
> +static void beep(unsigned int freq)
> +{
> +	if (sound)
> +		kd_mksound(freq, HZ/10);
> +}

hm, do we have enough Kconfig dependencies here to ensure that kd_mksound()
is always available?



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

* Re: [PATCH2] Basic braille screen reader support
  2008-02-23  8:04         ` Andrew Morton
@ 2008-02-23 13:10           ` Samuel Thibault
  2008-02-23 13:15             ` [PATCH] Braille screen reader fixes Samuel Thibault
                               ` (2 more replies)
  0 siblings, 3 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-02-23 13:10 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel, Dmitry Torokhov, Jiri Kosina

Andrew Morton, le Sat 23 Feb 2008 00:04:10 -0800, a écrit :
> > +++ linux-2.6.24.1-perso/kernel/printk.c	2008-02-21 12:09:06.000000000 +0100
> > @@ -105,6 +105,7 @@
> 
> Please use `diff -p'

Argl, that's editdiff's fault.  We need to fix it to keep the -p
comments.

> >  	char	name[8];			/* Name of the driver	    */
> >  	int	index;				/* Minor dev. to use	    */
> >  	char	*options;			/* Options for the driver   */
> > +	char	*brl_options;			/* Options for braille driver */
> >  };
> 
> Should this depend on CONFIG_A11Y_BRAILLE_CONSOLE or whatever?

It can, indeed.  It just makes the code a little more clumsy to save 32
or 64 bytes.

> > +	for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
> > +		if (strcmp(console_cmdline[i].name, name) == 0 &&
> > +			  console_cmdline[i].index == idx) {
> > +				if (!brl_options)
> > +					selected_console = i;
> > +				return 0;
> > +		}
> > +	if (i == MAX_CMDLINECONSOLES)
> > +		return -E2BIG;
> 
> Does the array of consles have any locking here?

Well, that's actually just the original code that I moved a bit earlier,
so the code path is not changed.

> > +	if (!brl_options)
> > +		selected_console = i;
> > +	c = &console_cmdline[i];
> > +	memcpy(c->name, name, sizeof(c->name));
> > +	c->name[sizeof(c->name) - 1] = 0;
> 
> strlcpy()?

Again, that's the original code, unmodified, but we can put an strlcpy
here yes.

> > +static void beep(unsigned int freq)
> > +{
> > +	if (sound)
> > +		kd_mksound(freq, HZ/10);
> > +}
> 
> hm, do we have enough Kconfig dependencies here to ensure that kd_mksound()
> is always available?

Ah, CONFIG_VT is needed indeed.

I'll address those in replies to this mail.

Samuel

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

* [PATCH] Braille screen reader fixes
  2008-02-23 13:10           ` Samuel Thibault
@ 2008-02-23 13:15             ` Samuel Thibault
  2008-02-23 13:17             ` [PATCH] Braille screen reader documentation Samuel Thibault
  2008-04-24  0:39             ` [PATCH2] Basic braille screen reader support Samuel Thibault
  2 siblings, 0 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-02-23 13:15 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel, Dmitry Torokhov, Jiri Kosina

Braille screen reader fixes:
- console_cmdline's brl_options field is only required when braille
console support is enabled.
- Use strlcpy to copy the console name.
- braille console support depends on VT support.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

--- linux-2.6.24.1-orig/kernel/printk.c	2008-02-21 12:09:06.000000000 +0100
+++ linux-2.6.24.1-perso/kernel/printk.c	2008-02-23 12:57:42.000000000 +0100
@@ -105,7 +105,9 @@ struct console_cmdline
 	char	name[8];			/* Name of the driver	    */
 	int	index;				/* Minor dev. to use	    */
 	char	*options;			/* Options for the driver   */
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
 	char	*brl_options;			/* Options for braille driver */
+#endif
 };
 
 #define MAX_CMDLINECONSOLES 8
@@ -789,10 +791,11 @@ static int __add_preferred_console
 	if (!brl_options)
 		selected_console = i;
 	c = &console_cmdline[i];
-	memcpy(c->name, name, sizeof(c->name));
-	c->name[sizeof(c->name) - 1] = 0;
+	strlcpy(c->name, name, sizeof(c->name));
 	c->options = options;
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
 	c->brl_options = brl_options;
+#endif
 	c->index = idx;
 	return 0;
 }
--- linux-2.6.24.1-orig/drivers/accessibility/Kconfig	2008-02-23 13:32:38.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/accessibility/Kconfig	2008-02-23 13:23:21.000000000 +0100
@@ -8,6 +8,7 @@ menuconfig ACCESSIBILITY
 if ACCESSIBILITY
 config A11Y_BRAILLE_CONSOLE
 	bool "Console on braille device"
+	depends on VT
 	depends on SERIAL_CORE_CONSOLE
 	---help---
 	  Enables console output on a braille device connected to a 8250

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

* [PATCH] Braille screen reader documentation
  2008-02-23 13:10           ` Samuel Thibault
  2008-02-23 13:15             ` [PATCH] Braille screen reader fixes Samuel Thibault
@ 2008-02-23 13:17             ` Samuel Thibault
  2008-04-24  0:39             ` [PATCH2] Basic braille screen reader support Samuel Thibault
  2 siblings, 0 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-02-23 13:17 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel, Dmitry Torokhov, Jiri Kosina

Document the console=brl option and the usage of the braille screen
reader.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

--- linux-2.6.24.1-orig/Documentation/kernel-parameters.txt	2008-01-25 09:31:45.000000000 +0100
+++ linux-2.6.24.1-perso/Documentation/kernel-parameters.txt	2008-02-23 13:21:27.000000000 +0100
@@ -463,6 +463,11 @@
 			switching to the matching ttyS device later.  The
 			options are the same as for ttyS, above.
 
+                If the device connected to the port is not a TTY but a braille
+                device, prepend "brl," before the device type, for instance
+			console=brl,ttyS0
+		For now, only VisioBraille is supported.
+
 	earlycon=	[KNL] Output early console device and options.
 		uart[8250],io,<addr>[,options]
 		uart[8250],mmio,<addr>[,options]
--- linux-2.6.24.1-orig/Documentation/braille-console.txt	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.24.1-perso/Documentation/braille-console.txt	2008-02-23 13:20:31.000000000 +0100
@@ -0,0 +1,34 @@
+                       Linux Braille Console
+
+To get early boot messages on a braille device (before userspace screen
+readers can start), you first need to compile the support for the usual serial
+console (see serial-console.txt), and for braille device (in Device Drivers -
+Accessibility).
+
+Then you need to specify a console=brl, option on the kernel command line, the
+format is:
+
+	console=brl,serial_options...
+
+where serial_options... are the same as described in serial-console.txt
+
+So for instance you can use console=brl,ttyS0 if the braille device is connected
+to the first serial port, and console=brl,ttyS0,115200 to override the baud rate
+to 115200, etc.
+
+By default, the braille device will just show the last kernel message (console
+mode).  To review previous messages, press the Insert key to switch to the VT
+review mode.  In review mode, the arrow keys permit to browse in the VT content,
+page up/down keys go at the top/bottom of the screen, and the home key goes back
+to the cursor, hence providing very basic screen reviewing facility.
+
+Sound feedback can be obtained by adding the braille_console.sound=1 kernel
+parameter.
+
+For simplicity, only one braille console can be enabled, other uses of
+console=brl,... will be discarded.  Also note that it does not interfere with
+the console selection mecanism described in serial-console.txt
+
+For now, only the VisioBraille device is supported.
+
+Samuel Thibault <samuel.thibault@ens-lyon.org>

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

* [mmotm build error] Re: [PATCH,RESEND] Basic braille screen reader support
  2008-02-05 22:00 ` [PATCH,RESEND] " Samuel Thibault
  2008-02-06  0:58   ` Andrew Morton
@ 2008-03-19 18:57   ` Randy Dunlap
  2008-03-20  2:07     ` Samuel Thibault
  1 sibling, 1 reply; 22+ messages in thread
From: Randy Dunlap @ 2008-03-19 18:57 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: torvalds, linux-kernel

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

when O=dir is used in make:

  CC      drivers/accessibility/braille/braille_console.o
Assembler messages:
Fatal error: can't create drivers/accessibility/braille/braille_console.o: No such file or directory
  CC      crypto/aes_generic.o
make[3]: *** [drivers/accessibility/braille/braille_console.o] Error 2
make[2]: *** [drivers/accessibility] Error 2
make[1]: *** [drivers] Error 2

---
~Randy


[-- Attachment #2: config-rand9 --]
[-- Type: application/octet-stream, Size: 39421 bytes --]

#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.25-rc6-mm1
# Wed Mar 19 10:46:29 2008
#
CONFIG_64BIT=y
# CONFIG_X86_32 is not set
CONFIG_X86_64=y
CONFIG_X86=y
# CONFIG_GENERIC_LOCKBREAK is not set
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_FAST_CMPXCHG_LOCAL=y
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_HWEIGHT=y
# CONFIG_GENERIC_GPIO is not set
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ZONE_DMA32=y
CONFIG_ARCH_POPULATES_NODE_MAP=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_AOUT=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_X86_TRAMPOLINE=y
# CONFIG_KTIME_SCALAR is not set
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"

#
# General setup
#
# CONFIG_EXPERIMENTAL is not set
CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
# CONFIG_SWAP is not set
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
# CONFIG_BSD_PROCESS_ACCT is not set
# CONFIG_TASKSTATS is not set
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_TREE=y
CONFIG_IKCONFIG=y
# CONFIG_IKCONFIG_PROC is not set
CONFIG_LOG_BUF_SHIFT=17
# CONFIG_CGROUPS is not set
CONFIG_GROUP_SCHED=y
# CONFIG_FAIR_GROUP_SCHED is not set
CONFIG_USER_SCHED=y
# CONFIG_CGROUP_SCHED is not set
# CONFIG_SYSFS_DEPRECATED_V2 is not set
# CONFIG_RELAY is not set
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
# CONFIG_BLK_DEV_INITRD is not set
CONFIG_SYSCTL=y
# CONFIG_EMBEDDED is not set
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_EXTRA_PASS=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
# CONFIG_COMPAT_BRK is not set
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_ANON_INODES=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_SLUB_DEBUG=y
# CONFIG_SLAB is not set
CONFIG_SLUB=y
# CONFIG_SLOB is not set
# CONFIG_PROFILING is not set
CONFIG_MARKERS=y
CONFIG_HAVE_OPROFILE=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
# CONFIG_MODULES is not set
CONFIG_BLOCK=y
# CONFIG_BLK_DEV_IO_TRACE is not set
CONFIG_BLOCK_COMPAT=y

#
# IO Schedulers
#
# CONFIG_IOSCHED_CFQ is not set
CONFIG_IOSCHED_AS=y
# CONFIG_IOSCHED_DEADLINE is not set
CONFIG_IOSCHED_NOOP=y
# CONFIG_DEFAULT_CFQ is not set
CONFIG_DEFAULT_AS=y
# CONFIG_DEFAULT_DEADLINE is not set
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="anticipatory"
CONFIG_CLASSIC_RCU=y

#
# Processor type and features
#
# CONFIG_TICK_ONESHOT is not set
# CONFIG_NO_HZ is not set
# CONFIG_HIGH_RES_TIMERS is not set
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
# CONFIG_SMP is not set
CONFIG_X86_PC=y
# CONFIG_X86_ELAN is not set
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_NUMAQ is not set
# CONFIG_X86_SUMMIT is not set
# CONFIG_X86_BIGSMP is not set
# CONFIG_X86_VISWS is not set
# CONFIG_X86_GENERICARCH is not set
# CONFIG_X86_ES7000 is not set
# CONFIG_X86_RDC321X is not set
# CONFIG_X86_VSMP is not set
CONFIG_PARAVIRT_GUEST=y
CONFIG_KVM_CLOCK=y
CONFIG_KVM_GUEST=y
CONFIG_PARAVIRT=y
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not set
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MGEODEGX1 is not set
# CONFIG_MGEODE_LX is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
# CONFIG_MVIAC7 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_L1_CACHE_BYTES=128
CONFIG_X86_INTERNODE_CACHE_BYTES=128
CONFIG_X86_CMPXCHG=y
CONFIG_X86_L1_CACHE_SHIFT=7
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_TSC=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_HPET_TIMER=y
CONFIG_DMI=y
CONFIG_GART_IOMMU=y
CONFIG_IOMMU_HELPER=y
CONFIG_SWIOTLB=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
# CONFIG_X86_MCE is not set
# CONFIG_I8K is not set
# CONFIG_MICROCODE is not set
CONFIG_X86_MSR=y
# CONFIG_X86_CPUID is not set
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_MEMORY_PROBE=y
CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set
# CONFIG_DISCONTIGMEM_MANUAL is not set
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_HAVE_MEMORY_PRESENT=y
# CONFIG_SPARSEMEM_STATIC is not set
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTPLUG_SPARSE=y
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_RESOURCES_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MTRR=y
# CONFIG_EFI is not set
CONFIG_SECCOMP=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
# CONFIG_SCHED_HRTICK is not set
# CONFIG_KEXEC is not set
CONFIG_PHYSICAL_START=0x200000
CONFIG_PHYSICAL_ALIGN=0x200000
CONFIG_COMPAT_VDSO=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y

#
# Power management options
#
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_VERBOSE is not set
CONFIG_PM_SLEEP=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
# CONFIG_ACPI_PROCFS is not set
CONFIG_ACPI_PROCFS_POWER=y
CONFIG_ACPI_SYSFS_POWER=y
# CONFIG_ACPI_PROC_EVENT is not set
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
# CONFIG_ACPI_BUTTON is not set
CONFIG_ACPI_VIDEO=y
# CONFIG_ACPI_FAN is not set
CONFIG_ACPI_DOCK=y
# CONFIG_ACPI_PROCESSOR is not set
# CONFIG_ACPI_ASUS is not set
# CONFIG_ACPI_TOSHIBA is not set
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
CONFIG_ACPI_DEBUG=y
# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_SYSTEM=y
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_HOTPLUG_MEMORY=y
# CONFIG_ACPI_SBS is not set

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
# CONFIG_CPU_FREQ_DEBUG is not set
# CONFIG_CPU_FREQ_STAT is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y

#
# CPUFreq processor drivers
#
# CONFIG_X86_POWERNOW_K8 is not set
CONFIG_X86_P4_CLOCKMOD=y

#
# shared options
#
CONFIG_X86_SPEEDSTEP_LIB=y
# CONFIG_CPU_IDLE is not set

#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCIEPORTBUS=y
# CONFIG_PCIEAER is not set
CONFIG_ARCH_SUPPORTS_MSI=y
# CONFIG_PCI_MSI is not set
# CONFIG_PCI_LEGACY is not set
CONFIG_PCI_DEBUG=y
CONFIG_HT_IRQ=y
CONFIG_ISA_DMA_API=y
CONFIG_K8_NB=y
# CONFIG_PCCARD is not set
# CONFIG_HOTPLUG_PCI is not set

#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
CONFIG_IA32_EMULATION=y
CONFIG_IA32_AOUT=y
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y

#
# Networking
#
CONFIG_NET=y

#
# Networking options
#
# CONFIG_PACKET is not set
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
# CONFIG_INET is not set
CONFIG_NETWORK_SECMARK=y
# CONFIG_NETFILTER is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
CONFIG_LLC=y
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
CONFIG_ATALK=y
# CONFIG_DEV_APPLETALK is not set
# CONFIG_NET_SCHED is not set

#
# Network testing
#
CONFIG_NET_PKTGEN=y
CONFIG_HAMRADIO=y

#
# Packet Radio protocols
#
# CONFIG_AX25 is not set
CONFIG_CAN=y
# CONFIG_CAN_RAW is not set
CONFIG_CAN_BCM=y

#
# CAN Device Drivers
#
CONFIG_CAN_VCAN=y
# CONFIG_CAN_DEBUG_DEVICES is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set

#
# Wireless
#
# CONFIG_CFG80211 is not set
CONFIG_WIRELESS_EXT=y
# CONFIG_MAC80211 is not set
CONFIG_IEEE80211=y
# CONFIG_IEEE80211_DEBUG is not set
CONFIG_IEEE80211_CRYPT_WEP=y
# CONFIG_IEEE80211_CRYPT_CCMP is not set
CONFIG_IEEE80211_CRYPT_TKIP=y
# CONFIG_RFKILL is not set

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_STANDALONE=y
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
CONFIG_FW_LOADER=y
# CONFIG_DEBUG_DRIVER is not set
CONFIG_DEBUG_DEVRES=y
# CONFIG_SYS_HYPERVISOR is not set
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
CONFIG_MTD_CONCAT=y
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_CMDLINE_PARTS is not set

#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLKDEVS=y
# CONFIG_MTD_BLOCK is not set
CONFIG_MTD_BLOCK_RO=y
CONFIG_FTL=y
CONFIG_NFTL=y
# CONFIG_NFTL_RW is not set
# CONFIG_INFTL is not set
# CONFIG_RFD_FTL is not set
# CONFIG_SSFDC is not set
CONFIG_MTD_OOPS=y

#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
CONFIG_MTD_JEDECPROBE=y
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
# CONFIG_MTD_CFI_NOSWAP is not set
CONFIG_MTD_CFI_BE_BYTE_SWAP=y
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_GEOMETRY=y
CONFIG_MTD_MAP_BANK_WIDTH_1=y
# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
CONFIG_MTD_MAP_BANK_WIDTH_32=y
# CONFIG_MTD_CFI_I1 is not set
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
CONFIG_MTD_CFI_I8=y
CONFIG_MTD_OTP=y
CONFIG_MTD_CFI_INTELEXT=y
CONFIG_MTD_CFI_AMDSTD=y
# CONFIG_MTD_CFI_STAA is not set
CONFIG_MTD_CFI_UTIL=y
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
CONFIG_MTD_ABSENT=y

#
# Mapping drivers for chip access
#
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
# CONFIG_MTD_PHYSMAP is not set
CONFIG_MTD_SC520CDP=y
CONFIG_MTD_NETSC520=y
CONFIG_MTD_TS5500=y
# CONFIG_MTD_AMD76XROM is not set
# CONFIG_MTD_ICHXROM is not set
# CONFIG_MTD_ESB2ROM is not set
# CONFIG_MTD_CK804XROM is not set
CONFIG_MTD_SCB2_FLASH=y
CONFIG_MTD_NETtel=y
# CONFIG_MTD_DILNETPC is not set
# CONFIG_MTD_L440GX is not set
CONFIG_MTD_INTEL_VR_NOR=y
# CONFIG_MTD_PLATRAM is not set

#
# Self-contained MTD device drivers
#
CONFIG_MTD_PMC551=y
CONFIG_MTD_PMC551_BUGFIX=y
CONFIG_MTD_PMC551_DEBUG=y
CONFIG_MTD_SLRAM=y
# CONFIG_MTD_PHRAM is not set
CONFIG_MTD_MTDRAM=y
CONFIG_MTDRAM_TOTAL_SIZE=4096
CONFIG_MTDRAM_ERASE_SIZE=128
CONFIG_MTDRAM_ABS_POS=0x0
CONFIG_MTD_BLOCK2MTD=y

#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOC2001PLUS is not set
# CONFIG_MTD_NAND is not set
CONFIG_MTD_ONENAND=y
# CONFIG_MTD_ONENAND_VERIFY_WRITE is not set
CONFIG_MTD_ONENAND_OTP=y
CONFIG_MTD_ONENAND_2X_PROGRAM=y
# CONFIG_MTD_ONENAND_SIM is not set

#
# UBI - Unsorted block images
#
# CONFIG_MTD_UBI is not set
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y
CONFIG_PARPORT_SERIAL=y
# CONFIG_PARPORT_GSC is not set
# CONFIG_PARPORT_AX88796 is not set
CONFIG_PARPORT_1284=y
CONFIG_PNP=y
# CONFIG_PNP_DEBUG is not set

#
# Protocols
#
CONFIG_PNPACPI=y
# CONFIG_BLK_DEV is not set
CONFIG_MISC_DEVICES=y
# CONFIG_PHANTOM is not set
CONFIG_EEPROM_93CX6=y
# CONFIG_SGI_IOC4 is not set
CONFIG_FUJITSU_LAPTOP=y
# CONFIG_MSI_LAPTOP is not set
# CONFIG_COMPAL_LAPTOP is not set
# CONFIG_SONY_LAPTOP is not set
CONFIG_THINKPAD_ACPI=y
CONFIG_THINKPAD_ACPI_DEBUG=y
# CONFIG_THINKPAD_ACPI_BAY is not set
CONFIG_THINKPAD_ACPI_VIDEO=y
# CONFIG_THINKPAD_ACPI_HOTKEY_POLL is not set
CONFIG_ENCLOSURE_SERVICES=y
CONFIG_HAVE_IDE=y
CONFIG_IDE=y
# CONFIG_BLK_DEV_IDE is not set
# CONFIG_BLK_DEV_HD_ONLY is not set
# CONFIG_BLK_DEV_HD is not set

#
# SCSI device support
#
CONFIG_RAID_ATTRS=y
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
CONFIG_SCSI_TGT=y
CONFIG_SCSI_NETLINK=y
# CONFIG_SCSI_PROC_FS is not set

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
CONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not set
CONFIG_CHR_DEV_SG=y
# CONFIG_CHR_DEV_SCH is not set
# CONFIG_SCSI_ENCLOSURE is not set

#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
# CONFIG_SCSI_MULTI_LUN is not set
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
# CONFIG_SCSI_SCAN_ASYNC is not set

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_FC_ATTRS=y
# CONFIG_SCSI_FC_TGT_ATTRS is not set
CONFIG_SCSI_ISCSI_ATTRS=y
CONFIG_SCSI_SAS_ATTRS=y
CONFIG_SCSI_SAS_LIBSAS=y
# CONFIG_SCSI_SAS_ATA is not set
CONFIG_SCSI_SAS_HOST_SMP=y
# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set
CONFIG_SCSI_SRP_ATTRS=y
# CONFIG_SCSI_SRP_TGT_ATTRS is not set
CONFIG_SCSI_LOWLEVEL=y
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
CONFIG_SCSI_3W_9XXX=y
CONFIG_SCSI_ACARD=y
# CONFIG_SCSI_AACRAID is not set
CONFIG_SCSI_AIC7XXX=y
CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
CONFIG_AIC7XXX_RESET_DELAY_MS=5000
# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
CONFIG_AIC7XXX_DEBUG_MASK=0
# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
CONFIG_SCSI_AIC94XX=y
CONFIG_AIC94XX_DEBUG=y
CONFIG_SCSI_ADVANSYS=y
CONFIG_SCSI_ARCMSR=y
CONFIG_MEGARAID_NEWGEN=y
CONFIG_MEGARAID_MM=y
# CONFIG_MEGARAID_MAILBOX is not set
# CONFIG_MEGARAID_LEGACY is not set
CONFIG_MEGARAID_SAS=y
# CONFIG_SCSI_HPTIOP is not set
CONFIG_SCSI_BUSLOGIC=y
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
CONFIG_SCSI_FUTURE_DOMAIN=y
CONFIG_SCSI_GDTH=y
CONFIG_SCSI_IPS=y
CONFIG_SCSI_INITIO=y
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_PPA is not set
CONFIG_SCSI_IMM=y
# CONFIG_SCSI_IZIP_EPP16 is not set
# CONFIG_SCSI_IZIP_SLOW_CTR is not set
# CONFIG_SCSI_MVSAS is not set
# CONFIG_SCSI_STEX is not set
CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
CONFIG_SCSI_SYM53C8XX_MMIO=y
CONFIG_SCSI_IPR=y
CONFIG_SCSI_IPR_TRACE=y
CONFIG_SCSI_IPR_DUMP=y
CONFIG_SCSI_QLOGIC_1280=y
CONFIG_SCSI_QLA_FC=y
CONFIG_SCSI_QLA_ISCSI=y
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_DEBUG is not set
CONFIG_SCSI_SRP=y
CONFIG_ATA=y
# CONFIG_ATA_NONSTANDARD is not set
CONFIG_ATA_ACPI=y
CONFIG_SATA_AHCI=y
# CONFIG_SATA_SVW is not set
CONFIG_ATA_PIIX=y
# CONFIG_SATA_NV is not set
# CONFIG_PDC_ADMA is not set
# CONFIG_SATA_QSTOR is not set
CONFIG_SATA_PROMISE=y
# CONFIG_SATA_SIL is not set
CONFIG_SATA_SIL24=y
CONFIG_SATA_SIS=y
CONFIG_SATA_ULI=y
# CONFIG_SATA_VIA is not set
CONFIG_SATA_VITESSE=y
CONFIG_PATA_ACPI=y
# CONFIG_PATA_AMD is not set
CONFIG_PATA_ARTOP=y
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_CMD64X is not set
# CONFIG_PATA_CS5520 is not set
CONFIG_PATA_EFAR=y
# CONFIG_ATA_GENERIC is not set
CONFIG_PATA_HPT366=y
# CONFIG_PATA_HPT3X3 is not set
# CONFIG_PATA_IT821X is not set
CONFIG_PATA_JMICRON=y
# CONFIG_PATA_TRIFLEX is not set
CONFIG_PATA_MARVELL=y
# CONFIG_PATA_MPIIX is not set
# CONFIG_PATA_OLDPIIX is not set
# CONFIG_PATA_NETCELL is not set
CONFIG_PATA_RZ1000=y
CONFIG_PATA_SERVERWORKS=y
# CONFIG_PATA_PDC2027X is not set
# CONFIG_PATA_SIL680 is not set
CONFIG_PATA_SIS=y
# CONFIG_PATA_VIA is not set
CONFIG_PATA_WINBOND=y
# CONFIG_MD is not set
CONFIG_FUSION=y
CONFIG_FUSION_SPI=y
CONFIG_FUSION_FC=y
CONFIG_FUSION_SAS=y
CONFIG_FUSION_MAX_SGE=128
CONFIG_FUSION_CTL=y
CONFIG_FUSION_LAN=y
# CONFIG_FUSION_LOGGING is not set

#
# IEEE 1394 (FireWire) support
#

#
# An alternative FireWire stack is available with EXPERIMENTAL=y
#
# CONFIG_IEEE1394 is not set
CONFIG_I2O=y
CONFIG_I2O_LCT_NOTIFY_ON_CHANGES=y
# CONFIG_I2O_EXT_ADAPTEC is not set
CONFIG_I2O_CONFIG=y
CONFIG_I2O_CONFIG_OLD_IOCTL=y
# CONFIG_I2O_BUS is not set
CONFIG_I2O_BLOCK=y
# CONFIG_I2O_SCSI is not set
CONFIG_I2O_PROC=y
CONFIG_MACINTOSH_DRIVERS=y
# CONFIG_MAC_EMUMOUSEBTN is not set
CONFIG_NETDEVICES=y
CONFIG_NETDEVICES_MULTIQUEUE=y
# CONFIG_DUMMY is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_VETH is not set
CONFIG_NET_SB1000=y
# CONFIG_ARCNET is not set
# CONFIG_PHYLIB is not set
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
CONFIG_HAPPYMEAL=y
# CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not set
# CONFIG_NET_VENDOR_3COM is not set
CONFIG_NET_TULIP=y
# CONFIG_TULIP is not set
CONFIG_DE4X5=y
CONFIG_WINBOND_840=y
CONFIG_DM9102=y
CONFIG_ULI526X=y
# CONFIG_HP100 is not set
# CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
# CONFIG_NET_PCI is not set
# CONFIG_B44 is not set
# CONFIG_NET_POCKET is not set
# CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set
# CONFIG_TR is not set

#
# Wireless LAN
#
# CONFIG_WLAN_PRE80211 is not set
CONFIG_WLAN_80211=y
CONFIG_IPW2100=y
CONFIG_IPW2100_MONITOR=y
# CONFIG_IPW2100_DEBUG is not set
CONFIG_IPW2200=y
CONFIG_IPW2200_MONITOR=y
# CONFIG_IPW2200_RADIOTAP is not set
# CONFIG_IPW2200_PROMISCUOUS is not set
# CONFIG_IPW2200_DEBUG is not set
CONFIG_LIBERTAS=y
CONFIG_LIBERTAS_USB=y
CONFIG_LIBERTAS_SDIO=y
CONFIG_LIBERTAS_DEBUG=y
CONFIG_AIRO=y
# CONFIG_HERMES is not set
CONFIG_ATMEL=y
# CONFIG_PCI_ATMEL is not set
CONFIG_USB_ZD1201=y
CONFIG_HOSTAP=y
CONFIG_HOSTAP_FIRMWARE=y
CONFIG_HOSTAP_FIRMWARE_NVRAM=y
# CONFIG_HOSTAP_PLX is not set
# CONFIG_HOSTAP_PCI is not set

#
# USB Network Adapters
#
# CONFIG_USB_KAWETH is not set
CONFIG_USB_PEGASUS=y
CONFIG_USB_USBNET=y
# CONFIG_USB_NET_AX8817X is not set
CONFIG_USB_NET_CDCETHER=y
# CONFIG_USB_NET_DM9601 is not set
CONFIG_USB_NET_GL620A=y
CONFIG_USB_NET_NET1080=y
CONFIG_USB_NET_MCS7830=y
CONFIG_USB_NET_CDC_SUBSET=y
# CONFIG_USB_ALI_M5632 is not set
CONFIG_USB_AN2720=y
# CONFIG_USB_BELKIN is not set
CONFIG_USB_ARMLINUX=y
# CONFIG_USB_EPSON2888 is not set
CONFIG_USB_NET_ZAURUS=y
CONFIG_WAN=y
CONFIG_LANMEDIA=y
# CONFIG_HDLC is not set
# CONFIG_DLCI is not set
CONFIG_SBNI=y
# CONFIG_SBNI_MULTILINE is not set
# CONFIG_FDDI is not set
CONFIG_PLIP=y
CONFIG_PPP=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_ASYNC=y
# CONFIG_PPP_SYNC_TTY is not set
CONFIG_PPP_DEFLATE=y
# CONFIG_PPP_BSDCOMP is not set
CONFIG_SLIP=y
# CONFIG_SLIP_COMPRESSED is not set
CONFIG_SLHC=y
CONFIG_SLIP_SMART=y
CONFIG_SLIP_MODE_SLIP6=y
CONFIG_NET_FC=y
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
CONFIG_ISDN=y
CONFIG_ISDN_I4L=y
# CONFIG_ISDN_AUDIO is not set

#
# ISDN feature submodules
#
# CONFIG_ISDN_DRV_LOOP is not set
CONFIG_ISDN_DIVERSION=y

#
# ISDN4Linux hardware drivers
#

#
# Passive cards
#
# CONFIG_ISDN_DRV_HISAX is not set

#
# Active cards
#
CONFIG_ISDN_DRV_GIGASET=y
# CONFIG_GIGASET_BASE is not set
# CONFIG_GIGASET_M105 is not set
CONFIG_GIGASET_M101=y
CONFIG_GIGASET_DEBUG=y
CONFIG_GIGASET_UNDOCREQ=y
CONFIG_ISDN_CAPI=y
CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y
CONFIG_CAPI_TRACE=y
CONFIG_ISDN_CAPI_CAPI20=y
CONFIG_ISDN_CAPI_CAPIDRV=y

#
# CAPI hardware drivers
#
# CONFIG_CAPI_AVM is not set
CONFIG_CAPI_EICON=y
# CONFIG_ISDN_DIVAS is not set
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y
# CONFIG_INPUT_FF_MEMLESS is not set
CONFIG_INPUT_POLLDEV=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
CONFIG_KEYBOARD_SUNKBD=y
# CONFIG_KEYBOARD_LKKBD is not set
CONFIG_KEYBOARD_XTKBD=y
CONFIG_KEYBOARD_NEWTON=y
CONFIG_KEYBOARD_STOWAWAY=y
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_MOUSE_SERIAL=y
# CONFIG_MOUSE_APPLETOUCH is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_INPUT_JOYSTICK is not set
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_ACECAD=y
CONFIG_TABLET_USB_AIPTEK=y
CONFIG_TABLET_USB_GTCO=y
# CONFIG_TABLET_USB_KBTAB is not set
# CONFIG_TABLET_USB_WACOM is not set
CONFIG_INPUT_TOUCHSCREEN=y
# CONFIG_TOUCHSCREEN_ADS7846 is not set
CONFIG_TOUCHSCREEN_AD7877=y
CONFIG_TOUCHSCREEN_FUJITSU=y
# CONFIG_TOUCHSCREEN_GUNZE is not set
# CONFIG_TOUCHSCREEN_ELO is not set
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_MK712 is not set
CONFIG_TOUCHSCREEN_PENMOUNT=y
CONFIG_TOUCHSCREEN_TOUCHRIGHT=y
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_UCB1400 is not set
CONFIG_TOUCHSCREEN_USB_COMPOSITE=y
CONFIG_TOUCHSCREEN_USB_EGALAX=y
CONFIG_TOUCHSCREEN_USB_PANJIT=y
CONFIG_TOUCHSCREEN_USB_3M=y
CONFIG_TOUCHSCREEN_USB_ITM=y
CONFIG_TOUCHSCREEN_USB_ETURBO=y
CONFIG_TOUCHSCREEN_USB_GUNZE=y
CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
CONFIG_TOUCHSCREEN_USB_GOTOP=y
CONFIG_INPUT_MISC=y
CONFIG_INPUT_PCSPKR=y
# CONFIG_INPUT_ATLAS_BTNS is not set
CONFIG_INPUT_ATI_REMOTE=y
CONFIG_INPUT_ATI_REMOTE2=y
CONFIG_INPUT_POWERMATE=y
# CONFIG_INPUT_UINPUT is not set

#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
# CONFIG_SERIO_SERPORT is not set
CONFIG_SERIO_CT82C710=y
CONFIG_SERIO_PARKBD=y
CONFIG_SERIO_PCIPS2=y
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
CONFIG_GAMEPORT=y
# CONFIG_GAMEPORT_NS558 is not set
# CONFIG_GAMEPORT_L4 is not set
CONFIG_GAMEPORT_EMU10K1=y
CONFIG_GAMEPORT_FM801=y

#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
# CONFIG_DEVKMEM is not set
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not set
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
CONFIG_DIGIEPCA=y
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
CONFIG_ISI=y
# CONFIG_SYNCLINK is not set
# CONFIG_SYNCLINKMP is not set
CONFIG_SYNCLINK_GT=y
# CONFIG_N_HDLC is not set
# CONFIG_RISCOM8 is not set
CONFIG_SPECIALIX=y
CONFIG_SPECIALIX_RTSCTS=y
CONFIG_SX=y
CONFIG_RIO=y
CONFIG_RIO_OLDPCI=y
CONFIG_STALDRV=y
CONFIG_STALLION=y
CONFIG_ISTALLION=y

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set

#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_PRINTER=y
CONFIG_LP_CONSOLE=y
# CONFIG_PPDEV is not set
CONFIG_IPMI_HANDLER=y
# CONFIG_IPMI_PANIC_EVENT is not set
CONFIG_IPMI_DEVICE_INTERFACE=y
CONFIG_IPMI_SI=y
CONFIG_IPMI_WATCHDOG=y
CONFIG_IPMI_POWEROFF=y
CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_INTEL is not set
CONFIG_HW_RANDOM_AMD=y
CONFIG_NVRAM=y
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_MWAVE is not set
# CONFIG_PC8736x_GPIO is not set
# CONFIG_RAW_DRIVER is not set
CONFIG_HPET=y
# CONFIG_HPET_RTC_IRQ is not set
CONFIG_HPET_MMAP=y
# CONFIG_HANGCHECK_TIMER is not set
CONFIG_DEVPORT=y
# CONFIG_I2C is not set
CONFIG_SPI=y
# CONFIG_SPI_DEBUG is not set
CONFIG_SPI_MASTER=y

#
# SPI Master Controller Drivers
#

#
# SPI Protocol Masters
#
# CONFIG_SPI_AT25 is not set
# CONFIG_SPI_TLE62X0 is not set
# CONFIG_W1 is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
CONFIG_PDA_POWER=y
# CONFIG_BATTERY_DS2760 is not set
CONFIG_HWMON=y
CONFIG_HWMON_VID=y
CONFIG_SENSORS_IBMPEX=y
CONFIG_SENSORS_IT87=y
CONFIG_SENSORS_PC87360=y
CONFIG_SENSORS_SIS5595=y
CONFIG_SENSORS_SMSC47M1=y
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_VT8231 is not set
# CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_SENSORS_HDAPS is not set
CONFIG_SENSORS_APPLESMC=y
# CONFIG_HWMON_DEBUG_CHIP is not set
CONFIG_THERMAL=y
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set

#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=y
# CONFIG_ACQUIRE_WDT is not set
CONFIG_ADVANTECH_WDT=y
# CONFIG_ALIM1535_WDT is not set
CONFIG_ALIM7101_WDT=y
# CONFIG_SC520_WDT is not set
# CONFIG_EUROTECH_WDT is not set
# CONFIG_IB700_WDT is not set
CONFIG_IBMASR=y
# CONFIG_WAFER_WDT is not set
CONFIG_I6300ESB_WDT=y
# CONFIG_ITCO_WDT is not set
# CONFIG_IT8712F_WDT is not set
# CONFIG_HP_WATCHDOG is not set
# CONFIG_SC1200_WDT is not set
CONFIG_PC87413_WDT=y
CONFIG_60XX_WDT=y
# CONFIG_SBC8360_WDT is not set
# CONFIG_CPU5_WDT is not set
CONFIG_SMSC37B787_WDT=y
# CONFIG_W83627HF_WDT is not set
CONFIG_W83697HF_WDT=y
CONFIG_W83877F_WDT=y
# CONFIG_W83977F_WDT is not set
CONFIG_MACHZ_WDT=y
CONFIG_SBC_EPX_C3_WATCHDOG=y

#
# PCI-based Watchdog Cards
#
CONFIG_PCIPCWATCHDOG=y
CONFIG_WDTPCI=y
# CONFIG_WDT_501_PCI is not set

#
# USB-based Watchdog Cards
#
# CONFIG_USBPCWATCHDOG is not set

#
# Sonics Silicon Backplane
#
CONFIG_SSB_POSSIBLE=y
# CONFIG_SSB is not set

#
# Multifunction device drivers
#
CONFIG_MFD_SM501=y

#
# Multimedia devices
#
CONFIG_VIDEO_DEV=y
CONFIG_VIDEO_V4L2_COMMON=y
# CONFIG_VIDEO_V4L1 is not set
# CONFIG_VIDEO_V4L1_COMPAT is not set
CONFIG_VIDEO_V4L2=y
# CONFIG_VIDEO_CAPTURE_DRIVERS is not set
# CONFIG_RADIO_ADAPTERS is not set
CONFIG_VIDEOBUF_GEN=y
CONFIG_VIDEOBUF_VMALLOC=y
# CONFIG_DAB is not set

#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
# CONFIG_AGP_INTEL is not set
CONFIG_AGP_SIS=y
# CONFIG_AGP_VIA is not set
CONFIG_DRM=y
CONFIG_DRM_TDFX=y
# CONFIG_DRM_R128 is not set
# CONFIG_DRM_RADEON is not set
CONFIG_DRM_MGA=y
CONFIG_DRM_SIS=y
CONFIG_DRM_VIA=y
# CONFIG_DRM_SAVAGE is not set
CONFIG_VGASTATE=y
CONFIG_VIDEO_OUTPUT_CONTROL=y
CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
# CONFIG_FB_DDC is not set
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
# CONFIG_FB_SYS_FILLRECT is not set
# CONFIG_FB_SYS_COPYAREA is not set
# CONFIG_FB_SYS_IMAGEBLIT is not set
# CONFIG_FB_FOREIGN_ENDIAN is not set
# CONFIG_FB_SYS_FOPS is not set
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_SVGALIB=y
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not set
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y

#
# Frame buffer hardware drivers
#
CONFIG_FB_CIRRUS=y
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ARC is not set
# CONFIG_FB_ASILIANT is not set
CONFIG_FB_IMSTT=y
# CONFIG_FB_VGA16 is not set
# CONFIG_FB_UVESA is not set
# CONFIG_FB_VESA is not set
CONFIG_FB_EFI=y
# CONFIG_FB_HECUBA is not set
# CONFIG_FB_HGA is not set
CONFIG_FB_S1D13XXX=y
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_LE80578 is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON is not set
CONFIG_FB_ATY128=y
# CONFIG_FB_ATY128_BACKLIGHT is not set
CONFIG_FB_ATY=y
# CONFIG_FB_ATY_CT is not set
# CONFIG_FB_ATY_GX is not set
# CONFIG_FB_ATY_BACKLIGHT is not set
CONFIG_FB_S3=y
CONFIG_FB_SIS=y
# CONFIG_FB_SIS_300 is not set
# CONFIG_FB_SIS_315 is not set
CONFIG_FB_NEOMAGIC=y
CONFIG_FB_KYRO=y
CONFIG_FB_3DFX=y
# CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_VT8623 is not set
CONFIG_FB_TRIDENT=y
CONFIG_FB_ARK=y
CONFIG_FB_SM501=y
# CONFIG_FB_VIRTUAL is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_CORGI=y
# CONFIG_BACKLIGHT_PROGEAR is not set

#
# Display device support
#
CONFIG_DISPLAY_SUPPORT=y

#
# Display hardware drivers
#

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
CONFIG_VIDEO_SELECT=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
CONFIG_FONTS=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
# CONFIG_FONT_6x11 is not set
# CONFIG_FONT_7x14 is not set
CONFIG_FONT_PEARL_8x8=y
# CONFIG_FONT_ACORN_8x8 is not set
# CONFIG_FONT_MINI_4x6 is not set
CONFIG_FONT_SUN8x16=y
CONFIG_FONT_SUN12x22=y
# CONFIG_FONT_10x18 is not set
CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not set
# CONFIG_LOGO_LINUX_VGA16 is not set
# CONFIG_LOGO_LINUX_CLUT224 is not set

#
# Sound
#
# CONFIG_SOUND is not set
CONFIG_HID_SUPPORT=y
# CONFIG_HID is not set

#
# USB Input Devices
#
# CONFIG_USB_HID is not set

#
# USB HID Boot Protocol drivers
#
# CONFIG_USB_KBD is not set
CONFIG_USB_MOUSE=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y

#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_DEVICE_CLASS is not set
CONFIG_USB_SUSPEND=y

#
# USB Host Controller Drivers
#
# CONFIG_USB_EHCI_HCD is not set
# CONFIG_USB_ISP116X_HCD is not set
# CONFIG_USB_OHCI_HCD is not set
# CONFIG_USB_UHCI_HCD is not set
CONFIG_USB_SL811_HCD=y
# CONFIG_USB_R8A66597_HCD is not set

#
# USB Device Class drivers
#
CONFIG_USB_ACM=y
# CONFIG_USB_PRINTER is not set

#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
#

#
# may also be needed; see USB_STORAGE Help for more information
#
# CONFIG_USB_STORAGE is not set
# CONFIG_USB_LIBUSUAL is not set

#
# USB Imaging devices
#
CONFIG_USB_MICROTEK=y
CONFIG_USB_S2255=y
CONFIG_USB_MON=y

#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
# CONFIG_USB_SERIAL is not set

#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
CONFIG_USB_EMI26=y
# CONFIG_USB_LCD is not set
CONFIG_USB_BERRY_CHARGE=y
# CONFIG_USB_LED is not set
CONFIG_USB_CYPRESS_CY7C63=y
# CONFIG_USB_CYTHERM is not set
CONFIG_USB_PHIDGET=y
CONFIG_USB_PHIDGETKIT=y
# CONFIG_USB_PHIDGETMOTORCONTROL is not set
CONFIG_USB_PHIDGETSERVO=y
CONFIG_USB_IDMOUSE=y
# CONFIG_USB_FTDI_ELAN is not set
# CONFIG_USB_APPLEDISPLAY is not set
CONFIG_USB_LD=y
CONFIG_USB_TRANCEVIBRATOR=y
CONFIG_USB_IOWARRIOR=y
# CONFIG_USB_GOTEMP is not set
# CONFIG_USB_GADGET is not set
CONFIG_MMC=y
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_UNSAFE_RESUME is not set

#
# MMC/SD Card Drivers
#
# CONFIG_MMC_BLOCK is not set
CONFIG_SDIO_UART=y

#
# MMC/SD Host Controller Drivers
#
CONFIG_MMC_SDHCI=y
CONFIG_MMC_WBSD=y
CONFIG_MMC_SPI=y
# CONFIG_MEMSTICK is not set
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y

#
# LED drivers
#

#
# LED Triggers
#
# CONFIG_LEDS_TRIGGERS is not set
CONFIG_ACCESSIBILITY=y
CONFIG_A11Y_BRAILLE_CONSOLE=y
CONFIG_INFINIBAND=y
CONFIG_INFINIBAND_USER_MAD=y
CONFIG_INFINIBAND_USER_ACCESS=y
CONFIG_INFINIBAND_USER_MEM=y
# CONFIG_INFINIBAND_MTHCA is not set
# CONFIG_INFINIBAND_IPATH is not set
# CONFIG_MLX4_INFINIBAND is not set
CONFIG_INFINIBAND_SRP=y
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set

#
# RTC interfaces
#
# CONFIG_RTC_INTF_SYSFS is not set
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
CONFIG_RTC_INTF_DEV_UIE_EMUL=y
# CONFIG_RTC_DRV_TEST is not set

#
# SPI RTC drivers
#
# CONFIG_RTC_DRV_MAX6902 is not set
# CONFIG_RTC_DRV_R9701 is not set
CONFIG_RTC_DRV_RS5C348=y

#
# Platform RTC drivers
#
# CONFIG_RTC_DRV_CMOS is not set
# CONFIG_RTC_DRV_DS1511 is not set
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_DS1742 is not set
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_M48T86 is not set
CONFIG_RTC_DRV_M48T59=y
# CONFIG_RTC_DRV_V3020 is not set

#
# on-CPU RTC drivers
#
CONFIG_DMADEVICES=y

#
# DMA Devices
#
# CONFIG_INTEL_IOATDMA is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set

#
# Firmware Drivers
#
CONFIG_EDD=y
# CONFIG_EDD_OFF is not set
# CONFIG_DELL_RBU is not set
# CONFIG_DCDBAS is not set
CONFIG_DMIID=y
CONFIG_ISCSI_IBFT_FIND=y
# CONFIG_ISCSI_IBFT is not set

#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
# CONFIG_EXT2_FS_POSIX_ACL is not set
# CONFIG_EXT2_FS_SECURITY is not set
# CONFIG_EXT2_FS_XIP is not set
# CONFIG_EXT3_FS is not set
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=y
CONFIG_REISERFS_CHECK=y
CONFIG_REISERFS_PROC_INFO=y
CONFIG_REISERFS_FS_XATTR=y
# CONFIG_REISERFS_FS_POSIX_ACL is not set
CONFIG_REISERFS_FS_SECURITY=y
CONFIG_JFS_FS=y
# CONFIG_JFS_POSIX_ACL is not set
# CONFIG_JFS_SECURITY is not set
CONFIG_JFS_DEBUG=y
# CONFIG_JFS_STATISTICS is not set
# CONFIG_FS_POSIX_ACL is not set
CONFIG_XFS_FS=y
# CONFIG_XFS_QUOTA is not set
CONFIG_XFS_SECURITY=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_XFS_RT=y
# CONFIG_OCFS2_FS is not set
# CONFIG_DNOTIFY is not set
CONFIG_INOTIFY=y
# CONFIG_INOTIFY_USER is not set
# CONFIG_QUOTA is not set
CONFIG_AUTOFS_FS=y
# CONFIG_AUTOFS4_FS is not set
# CONFIG_FUSE_FS is not set

#
# CD-ROM/DVD Filesystems
#
# CONFIG_ISO9660_FS is not set
# CONFIG_UDF_FS is not set

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
# CONFIG_MSDOS_FS is not set
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_NTFS_FS is not set

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_SYSFS=y
# CONFIG_TMPFS is not set
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set
# CONFIG_CONFIGFS_FS is not set

#
# Layered filesystems
#

#
# Miscellaneous filesystems
#
CONFIG_HFSPLUS_FS=y
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
# CONFIG_JFFS2_FS_WRITEBUFFER is not set
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
# CONFIG_JFFS2_ZLIB is not set
# CONFIG_JFFS2_LZO is not set
# CONFIG_JFFS2_RTIME is not set
# CONFIG_JFFS2_RUBIN is not set
# CONFIG_JFFS2_CMODE_NONE is not set
# CONFIG_JFFS2_CMODE_PRIORITY is not set
CONFIG_JFFS2_CMODE_SIZE=y
# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
CONFIG_CRAMFS=y
# CONFIG_VXFS_FS is not set
CONFIG_MINIX_FS=y
# CONFIG_HPFS_FS is not set
CONFIG_QNX4FS_FS=y
# CONFIG_ROMFS_FS is not set
CONFIG_SYSV_FS=y
CONFIG_UFS_FS=y
CONFIG_UFS_DEBUG=y
CONFIG_NETWORK_FILESYSTEMS=y

#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
# CONFIG_NLS_CODEPAGE_737 is not set
CONFIG_NLS_CODEPAGE_775=y
# CONFIG_NLS_CODEPAGE_850 is not set
CONFIG_NLS_CODEPAGE_852=y
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
CONFIG_NLS_CODEPAGE_860=y
CONFIG_NLS_CODEPAGE_861=y
CONFIG_NLS_CODEPAGE_862=y
CONFIG_NLS_CODEPAGE_863=y
CONFIG_NLS_CODEPAGE_864=y
CONFIG_NLS_CODEPAGE_865=y
CONFIG_NLS_CODEPAGE_866=y
CONFIG_NLS_CODEPAGE_869=y
CONFIG_NLS_CODEPAGE_936=y
# CONFIG_NLS_CODEPAGE_950 is not set
CONFIG_NLS_CODEPAGE_932=y
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
CONFIG_NLS_ISO8859_8=y
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_2=y
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
CONFIG_NLS_ISO8859_5=y
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
CONFIG_NLS_ISO8859_9=y
CONFIG_NLS_ISO8859_13=y
CONFIG_NLS_ISO8859_14=y
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_KOI8_R=y
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=y

#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_PRINTK_TIME is not set
CONFIG_ENABLE_WARN_DEPRECATED=y
# CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_UNUSED_SYMBOLS=y
CONFIG_PAGE_OWNER=y
# CONFIG_DEBUG_FS is not set
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
CONFIG_DETECT_SOFTLOCKUP=y
CONFIG_SCHED_DEBUG=y
CONFIG_SCHEDSTATS=y
# CONFIG_TIMER_STATS is not set
CONFIG_SLUB_DEBUG_ON=y
# CONFIG_SLUB_STATS is not set
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_PI_LIST=y
CONFIG_RT_MUTEX_TESTER=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_PROVE_LOCKING=y
CONFIG_LOCKDEP=y
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_LOCKDEP=y
CONFIG_TRACE_IRQFLAGS=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_WRITECOUNT is not set
# CONFIG_DEBUG_LIST is not set
CONFIG_DEBUG_SG=y
# CONFIG_FRAME_POINTER is not set
CONFIG_PROFILE_LIKELY=y
# CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_DEBUG_SYNCHRO_TEST is not set
CONFIG_BACKTRACE_SELF_TEST=y
# CONFIG_FAULT_INJECTION is not set
# CONFIG_LATENCYTOP is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
CONFIG_SAMPLES=y
CONFIG_SAMPLE_KOBJECT=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_DEBUG_STACK_USAGE=y
CONFIG_DEBUG_PAGEALLOC=y
# CONFIG_X86_PTDUMP is not set
CONFIG_DEBUG_RODATA=y
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_X86_MPPARSE=y
CONFIG_IOMMU_DEBUG=y
CONFIG_IOMMU_LEAK=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
# CONFIG_IO_DELAY_0X80 is not set
CONFIG_IO_DELAY_0XED=y
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_DEFAULT_IO_DELAY_TYPE=1
CONFIG_CPA_DEBUG=y

#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY is not set
CONFIG_CRYPTO=y
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_BLKCIPHER=y
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_MANAGER=y
# CONFIG_CRYPTO_HMAC is not set
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_MD4=y
CONFIG_CRYPTO_MD5=y
# CONFIG_CRYPTO_SHA1 is not set
# CONFIG_CRYPTO_SHA256 is not set
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_WP512=y
# CONFIG_CRYPTO_TGR192 is not set
CONFIG_CRYPTO_GF128MUL=y
CONFIG_CRYPTO_ECB=y
# CONFIG_CRYPTO_CBC is not set
# CONFIG_CRYPTO_PCBC is not set
CONFIG_CRYPTO_CTR=y
CONFIG_CRYPTO_GCM=y
CONFIG_CRYPTO_CCM=y
CONFIG_CRYPTO_CRYPTD=y
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_FCRYPT is not set
CONFIG_CRYPTO_BLOWFISH=y
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_TWOFISH_X86_64 is not set
CONFIG_CRYPTO_SERPENT=y
CONFIG_CRYPTO_AES=y
# CONFIG_CRYPTO_AES_X86_64 is not set
# CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_TEA is not set
CONFIG_CRYPTO_ARC4=y
CONFIG_CRYPTO_KHAZAD=y
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_DEFLATE is not set
CONFIG_CRYPTO_MICHAEL_MIC=y
CONFIG_CRYPTO_CRC32C=y
CONFIG_CRYPTO_CAMELLIA=y
# CONFIG_CRYPTO_AUTHENC is not set
# CONFIG_CRYPTO_LZO is not set
# CONFIG_CRYPTO_HW is not set
CONFIG_HAVE_KVM=y
CONFIG_VIRTUALIZATION=y
# CONFIG_VIRTIO_BALLOON is not set

#
# Library routines
#
CONFIG_BITREVERSE=y
CONFIG_CRC_CCITT=y
CONFIG_CRC16=y
CONFIG_CRC_ITU_T=y
CONFIG_CRC32=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_PLIST=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_CHECK_SIGNATURE=y

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

* Re: [mmotm build error] Re: [PATCH,RESEND] Basic braille screen reader support
  2008-03-19 18:57   ` [mmotm build error] Re: [PATCH,RESEND] " Randy Dunlap
@ 2008-03-20  2:07     ` Samuel Thibault
  2008-03-20  4:19       ` Randy Dunlap
  0 siblings, 1 reply; 22+ messages in thread
From: Samuel Thibault @ 2008-03-20  2:07 UTC (permalink / raw)
  To: Randy Dunlap, akpm; +Cc: torvalds, linux-kernel

Randy Dunlap, le Wed 19 Mar 2008 11:57:26 -0700, a écrit :
> when O=dir is used in make:
> 
>   CC      drivers/accessibility/braille/braille_console.o
> Assembler messages:
> Fatal error: can't create drivers/accessibility/braille/braille_console.o: No such file or directory
>   CC      crypto/aes_generic.o
> make[3]: *** [drivers/accessibility/braille/braille_console.o] Error 2
> make[2]: *** [drivers/accessibility] Error 2
> make[1]: *** [drivers] Error 2

Oh, right, the patch below should fix it



Properly recurse Makefiles into accessibility and accessibility/braille/

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

--- linux-2.6.24.1-perso/drivers/accessibility/Makefile.orig	2008-03-20 01:51:09.000000000 +0000
+++ linux-2.6.24.1-perso/drivers/accessibility/Makefile	2008-03-20 01:52:30.000000000 +0000
@@ -1 +1 @@
-obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille/braille_console.o
+obj-y				+= braille/
--- /dev/null	2008-03-20 02:39:28.130012041 +0000
+++ linux-2.6.24.1-perso/drivers/accessibility/braille/Makefile	2008-03-20 01:52:44.000000000 +0000
@@ -0,0 +1 @@
+obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille_console.o

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

* Re: [mmotm build error] Re: [PATCH,RESEND] Basic braille screen reader support
  2008-03-20  2:07     ` Samuel Thibault
@ 2008-03-20  4:19       ` Randy Dunlap
  0 siblings, 0 replies; 22+ messages in thread
From: Randy Dunlap @ 2008-03-20  4:19 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: akpm, torvalds, linux-kernel

On Thu, 20 Mar 2008 02:07:59 +0000 Samuel Thibault wrote:

> Randy Dunlap, le Wed 19 Mar 2008 11:57:26 -0700, a écrit :
> > when O=dir is used in make:
> > 
> >   CC      drivers/accessibility/braille/braille_console.o
> > Assembler messages:
> > Fatal error: can't create drivers/accessibility/braille/braille_console.o: No such file or directory
> >   CC      crypto/aes_generic.o
> > make[3]: *** [drivers/accessibility/braille/braille_console.o] Error 2
> > make[2]: *** [drivers/accessibility] Error 2
> > make[1]: *** [drivers] Error 2
> 
> Oh, right, the patch below should fix it
> 

Acked-by: Randy Dunlap <randy.dunlap@oracle.com>

Thanks.

> 
> Properly recurse Makefiles into accessibility and accessibility/braille/
> 
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> 
> --- linux-2.6.24.1-perso/drivers/accessibility/Makefile.orig	2008-03-20 01:51:09.000000000 +0000
> +++ linux-2.6.24.1-perso/drivers/accessibility/Makefile	2008-03-20 01:52:30.000000000 +0000
> @@ -1 +1 @@
> -obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille/braille_console.o
> +obj-y				+= braille/
> --- /dev/null	2008-03-20 02:39:28.130012041 +0000
> +++ linux-2.6.24.1-perso/drivers/accessibility/braille/Makefile	2008-03-20 01:52:44.000000000 +0000
> @@ -0,0 +1 @@
> +obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)		+= braille_console.o
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 


---
~Randy

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

* Re: [PATCH2] Basic braille screen reader support
  2008-02-23 13:10           ` Samuel Thibault
  2008-02-23 13:15             ` [PATCH] Braille screen reader fixes Samuel Thibault
  2008-02-23 13:17             ` [PATCH] Braille screen reader documentation Samuel Thibault
@ 2008-04-24  0:39             ` Samuel Thibault
  2008-04-24  4:46               ` Andrew Morton
  2008-04-24 10:21               ` Alan Cox
  2 siblings, 2 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-04-24  0:39 UTC (permalink / raw)
  To: Andrew Morton, linux-kernel, Dmitry Torokhov, Jiri Kosina

Hello,

Could the basic braille screen reader be pushed to 2.6.26?

Else, could at least the patch below be applied, so that people can
compile external accessibility modules a lot more easily? (no need to
patch vanilla kernel, which is a huge win for people who already have a
hard time just using their computer...)

Samuel

Export functions typically used by screen reading modules.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

diff -ur linux-2.6.24.1-orig/drivers/char/consolemap.c linux-2.6.24.1-perso/drivers/char/consolemap.c
--- linux-2.6.24.1-orig/drivers/char/consolemap.c	2008-01-25 09:32:05.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/char/consolemap.c	2008-02-03 22:27:04.000000000 +0100
@@ -277,6 +277,7 @@
 			return p->inverse_translations[m][glyph];
 	}
 }
+EXPORT_SYMBOL_GPL(inverse_translate);
 
 static void update_user_maps(void)
 {
diff -ur linux-2.6.24.1-orig/drivers/char/keyboard.c linux-2.6.24.1-perso/drivers/char/keyboard.c
--- linux-2.6.24.1-orig/drivers/char/keyboard.c	2008-01-25 09:32:06.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/char/keyboard.c	2008-02-04 03:44:37.000000000 +0100
@@ -110,6 +110,7 @@
 const int NR_TYPES = ARRAY_SIZE(max_vals);
 
 struct kbd_struct kbd_table[MAX_NR_CONSOLES];
+EXPORT_SYMBOL_GPL(kbd_table);
 static struct kbd_struct *kbd = kbd_table;
 
 struct vt_spawn_console vt_spawn_con = {
@@ -260,6 +261,7 @@
 	} else
 		kd_nosound(0);
 }
+EXPORT_SYMBOL_GPL(kd_mksound);
 
 /*
  * Setting the keyboard rate.
diff -ur linux-2.6.24.1-orig/drivers/char/vt.c linux-2.6.24.1-perso/drivers/char/vt.c
--- linux-2.6.24.1-orig/drivers/char/vt.c	2008-01-25 09:32:06.000000000 +0100
+++ linux-2.6.24.1-perso/drivers/char/vt.c	2008-02-03 22:27:04.000000000 +0100
@@ -3982,6 +3982,7 @@
 		c |= 0x100;
 	return c;
 }
+EXPORT_SYMBOL_GPL(screen_glyph);
 
 /* used by vcs - note the word offset */
 unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)

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

* Re: [PATCH2] Basic braille screen reader support
  2008-04-24  0:39             ` [PATCH2] Basic braille screen reader support Samuel Thibault
@ 2008-04-24  4:46               ` Andrew Morton
  2008-04-24 10:21               ` Alan Cox
  1 sibling, 0 replies; 22+ messages in thread
From: Andrew Morton @ 2008-04-24  4:46 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: linux-kernel, dtor, jkosina

> On Thu, 24 Apr 2008 01:39:00 +0100 Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:
> Could the basic braille screen reader be pushed to 2.6.26?

I was intending to do that.

(I don't like the code much but can't suggest anything better)

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

* Re: [PATCH2] Basic braille screen reader support
  2008-04-24  0:39             ` [PATCH2] Basic braille screen reader support Samuel Thibault
  2008-04-24  4:46               ` Andrew Morton
@ 2008-04-24 10:21               ` Alan Cox
  2008-04-24 11:09                 ` Samuel Thibault
  1 sibling, 1 reply; 22+ messages in thread
From: Alan Cox @ 2008-04-24 10:21 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: Andrew Morton, linux-kernel, Dmitry Torokhov, Jiri Kosina

On Thu, 24 Apr 2008 01:39:00 +0100
Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:

> Hello,
> 
> Could the basic braille screen reader be pushed to 2.6.26?
> 
> Else, could at least the patch below be applied, so that people can
> compile external accessibility modules a lot more easily? (no need to
> patch vanilla kernel, which is a huge win for people who already have a
> hard time just using their computer...)
> 
> Samuel
> 
> Export functions typically used by screen reading modules.
> 
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

Seems the right small set of changes to get us started with the real
merge and its useful for the tty cleanup to have these exports visible so
I know what will affect others.

Acked-by: Alan Cox <alan@redhat.com>


> 
> diff -ur linux-2.6.24.1-orig/drivers/char/consolemap.c linux-2.6.24.1-perso/drivers/char/consolemap.c
> --- linux-2.6.24.1-orig/drivers/char/consolemap.c	2008-01-25 09:32:05.000000000 +0100
> +++ linux-2.6.24.1-perso/drivers/char/consolemap.c	2008-02-03 22:27:04.000000000 +0100
> @@ -277,6 +277,7 @@
>  			return p->inverse_translations[m][glyph];
>  	}
>  }
> +EXPORT_SYMBOL_GPL(inverse_translate);
>  
>  static void update_user_maps(void)
>  {
> diff -ur linux-2.6.24.1-orig/drivers/char/keyboard.c linux-2.6.24.1-perso/drivers/char/keyboard.c
> --- linux-2.6.24.1-orig/drivers/char/keyboard.c	2008-01-25 09:32:06.000000000 +0100
> +++ linux-2.6.24.1-perso/drivers/char/keyboard.c	2008-02-04 03:44:37.000000000 +0100
> @@ -110,6 +110,7 @@
>  const int NR_TYPES = ARRAY_SIZE(max_vals);
>  
>  struct kbd_struct kbd_table[MAX_NR_CONSOLES];
> +EXPORT_SYMBOL_GPL(kbd_table);
>  static struct kbd_struct *kbd = kbd_table;
>  
>  struct vt_spawn_console vt_spawn_con = {
> @@ -260,6 +261,7 @@
>  	} else
>  		kd_nosound(0);
>  }
> +EXPORT_SYMBOL_GPL(kd_mksound);
>  
>  /*
>   * Setting the keyboard rate.
> diff -ur linux-2.6.24.1-orig/drivers/char/vt.c linux-2.6.24.1-perso/drivers/char/vt.c
> --- linux-2.6.24.1-orig/drivers/char/vt.c	2008-01-25 09:32:06.000000000 +0100
> +++ linux-2.6.24.1-perso/drivers/char/vt.c	2008-02-03 22:27:04.000000000 +0100
> @@ -3982,6 +3982,7 @@
>  		c |= 0x100;
>  	return c;
>  }
> +EXPORT_SYMBOL_GPL(screen_glyph);
>  
>  /* used by vcs - note the word offset */
>  unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/


-- 
--
	"Alan, I'm getting a bit worried about you."
				-- Linus Torvalds

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

* Re: [PATCH2] Basic braille screen reader support
  2008-04-24 10:21               ` Alan Cox
@ 2008-04-24 11:09                 ` Samuel Thibault
  0 siblings, 0 replies; 22+ messages in thread
From: Samuel Thibault @ 2008-04-24 11:09 UTC (permalink / raw)
  To: Alan Cox; +Cc: Andrew Morton, linux-kernel, Dmitry Torokhov, Jiri Kosina

Alan Cox, le Thu 24 Apr 2008 11:21:26 +0100, a écrit :
> On Thu, 24 Apr 2008 01:39:00 +0100
> Samuel Thibault <samuel.thibault@ens-lyon.org> wrote:
> > Export functions typically used by screen reading modules.
> 
> Seems the right small set of changes to get us started with the real
> merge and its useful for the tty cleanup to have these exports visible so
> I know what will affect others.

Ok.

Additionnal exports which will be of much use is selection, see patch
below.

Samuel



Export set_selection and paste_selection for accessibility modules.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

--- linux/drivers/char/selection.c.orig	2008-04-24 12:00:07.000000000 +0100
+++ linux/drivers/char/selection.c	2008-04-24 11:59:56.000000000 +0100
@@ -299,6 +299,7 @@ int set_selection(const struct tiocl_sel
 	sel_buffer_lth = bp - sel_buffer;
 	return 0;
 }
+EXPORT_SYMBOL_GPL(set_selection);
 
 /* Insert the contents of the selection buffer into the
  * queue of the tty associated with the current console.
@@ -336,3 +337,4 @@ int paste_selection(struct tty_struct *t
 	tty_ldisc_deref(ld);
 	return 0;
 }
+EXPORT_SYMBOL_GPL(paste_selection);

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

end of thread, other threads:[~2008-04-24 11:19 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-04  3:18 [PATCH] Basic braille screen reader support Samuel Thibault
2008-02-04  3:22 ` Samuel Thibault
2008-02-04 17:10 ` Greg KH
2008-02-04 17:24   ` Samuel Thibault
2008-02-04 18:06     ` Greg KH
2008-02-04 18:15       ` Samuel Thibault
2008-02-04 18:27         ` Greg KH
2008-02-05 22:00 ` [PATCH,RESEND] " Samuel Thibault
2008-02-06  0:58   ` Andrew Morton
2008-02-06  2:04     ` Samuel Thibault
2008-02-22  0:28       ` [PATCH2] " Samuel Thibault
2008-02-23  8:04         ` Andrew Morton
2008-02-23 13:10           ` Samuel Thibault
2008-02-23 13:15             ` [PATCH] Braille screen reader fixes Samuel Thibault
2008-02-23 13:17             ` [PATCH] Braille screen reader documentation Samuel Thibault
2008-04-24  0:39             ` [PATCH2] Basic braille screen reader support Samuel Thibault
2008-04-24  4:46               ` Andrew Morton
2008-04-24 10:21               ` Alan Cox
2008-04-24 11:09                 ` Samuel Thibault
2008-03-19 18:57   ` [mmotm build error] Re: [PATCH,RESEND] " Randy Dunlap
2008-03-20  2:07     ` Samuel Thibault
2008-03-20  4:19       ` Randy Dunlap

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).