/* $NetBSD: linux_keymap.c,v 1.2 2017/08/31 19:55:43 jmcneill Exp $ */

/*-
* Copyright (c) 1997-2017 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Juergen Hannken-Illjes and Jared McNeill.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: linux_keymap.c,v 1.2 2017/08/31 19:55:43 jmcneill Exp $");

#include <sys/types.h>
#include <dev/wscons/linux_keymap.h>

static const uint8_t linux_key_to_usb_map[] = {
       [0  ] /*         KEY_RESERVED */ =      0x00,
       [1  ] /*              KEY_ESC */ =      0x29,
       [2  ] /*                KEY_1 */ =      0x1e,
       [3  ] /*                KEY_2 */ =      0x1f,
       [4  ] /*                KEY_3 */ =      0x20,
       [5  ] /*                KEY_4 */ =      0x21,
       [6  ] /*                KEY_5 */ =      0x22,
       [7  ] /*                KEY_6 */ =      0x23,
       [8  ] /*                KEY_7 */ =      0x24,
       [9  ] /*                KEY_8 */ =      0x25,
       [10 ] /*                KEY_9 */ =      0x26,
       [11 ] /*                KEY_0 */ =      0x27,
       [12 ] /*            KEY_MINUS */ =      0x2d,
       [13 ] /*            KEY_EQUAL */ =      0x2e,
       [14 ] /*        KEY_BACKSPACE */ =      0x2a,
       [15 ] /*              KEY_TAB */ =      0x2b,
       [16 ] /*                KEY_Q */ =      0x14,
       [17 ] /*                KEY_W */ =      0x1a,
       [18 ] /*                KEY_E */ =      0x08,
       [19 ] /*                KEY_R */ =      0x15,
       [20 ] /*                KEY_T */ =      0x17,
       [21 ] /*                KEY_Y */ =      0x1c,
       [22 ] /*                KEY_U */ =      0x18,
       [23 ] /*                KEY_I */ =      0x0c,
       [24 ] /*                KEY_O */ =      0x12,
       [25 ] /*                KEY_P */ =      0x13,
       [26 ] /*        KEY_LEFTBRACE */ =      0x2f,
       [27 ] /*       KEY_RIGHTBRACE */ =      0x30,
       [28 ] /*            KEY_ENTER */ =      0x28,
       [29 ] /*         KEY_LEFTCTRL */ =      0xe0,
       [30 ] /*                KEY_A */ =      0x04,
       [31 ] /*                KEY_S */ =      0x16,
       [32 ] /*                KEY_D */ =      0x07,
       [33 ] /*                KEY_F */ =      0x09,
       [34 ] /*                KEY_G */ =      0x0a,
       [35 ] /*                KEY_H */ =      0x0b,
       [36 ] /*                KEY_J */ =      0x0d,
       [37 ] /*                KEY_K */ =      0x0e,
       [38 ] /*                KEY_L */ =      0x0f,
       [39 ] /*        KEY_SEMICOLON */ =      0x33,
       [40 ] /*       KEY_APOSTROPHE */ =      0x34,
       [41 ] /*            KEY_GRAVE */ =      0x35,
       [42 ] /*        KEY_LEFTSHIFT */ =      0xe1,
       [43 ] /*        KEY_BACKSLASH */ =      0x31,
       [44 ] /*                KEY_Z */ =      0x1d,
       [45 ] /*                KEY_X */ =      0x1b,
       [46 ] /*                KEY_C */ =      0x06,
       [47 ] /*                KEY_V */ =      0x19,
       [48 ] /*                KEY_B */ =      0x05,
       [49 ] /*                KEY_N */ =      0x11,
       [50 ] /*                KEY_M */ =      0x10,
       [51 ] /*            KEY_COMMA */ =      0x36,
       [52 ] /*              KEY_DOT */ =      0x37,
       [53 ] /*            KEY_SLASH */ =      0x38,
       [54 ] /*       KEY_RIGHTSHIFT */ =      0xe5,
       [55 ] /*       KEY_KPASTERISK */ =      0x55,
       [56 ] /*          KEY_LEFTALT */ =      0xe2,
       [57 ] /*            KEY_SPACE */ =      0x2c,
       [58 ] /*         KEY_CAPSLOCK */ =      0x39,
       [59 ] /*               KEY_F1 */ =      0x3a,
       [60 ] /*               KEY_F2 */ =      0x3b,
       [61 ] /*               KEY_F3 */ =      0x3c,
       [62 ] /*               KEY_F4 */ =      0x3d,
       [63 ] /*               KEY_F5 */ =      0x3e,
       [64 ] /*               KEY_F6 */ =      0x3f,
       [65 ] /*               KEY_F7 */ =      0x40,
       [66 ] /*               KEY_F8 */ =      0x41,
       [67 ] /*               KEY_F9 */ =      0x42,
       [68 ] /*              KEY_F10 */ =      0x43,
       [69 ] /*          KEY_NUMLOCK */ =      0x53,
       [70 ] /*       KEY_SCROLLLOCK */ =      0x47,
       [71 ] /*              KEY_KP7 */ =      0x5f,
       [72 ] /*              KEY_KP8 */ =      0x60,
       [73 ] /*              KEY_KP9 */ =      0x61,
       [74 ] /*          KEY_KPMINUS */ =      0x56,
       [75 ] /*              KEY_KP4 */ =      0x5c,
       [76 ] /*              KEY_KP5 */ =      0x5d,
       [77 ] /*              KEY_KP6 */ =      0x5e,
       [78 ] /*           KEY_KPPLUS */ =      0x57,
       [79 ] /*              KEY_KP1 */ =      0x59,
       [80 ] /*              KEY_KP2 */ =      0x5a,
       [81 ] /*              KEY_KP3 */ =      0x5b,
       [82 ] /*              KEY_KP0 */ =      0x62,
       [83 ] /*            KEY_KPDOT */ =      0x63,
       [85 ] /*   KEY_ZENKAKUHANKAKU */ =      0x94,
