Basic braille screen reader support
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. [akpm@linux-foundation.org: fix exports] Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> Cc: Jiri Kosina <jikos@jikos.cz> Cc: Dmitry Torokhov <dtor@mail.ru> Acked-by: Alan Cox <alan@redhat.com> Cc: Randy Dunlap <randy.dunlap@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
730f412c08
commit
f7511d5f66
@@ -111,6 +111,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
|
||||
@@ -808,15 +811,60 @@ static void call_console_drivers(unsigned start, unsigned end)
|
||||
|
||||
#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];
|
||||
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;
|
||||
}
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
@@ -841,7 +889,7 @@ static int __init console_setup(char *str)
|
||||
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);
|
||||
@@ -861,28 +909,7 @@ __setup("console=", console_setup);
|
||||
*/
|
||||
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)
|
||||
@@ -1163,6 +1190,16 @@ void register_console(struct console *console)
|
||||
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;
|
||||
@@ -1221,6 +1258,11 @@ int unregister_console(struct console *console)
|
||||
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;
|
||||
|
Reference in New Issue
Block a user