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:       help
  15//config:       This program loads entries into the kernel's scancode-to-keycode
  16//config:       map, allowing unusual keyboards to generate usable keycodes.
  17
  18//applet:IF_SETKEYCODES(APPLET_NOEXEC(setkeycodes, setkeycodes, BB_DIR_USR_BIN, BB_SUID_DROP, setkeycodes))
  19
  20//kbuild:lib-$(CONFIG_SETKEYCODES) += setkeycodes.o
  21
  22//usage:#define setkeycodes_trivial_usage
  23//usage:       "{ SCANCODE KEYCODE }..."
  24//usage:#define setkeycodes_full_usage "\n\n"
  25//usage:       "Modify kernel's scancode-to-keycode map,\n"
  26//usage:       "allowing unusual keyboards to generate usable keycodes.\n\n"
  27//usage:       "SCANCODE is either xx or e0xx (hexadecimal), KEYCODE is decimal."
  28//usage:
  29//usage:#define setkeycodes_example_usage
  30//usage:       "$ setkeycodes e030 127\n"
  31
  32#include "libbb.h"
  33
  34/* From <linux/kd.h> */
  35struct kbkeycode {
  36        unsigned scancode, keycode;
  37};
  38enum {
  39        KDSETKEYCODE = 0x4B4D  /* write kernel keycode table entry */
  40};
  41
  42int setkeycodes_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  43int setkeycodes_main(int argc, char **argv)
  44{
  45        int fd;
  46
  47        if (!(argc & 1) /* if even */ || argc < 2) {
  48                bb_show_usage();
  49        }
  50
  51        fd = get_console_fd_or_die();
  52
  53        while (argv[1]) {
  54                struct kbkeycode a;
  55                int sc;
  56
  57                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