Date: Tue, 15 Jul 2014 10:38:05 +0000 (UTC) From: Jakub Wojciech Klama <jceel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r268666 - user/jceel/soc2014_evdev/head/sys/dev/evdev Message-ID: <201407151038.s6FAc52N085177@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jceel Date: Tue Jul 15 10:38:05 2014 New Revision: 268666 URL: http://svnweb.freebsd.org/changeset/base/268666 Log: Add routine translating scancodes to evdev key codes. Modified: user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev_utils.c Modified: user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev_utils.c ============================================================================== --- user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev_utils.c Tue Jul 15 10:34:21 2014 (r268665) +++ user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev_utils.c Tue Jul 15 10:38:05 2014 (r268666) @@ -110,10 +110,36 @@ static uint16_t evdev_usb_scancodes[256] }; -static uint16_t evdev_at_set1_scancodes[256] = { - NONE, +static uint16_t evdev_at_set1_scancodes[] = { + /* 0x00 - 0x1f */ + NONE, KEY_ESC, KEY_1, KEY_2, + KEY_3, KEY_4, KEY_5, KEY_6, + KEY_7, KEY_8, KEY_9, KEY_0, + KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_TAB, + KEY_Q, KEY_W, KEY_E, KEY_R, + KEY_T, KEY_Y, KEY_U, KEY_I, + KEY_O, KEY_P, KEY_LEFTBRACE, KEY_RIGHTBRACE, + KEY_ENTER, KEY_LEFTCTRL, KEY_A, KEY_S, + /* 0x20 - 0x3f */ + KEY_D, KEY_F, KEY_G, KEY_H, + KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, + KEY_APOSTROPHE, KEY_GRAVE, KEY_LEFTSHIFT, KEY_BACKSLASH, + KEY_Z, KEY_X, KEY_C, KEY_V, + KEY_B, KEY_N, KEY_M, KEY_COMMA, + KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, NONE, + KEY_LEFTALT, KEY_SPACE, KEY_CAPSLOCK, KEY_F1, + KEY_F2, KEY_F3, KEY_F4, KEY_F5, + /* 0x40 - 0x5f */ + KEY_F6, KEY_F7, KEY_F8, KEY_F9, + KEY_F10, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_KP7, + KEY_KP8, KEY_KP9, KEY_KPMINUS, KEY_KP4, + KEY_KP5, KEY_KP6, KEY_KPPLUS, KEY_KP1, + KEY_KP2, KEY_KP3, KEY_KP0, KEY_KPDOT, + NONE, NONE, NONE, KEY_F11, + KEY_F12, NONE, NONE, NONE, + NONE, NONE, NONE, NONE, }; - + inline uint16_t evdev_hid2key(int scancode) @@ -122,7 +148,114 @@ evdev_hid2key(int scancode) } inline uint16_t -evdev_at2key(int scancode) +evdev_scancode2key(int *state, int scancode) { - return evdev_at_set1_scancodes[scancode]; + uint16_t keycode; + + /* translate the scan code into a keycode */ + keycode = evdev_at_set1_scancodes[scancode & 0x7f]; + switch (*state) { + case 0x00: /* normal scancode */ + switch(scancode) { + case 0xE0: + case 0xE1: + *state = scancode; + return (NONE); + } + break; + case 0xE0: /* 0xE0 prefix */ + *state = 0; + switch (scancode & 0x7f) { + case 0x1C: /* right enter key */ + keycode = KEY_KPENTER; + break; + case 0x1D: /* right ctrl key */ + keycode = KEY_RIGHTCTRL; + break; + case 0x35: /* keypad divide key */ + keycode = KEY_KPASTERISK; + break; + case 0x37: /* print scrn key */ + keycode = KEY_SYSRQ; + break; + case 0x38: /* right alt key (alt gr) */ + keycode = KEY_RIGHTALT; + break; + case 0x46: /* ctrl-pause/break on AT 101 (see below) */ + keycode = KEY_PAUSE; + break; + case 0x47: /* grey home key */ + keycode = KEY_HOME; + break; + case 0x48: /* grey up arrow key */ + keycode = KEY_UP; + break; + case 0x49: /* grey page up key */ + keycode = KEY_PAGEUP; + break; + case 0x4B: /* grey left arrow key */ + keycode = KEY_LEFT; + break; + case 0x4D: /* grey right arrow key */ + keycode = KEY_RIGHT; + break; + case 0x4F: /* grey end key */ + keycode = KEY_END; + break; + case 0x50: /* grey down arrow key */ + keycode = KEY_DOWN; + break; + case 0x51: /* grey page down key */ + keycode = KEY_PAGEDOWN; + break; + case 0x52: /* grey insert key */ + keycode = KEY_INSERT; + break; + case 0x53: /* grey delete key */ + keycode = KEY_DELETE; + break; + /* the following 3 are only used on the MS "Natural" keyboard */ + case 0x5b: /* left Window key */ + keycode = KEY_LEFTMETA; + break; + case 0x5c: /* right Window key */ + keycode = KEY_RIGHTMETA; + break; + case 0x5d: /* menu key */ + keycode = KEY_MENU; + break; + case 0x5e: /* power key */ + keycode = KEY_POWER; + break; + case 0x5f: /* sleep key */ + keycode = KEY_SLEEP; + break; + case 0x63: /* wake key */ + keycode = KEY_WAKEUP; + break; + default: /* ignore everything else */ + return (NONE); + } + break; + case 0xE1: /* 0xE1 prefix */ + /* + * The pause/break key on the 101 keyboard produces: + * E1-1D-45 E1-9D-C5 + * Ctrl-pause/break produces: + * E0-46 E0-C6 (See above.) + */ + *state = 0; + if ((scancode & 0x7f) == 0x1D) + *state = 0x1D; + return (NONE); + /* NOT REACHED */ + case 0x1D: /* pause / break */ + *state = 0; + if (scancode != 0x45) + return (NONE); + keycode = KEY_PAUSE; + break; + } + + return (keycode); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407151038.s6FAc52N085177>