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 (1.7 kb)" 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_NOEXEC(setkeycodes, setkeycodes, BB_DIR_USR_BIN, BB_SUID_DROP, setkeycodes)) 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: "Modify kernel's scancode-to-keycode map,\n" 27//usage: "allowing unusual keyboards to generate usable keycodes.\n\n" 28//usage: "SCANCODE is either xx or e0xx (hexadecimal), KEYCODE is decimal." 29//usage: 30//usage:#define setkeycodes_example_usage 31//usage: "$ setkeycodes e030 127\n" 32 33#include "libbb.h" 34 35/* From <linux/kd.h> */ 36struct kbkeycode { 37 unsigned scancode, keycode; 38}; 39enum { 40 KDSETKEYCODE = 0x4B4D /* write kernel keycode table entry */ 41}; 42 43int setkeycodes_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 44int setkeycodes_main(int argc, char **argv) 45{ 46 int fd; 47 48 if (!(argc & 1) /* if even */ || argc < 2) { 49 bb_show_usage(); 50 } 51 52 fd = get_console_fd_or_die(); 53 54 while (argv[1]) { 55 struct kbkeycode a; 56 int sc; 57 58 sc = xstrtoul_range(argv[1], 16, 0, 0xe07f); 59 if (sc >= 0xe000) { 60 sc -= 0xe000; 61 sc += 0x0080; 62 } 63 a.scancode = sc; 64 a.keycode = xatou_range(argv[2], 0, 255); 65 ioctl_or_perror_and_die(fd, KDSETKEYCODE, &a, 66 "can't set SCANCODE %x to KEYCODE %d", 67 sc, a.keycode); 68 argv += 2; 69 } 70 return EXIT_SUCCESS; 71} 72