diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2008-04-30 03:54:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:29:52 -0400 |
commit | f7511d5f66f01fc451747b24e79f3ada7a3af9af (patch) | |
tree | 934196c15e43077641e35286078a6753700a3e3d /kernel/printk.c | |
parent | 730f412c08c13858f7681bac0a2770fbc9159fed (diff) |
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>
Diffstat (limited to 'kernel/printk.c')
-rw-r--r-- | kernel/printk.c | 90 |
1 files changed, 66 insertions, 24 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 0d232589a923..e61346faf6a5 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -111,6 +111,9 @@ struct console_cmdline | |||
111 | char name[8]; /* Name of the driver */ | 111 | char name[8]; /* Name of the driver */ |
112 | int index; /* Minor dev. to use */ | 112 | int index; /* Minor dev. to use */ |
113 | char *options; /* Options for the driver */ | 113 | char *options; /* Options for the driver */ |
114 | #ifdef CONFIG_A11Y_BRAILLE_CONSOLE | ||
115 | char *brl_options; /* Options for braille driver */ | ||
116 | #endif | ||
114 | }; | 117 | }; |
115 | 118 | ||
116 | #define MAX_CMDLINECONSOLES 8 | 119 | #define MAX_CMDLINECONSOLES 8 |
@@ -808,15 +811,60 @@ static void call_console_drivers(unsigned start, unsigned end) | |||
808 | 811 | ||
809 | #endif | 812 | #endif |
810 | 813 | ||
814 | static int __add_preferred_console(char *name, int idx, char *options, | ||
815 | char *brl_options) | ||
816 | { | ||
817 | struct console_cmdline *c; | ||
818 | int i; | ||
819 | |||
820 | /* | ||
821 | * See if this tty is not yet registered, and | ||
822 | * if we have a slot free. | ||
823 | */ | ||
824 | for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) | ||
825 | if (strcmp(console_cmdline[i].name, name) == 0 && | ||
826 | console_cmdline[i].index == idx) { | ||
827 | if (!brl_options) | ||
828 | selected_console = i; | ||
829 | return 0; | ||
830 | } | ||
831 | if (i == MAX_CMDLINECONSOLES) | ||
832 | return -E2BIG; | ||
833 | if (!brl_options) | ||
834 | selected_console = i; | ||
835 | c = &console_cmdline[i]; | ||
836 | strlcpy(c->name, name, sizeof(c->name)); | ||
837 | c->options = options; | ||
838 | #ifdef CONFIG_A11Y_BRAILLE_CONSOLE | ||
839 | c->brl_options = brl_options; | ||
840 | #endif | ||
841 | c->index = idx; | ||
842 | return 0; | ||
843 | } | ||
811 | /* | 844 | /* |
812 | * Set up a list of consoles. Called from init/main.c | 845 | * Set up a list of consoles. Called from init/main.c |
813 | */ | 846 | */ |
814 | static int __init console_setup(char *str) | 847 | static int __init console_setup(char *str) |
815 | { | 848 | { |
816 | char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */ | 849 | char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */ |
817 | char *s, *options; | 850 | char *s, *options, *brl_options = NULL; |
818 | int idx; | 851 | int idx; |
819 | 852 | ||
853 | #ifdef CONFIG_A11Y_BRAILLE_CONSOLE | ||
854 | if (!memcmp(str, "brl,", 4)) { | ||
855 | brl_options = ""; | ||
856 | str += 4; | ||
857 | } else if (!memcmp(str, "brl=", 4)) { | ||
858 | brl_options = str + 4; | ||
859 | str = strchr(brl_options, ','); | ||
860 | if (!str) { | ||
861 | printk(KERN_ERR "need port name after brl=\n"); | ||
862 | return 1; | ||
863 | } | ||
864 | *(str++) = 0; | ||
865 | } | ||
866 | #endif | ||
867 | |||
820 | /* | 868 | /* |
821 | * Decode str into name, index, options. | 869 | * Decode str into name, index, options. |
822 | */ | 870 | */ |
@@ -841,7 +889,7 @@ static int __init console_setup(char *str) | |||
841 | idx = simple_strtoul(s, NULL, 10); | 889 | idx = simple_strtoul(s, NULL, 10); |
842 | *s = 0; | 890 | *s = 0; |
843 | 891 | ||
844 | add_preferred_console(buf, idx, options); | 892 | __add_preferred_console(buf, idx, options, brl_options); |
845 | return 1; | 893 | return 1; |
846 | } | 894 | } |
847 | __setup("console=", console_setup); | 895 | __setup("console=", console_setup); |
@@ -861,28 +909,7 @@ __setup("console=", console_setup); | |||
861 | */ | 909 | */ |
862 | int add_preferred_console(char *name, int idx, char *options) | 910 | int add_preferred_console(char *name, int idx, char *options) |
863 | { | 911 | { |
864 | struct console_cmdline *c; | 912 | return __add_preferred_console(name, idx, options, NULL); |
865 | int i; | ||
866 | |||
867 | /* | ||
868 | * See if this tty is not yet registered, and | ||
869 | * if we have a slot free. | ||
870 | */ | ||
871 | for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) | ||
872 | if (strcmp(console_cmdline[i].name, name) == 0 && | ||
873 | console_cmdline[i].index == idx) { | ||
874 | selected_console = i; | ||
875 | return 0; | ||
876 | } | ||
877 | if (i == MAX_CMDLINECONSOLES) | ||
878 | return -E2BIG; | ||
879 | selected_console = i; | ||
880 | c = &console_cmdline[i]; | ||
881 | memcpy(c->name, name, sizeof(c->name)); | ||
882 | c->name[sizeof(c->name) - 1] = 0; | ||
883 | c->options = options; | ||
884 | c->index = idx; | ||
885 | return 0; | ||
886 | } | 913 | } |
887 | 914 | ||
888 | int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options) | 915 | 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) | |||
1163 | continue; | 1190 | continue; |
1164 | if (console->index < 0) | 1191 | if (console->index < 0) |
1165 | console->index = console_cmdline[i].index; | 1192 | console->index = console_cmdline[i].index; |
1193 | #ifdef CONFIG_A11Y_BRAILLE_CONSOLE | ||
1194 | if (console_cmdline[i].brl_options) { | ||
1195 | console->flags |= CON_BRL; | ||
1196 | braille_register_console(console, | ||
1197 | console_cmdline[i].index, | ||
1198 | console_cmdline[i].options, | ||
1199 | console_cmdline[i].brl_options); | ||
1200 | return; | ||
1201 | } | ||
1202 | #endif | ||
1166 | if (console->setup && | 1203 | if (console->setup && |
1167 | console->setup(console, console_cmdline[i].options) != 0) | 1204 | console->setup(console, console_cmdline[i].options) != 0) |
1168 | break; | 1205 | break; |
@@ -1221,6 +1258,11 @@ int unregister_console(struct console *console) | |||
1221 | struct console *a, *b; | 1258 | struct console *a, *b; |
1222 | int res = 1; | 1259 | int res = 1; |
1223 | 1260 | ||
1261 | #ifdef CONFIG_A11Y_BRAILLE_CONSOLE | ||
1262 | if (console->flags & CON_BRL) | ||
1263 | return braille_unregister_console(console); | ||
1264 | #endif | ||
1265 | |||
1224 | acquire_console_sem(); | 1266 | acquire_console_sem(); |
1225 | if (console_drivers == console) { | 1267 | if (console_drivers == console) { |
1226 | console_drivers=console->next; | 1268 | console_drivers=console->next; |