blob: 11fc37ae9609f3496c871baf75079744f1a8fef7
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * setkeycodes |
4 | * |
5 | * Copyright (C) 1994-1998 Andries E. Brouwer <aeb@cwi.nl> |
6 | * |
7 | * Adjusted for BusyBox by Erik Andersen <andersen@codepoet.org> |
8 | * |
9 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. |
10 | */ |
11 | //config:config SETKEYCODES |
12 | //config: bool "setkeycodes" |
13 | //config: default y |
14 | //config: select PLATFORM_LINUX |
15 | //config: help |
16 | //config: This program loads entries into the kernel's scancode-to-keycode |
17 | //config: map, allowing unusual keyboards to generate usable keycodes. |
18 | |
19 | //applet:IF_SETKEYCODES(APPLET(setkeycodes, BB_DIR_USR_BIN, BB_SUID_DROP)) |
20 | |
21 | //kbuild:lib-$(CONFIG_SETKEYCODES) += setkeycodes.o |
22 | |
23 | //usage:#define setkeycodes_trivial_usage |
24 | //usage: "SCANCODE KEYCODE..." |
25 | //usage:#define setkeycodes_full_usage "\n\n" |
26 | //usage: "Set entries into the kernel's scancode-to-keycode map,\n" |
27 | //usage: "allowing unusual keyboards to generate usable keycodes.\n\n" |
28 | //usage: "SCANCODE may be either xx or e0xx (hexadecimal),\n" |
29 | //usage: "and KEYCODE is given in decimal." |
30 | //usage: |
31 | //usage:#define setkeycodes_example_usage |
32 | //usage: "$ setkeycodes e030 127\n" |
33 | |
34 | #include "libbb.h" |
35 | |
36 | /* From <linux/kd.h> */ |
37 | struct kbkeycode { |
38 | unsigned scancode, keycode; |
39 | }; |
40 | enum { |
41 | KDSETKEYCODE = 0x4B4D /* write kernel keycode table entry */ |
42 | }; |
43 | |
44 | int setkeycodes_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
45 | int setkeycodes_main(int argc, char **argv) |
46 | { |
47 | int fd; |
48 | struct kbkeycode a; |
49 | |
50 | if (!(argc & 1) /* if even */ || argc < 2) { |
51 | bb_show_usage(); |
52 | } |
53 | |
54 | fd = get_console_fd_or_die(); |
55 | |
56 | while (argv[1]) { |
57 | int sc = xstrtoul_range(argv[1], 16, 0, 0xe07f); |
58 | if (sc >= 0xe000) { |
59 | sc -= 0xe000; |
60 | sc += 0x0080; |
61 | } |
62 | a.scancode = sc; |
63 | a.keycode = xatou_range(argv[2], 0, 255); |
64 | ioctl_or_perror_and_die(fd, KDSETKEYCODE, &a, |
65 | "can't set SCANCODE %x to KEYCODE %d", |
66 | sc, a.keycode); |
67 | argv += 2; |
68 | } |
69 | return EXIT_SUCCESS; |
70 | } |
71 |