#if 0
       [86 ] /*            KEY_102ND */ =      ???
#endif
       [87 ] /*              KEY_F11 */ =      0x44,
       [88 ] /*              KEY_F12 */ =      0x45,
       [89 ] /*               KEY_RO */ =      0x87,
       [90 ] /*         KEY_KATAKANA */ =      0x92,
       [91 ] /*         KEY_HIRAGANA */ =      0x93,
       [92 ] /*           KEY_HENKAN */ =      0x8a,
       [93 ] /* KEY_KATAKANAHIRAGANA */ =      0x88,
       [94 ] /*         KEY_MUHENKAN */ =      0x8b,
       [95 ] /*        KEY_KPJPCOMMA */ =      0x8c,
       [96 ] /*          KEY_KPENTER */ =      0x58,
       [97 ] /*        KEY_RIGHTCTRL */ =      0xe4,
       [98 ] /*          KEY_KPSLASH */ =      0x54,
       [99 ] /*            KEY_SYSRQ */ =      0x9a,
       [100] /*         KEY_RIGHTALT */ =      0xe6,
#if 0
       [101] /*         KEY_LINEFEED */ =      ???
#endif
       [102] /*             KEY_HOME */ =      0x4a,
       [103] /*               KEY_UP */ =      0x52,
       [104] /*           KEY_PAGEUP */ =      0x4b,
       [105] /*             KEY_LEFT */ =      0x50,
       [106] /*            KEY_RIGHT */ =      0x4f,
       [107] /*              KEY_END */ =      0x4d,
       [108] /*             KEY_DOWN */ =      0x51,
       [109] /*         KEY_PAGEDOWN */ =      0x4e,
       [110] /*           KEY_INSERT */ =      0x49,
       [111] /*           KEY_DELETE */ =      0x4c,
#if 0
       [112] /*            KEY_MACRO */ =      ???
#endif
       [113] /*             KEY_MUTE */ =      0x7f,
       [114] /*       KEY_VOLUMEDOWN */ =      0x81,
       [115] /*         KEY_VOLUMEUP */ =      0x80,
       [116] /*            KEY_POWER */ =      0x66,
       [117] /*          KEY_KPEQUAL */ =      0x67,
#if 0
       [118] /*      KEY_KPPLUSMINUS */ =      ???
#endif
       [119] /*            KEY_PAUSE */ =      0x48,
#if 0
       [120] /*            KEY_SCALE */ =      ???
#endif
       [121] /*          KEY_KPCOMMA */ =      0x85,
       [122] /*          KEY_HANGEUL */ =      0x90,
       [123] /*            KEY_HANJA */ =      0x91,
       [124] /*              KEY_YEN */ =      0x89,
       [125] /*         KEY_LEFTMETA */ =      0xe3,
       [126] /*        KEY_RIGHTMETA */ =      0xe7,
#if 0
       [127] /*          KEY_COMPOSE */ =      ???
#endif
};

uint8_t
linux_key_to_usb(u_int code)
{
       if (code >= __arraycount(linux_key_to_usb_map))
               return 0x00;    /* No Event */
       return linux_key_to_usb_map[code];
}