busybox/console-tools/setkeycodes.c
<<
>>
Prefs
   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 (2.1 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