system/core
修订版 | 624de940c56ca114c34a91493cd122f243fc4c81 (tree) |
---|---|
时间 | 2011-02-14 17:42:34 |
作者 | Chih-Wei Huang <cwhuang@linu...> |
Commiter | Chih-Wei Huang |
init: builtins: Add 'setkeycode' command to init.rc parser
The command is used to set an entry into the kernel's scancode-to-keycode map.
Change-Id: If772b3590c08d3696ff9d015f1faf0e75405e262
@@ -82,7 +82,7 @@ static int insmod(const char *filename, char *options) | ||
82 | 82 | return ret; |
83 | 83 | } |
84 | 84 | |
85 | -static int setkey(struct kbentry *kbe) | |
85 | +static int kbioctl(int cmd, void *data) | |
86 | 86 | { |
87 | 87 | int fd, ret; |
88 | 88 |
@@ -90,12 +90,22 @@ static int setkey(struct kbentry *kbe) | ||
90 | 90 | if (fd < 0) |
91 | 91 | return -1; |
92 | 92 | |
93 | - ret = ioctl(fd, KDSKBENT, kbe); | |
93 | + ret = ioctl(fd, cmd, data); | |
94 | 94 | |
95 | 95 | close(fd); |
96 | 96 | return ret; |
97 | 97 | } |
98 | 98 | |
99 | +static int setkey(struct kbentry *kbe) | |
100 | +{ | |
101 | + return kbioctl(KDSKBENT, kbe); | |
102 | +} | |
103 | + | |
104 | +static int setkeycode(struct kbkeycode *kbk) | |
105 | +{ | |
106 | + return kbioctl(KDSETKEYCODE, kbk); | |
107 | +} | |
108 | + | |
99 | 109 | static int __ifupdown(const char *interface, int up) |
100 | 110 | { |
101 | 111 | struct ifreq ifr; |
@@ -363,6 +373,25 @@ int do_setkey(int nargs, char **args) | ||
363 | 373 | return setkey(&kbe); |
364 | 374 | } |
365 | 375 | |
376 | +int do_setkeycode(int nargs, char **args) | |
377 | +{ | |
378 | + struct kbkeycode kbk; | |
379 | + unsigned int sc, kc; | |
380 | + sc = strtoul(args[1], 0, 0); | |
381 | + if (sc > 127) { | |
382 | + sc -= 0xe000; | |
383 | + sc += 128; | |
384 | + } | |
385 | + kc = strtoul(args[2], 0, 0); | |
386 | + if (sc > 255 || kc > 127) { | |
387 | + ERROR("SCANCODE or KEYCODE out of range"); | |
388 | + return -1; | |
389 | + } | |
390 | + kbk.scancode = sc; | |
391 | + kbk.keycode = kc; | |
392 | + return setkeycode(&kbk); | |
393 | +} | |
394 | + | |
366 | 395 | int do_setprop(int nargs, char **args) |
367 | 396 | { |
368 | 397 | property_set(args[1], args[2]); |
@@ -15,6 +15,7 @@ int do_mkdir(int nargs, char **args); | ||
15 | 15 | int do_mount(int nargs, char **args); |
16 | 16 | int do_restart(int nargs, char **args); |
17 | 17 | int do_setkey(int nargs, char **args); |
18 | +int do_setkeycode(int nargs, char **args); | |
18 | 19 | int do_setprop(int nargs, char **args); |
19 | 20 | int do_setrlimit(int nargs, char **args); |
20 | 21 | int do_start(int nargs, char **args); |
@@ -60,6 +61,7 @@ enum { | ||
60 | 61 | KEYWORD(service, SECTION, 0, 0) |
61 | 62 | KEYWORD(setenv, OPTION, 2, 0) |
62 | 63 | KEYWORD(setkey, COMMAND, 0, do_setkey) |
64 | + KEYWORD(setkeycode, COMMAND, 2, do_setkeycode) | |
63 | 65 | KEYWORD(setprop, COMMAND, 2, do_setprop) |
64 | 66 | KEYWORD(setrlimit, COMMAND, 3, do_setrlimit) |
65 | 67 | KEYWORD(socket, OPTION, 0, 0) |
@@ -184,6 +184,7 @@ int lookup_keyword(const char *s) | ||
184 | 184 | if (!strcmp(s, "ervice")) return K_service; |
185 | 185 | if (!strcmp(s, "etenv")) return K_setenv; |
186 | 186 | if (!strcmp(s, "etkey")) return K_setkey; |
187 | + if (!strcmp(s, "etkeycode")) return K_setkeycode; | |
187 | 188 | if (!strcmp(s, "etprop")) return K_setprop; |
188 | 189 | if (!strcmp(s, "etrlimit")) return K_setrlimit; |
189 | 190 | if (!strcmp(s, "ocket")) return K_socket; |
@@ -185,6 +185,9 @@ mount <type> <device> <dir> [ <mountoption> ]* | ||
185 | 185 | setkey |
186 | 186 | TBD |
187 | 187 | |
188 | +setkeycode <scancode> <keycode> | |
189 | + Set an entry into the kernel's scancode-to-keycode map. | |
190 | + | |
188 | 191 | setprop <name> <value> |
189 | 192 | Set system property <name> to <value>. |
190 | 193 |