mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
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. [[email protected]: fix exports] Signed-off-by: Samuel Thibault <[email protected]> Cc: Jiri Kosina <[email protected]> Cc: Dmitry Torokhov <[email protected]> Acked-by: Alan Cox <[email protected]> Cc: Randy Dunlap <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
730f412c08
commit
f7511d5f66
15 changed files with 538 additions and 30 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue