/*
 * \brief  Mapping from PS/2 Scan-Code Set 2 to unique key codes
 * \author Christian Helmuth
 * \date   2007-09-29
 */

/*
 * Copyright (C) 2007-2013 Genode Labs GmbH
 *
 * This file is part of the Genode OS framework, which is distributed
 * under the terms of the GNU General Public License version 2.
 */

#ifndef _SCAN_CODE_SET_2_H_
#define _SCAN_CODE_SET_2_H_

#include <input/keycodes.h>

enum { SCAN_CODE_SET_2_NUM_KEYS = 256 };

static unsigned short scan_code_set_2[SCAN_CODE_SET_2_NUM_KEYS] = {
	/*  0 */ Input::KEY_UNKNOWN,
	/*  1 */ Input::KEY_F9,
	/*  2 */ Input::KEY_F7,
	/*  3 */ Input::KEY_F5,
	/*  4 */ Input::KEY_F3,
	/*  5 */ Input::KEY_F1,
	/*  6 */ Input::KEY_F2,
	/*  7 */ Input::KEY_F12,
	/*  8 */ Input::KEY_UNKNOWN,
	/*  9 */ Input::KEY_F10,
	/*  a */ Input::KEY_F8,
	/*  b */ Input::KEY_F6,
	/*  c */ Input::KEY_F4,
	/*  d */ Input::KEY_TAB,
	/*  e */ Input::KEY_GRAVE,
	/*  f */ Input::KEY_UNKNOWN,
	/* 10 */ Input::KEY_UNKNOWN,
	/* 11 */ Input::KEY_LEFTALT,
	/* 12 */ Input::KEY_LEFTSHIFT,
	/* 13 */ Input::KEY_UNKNOWN,
	/* 14 */ Input::KEY_LEFTCTRL,
	/* 15 */ Input::KEY_Q,
	/* 16 */ Input::KEY_1,
	/* 17 */ Input::KEY_UNKNOWN,
	/* 18 */ Input::KEY_UNKNOWN,
	/* 19 */ Input::KEY_UNKNOWN,
	/* 1a */ Input::KEY_Z,
	/* 1b */ Input::KEY_S,
	/* 1c */ Input::KEY_A,
	/* 1d */ Input::KEY_W,
	/* 1e */ Input::KEY_2,
	/* 1f */ Input::KEY_UNKNOWN,
	/* 20 */ Input::KEY_UNKNOWN,
	/* 21 */ Input::KEY_C,
	/* 22 */ Input::KEY_X,
	/* 23 */ Input::KEY_D,
	/* 24 */ Input::KEY_E,
	/* 25 */ Input::KEY_4,
	/* 26 */ Input::KEY_3,
	/* 27 */ Input::KEY_UNKNOWN,
	/* 28 */ Input::KEY_UNKNOWN,
	/* 29 */ Input::KEY_SPACE,
	/* 2a */ Input::KEY_V,
	/* 2b */ Input::KEY_F,
	/* 2c */ Input::KEY_T,
	/* 2d */ Input::KEY_R,
	/* 2e */ Input::KEY_5,
	/* 2f */ Input::KEY_UNKNOWN, /* F13? */
	/* 30 */ Input::KEY_UNKNOWN,
	/* 31 */ Input::KEY_N,
	/* 32 */ Input::KEY_B,
	/* 33 */ Input::KEY_H,
	/* 34 */ Input::KEY_G,
	/* 35 */ Input::KEY_Y,
	/* 36 */ Input::KEY_6,
	/* 37 */ Input::KEY_UNKNOWN, /* F14? */
	/* 38 */ Input::KEY_UNKNOWN,
	/* 39 */ Input::KEY_UNKNOWN,
	/* 3a */ Input::KEY_M,
	/* 3b */ Input::KEY_J,
	/* 3c */ Input::KEY_U,
	/* 3d */ Input::KEY_7,
	/* 3e */ Input::KEY_8,
	/* 3f */ Input::KEY_UNKNOWN,
	/* 40 */ Input::KEY_UNKNOWN,
	/* 41 */ Input::KEY_COMMA,
	/* 42 */ Input::KEY_K,
	/* 43 */ Input::KEY_I,
	/* 44 */ Input::KEY_O,
	/* 45 */ Input::KEY_0,
	/* 46 */ Input::KEY_9,
	/* 47 */ Input::KEY_UNKNOWN,
	/* 48 */ Input::KEY_UNKNOWN,
	/* 49 */ Input::KEY_DOT,
	/* 4a */ Input::KEY_SLASH,
	/* 4b */ Input::KEY_L,
	/* 4c */ Input::KEY_SEMICOLON,
	/* 4d */ Input::KEY_P,
	/* 4e */ Input::KEY_MINUS,
	/* 4f */ Input::KEY_UNKNOWN,
	/* 50 */ Input::KEY_UNKNOWN,
	/* 51 */ Input::KEY_UNKNOWN,
	/* 52 */ Input::KEY_APOSTROPHE,
	/* 53 */ Input::KEY_UNKNOWN,
	/* 54 */ Input::KEY_LEFTBRACE,
	/* 55 */ Input::KEY_EQUAL,
	/* 56 */ Input::KEY_UNKNOWN,
	/* 57 */ Input::KEY_UNKNOWN,
	/* 58 */ Input::KEY_CAPSLOCK,
	/* 59 */ Input::KEY_RIGHTSHIFT,
	/* 5a */ Input::KEY_ENTER,
	/* 5b */ Input::KEY_RIGHTBRACE,
	/* 5c */ Input::KEY_UNKNOWN,
	/* 5d */ Input::KEY_BACKSLASH,
	/* 5e */ Input::KEY_UNKNOWN,
	/* 5f */ Input::KEY_UNKNOWN,
	/* 60 */ Input::KEY_UNKNOWN,
	/* 61 */ Input::KEY_102ND,
	/* 62 */ Input::KEY_UNKNOWN,
	/* 63 */ Input::KEY_UNKNOWN,
	/* 64 */ Input::KEY_UNKNOWN,
	/* 65 */ Input::KEY_UNKNOWN,
	/* 66 */ Input::KEY_BACKSPACE,
	/* 67 */ Input::KEY_UNKNOWN,
	/* 68 */ Input::KEY_UNKNOWN,
	/* 69 */ Input::KEY_KP1,
	/* 6a */ Input::KEY_UNKNOWN,
	/* 6b */ Input::KEY_KP4,
	/* 6c */ Input::KEY_KP7,
	/* 6d */ Input::KEY_KPCOMMA,
	/* 6e */ Input::KEY_UNKNOWN,
	/* 6f */ Input::KEY_UNKNOWN,
	/* 70 */ Input::KEY_KP0,
	/* 71 */ Input::KEY_KPDOT,
	/* 72 */ Input::KEY_KP2,
	/* 73 */ Input::KEY_KP5,
	/* 74 */ Input::KEY_KP6,
	/* 75 */ Input::KEY_KP8,
	/* 76 */ Input::KEY_ESC,
	/* 77 */ Input::KEY_NUMLOCK,
	/* 78 */ Input::KEY_F11,
	/* 79 */ Input::KEY_KPPLUS,
	/* 7a */ Input::KEY_KP3,
	/* 7b */ Input::KEY_KPMINUS,
	/* 7c */ Input::KEY_KPASTERISK,
	/* 7d */ Input::KEY_KP9,
	/* 7e */ Input::KEY_SCROLLLOCK,
	/* 7f */ Input::KEY_SYSRQ,
	/* 80 */ Input::KEY_UNKNOWN,
	/* 81 */ Input::KEY_UNKNOWN,
	/* 82 */ Input::KEY_UNKNOWN,
	/* 83 */ Input::KEY_F7,
	/* 84 */ Input::KEY_SYSRQ,
	/* 85 */ Input::KEY_UNKNOWN,
	/* 86 */ Input::KEY_UNKNOWN,
	/* 87 */ Input::KEY_UNKNOWN,
	/* 88 */ Input::KEY_UNKNOWN,
	/* 89 */ Input::KEY_UNKNOWN,
	/* 8a */ Input::KEY_UNKNOWN,
	/* 8b */ Input::KEY_UNKNOWN,
	/* 8c */ Input::KEY_UNKNOWN,
	/* 8d */ Input::KEY_UNKNOWN,
	/* 8e */ Input::KEY_UNKNOWN,
	/* 8f */ Input::KEY_UNKNOWN,
	/* 90 */ Input::KEY_UNKNOWN,
	/* 91 */ Input::KEY_UNKNOWN,
	/* 92 */ Input::KEY_UNKNOWN,
	/* 93 */ Input::KEY_UNKNOWN,
	/* 94 */ Input::KEY_UNKNOWN,
	/* 95 */ Input::KEY_UNKNOWN,
	/* 96 */ Input::KEY_UNKNOWN,
	/* 97 */ Input::KEY_UNKNOWN,
	/* 98 */ Input::KEY_UNKNOWN,
	/* 99 */ Input::KEY_UNKNOWN,
	/* 9a */ Input::KEY_UNKNOWN,
	/* 9b */ Input::KEY_UNKNOWN,
	/* 9c */ Input::KEY_UNKNOWN,
	/* 9d */ Input::KEY_UNKNOWN,
	/* 9e */ Input::KEY_UNKNOWN,
	/* 9f */ Input::KEY_UNKNOWN,
	/* a0 */ Input::KEY_UNKNOWN,
	/* a1 */ Input::KEY_UNKNOWN,
	/* a2 */ Input::KEY_UNKNOWN,
	/* a3 */ Input::KEY_UNKNOWN,
	/* a4 */ Input::KEY_UNKNOWN,
	/* a5 */ Input::KEY_UNKNOWN,
	/* a6 */ Input::KEY_UNKNOWN,
	/* a7 */ Input::KEY_UNKNOWN,
	/* a8 */ Input::KEY_UNKNOWN,
	/* a9 */ Input::KEY_UNKNOWN,
	/* aa */ Input::KEY_UNKNOWN,
	/* ab */ Input::KEY_UNKNOWN,
	/* ac */ Input::KEY_UNKNOWN,
	/* ad */ Input::KEY_UNKNOWN,
	/* ae */ Input::KEY_UNKNOWN,
	/* af */ Input::KEY_UNKNOWN,
	/* b0 */ Input::KEY_UNKNOWN,
	/* b1 */ Input::KEY_UNKNOWN,
	/* b2 */ Input::KEY_UNKNOWN,
	/* b3 */ Input::KEY_UNKNOWN,
	/* b4 */ Input::KEY_UNKNOWN,
	/* b5 */ Input::KEY_UNKNOWN,
	/* b6 */ Input::KEY_UNKNOWN,
	/* b7 */ Input::KEY_UNKNOWN,
	/* b8 */ Input::KEY_UNKNOWN,
	/* b9 */ Input::KEY_UNKNOWN,
	/* ba */ Input::KEY_UNKNOWN,
	/* bb */ Input::KEY_UNKNOWN,
	/* bc */ Input::KEY_UNKNOWN,
	/* bd */ Input::KEY_UNKNOWN,
	/* be */ Input::KEY_UNKNOWN,
	/* bf */ Input::KEY_UNKNOWN,
	/* c0 */ Input::KEY_UNKNOWN,
	/* c1 */ Input::KEY_UNKNOWN,
	/* c2 */ Input::KEY_UNKNOWN,
	/* c3 */ Input::KEY_UNKNOWN,
	/* c4 */ Input::KEY_UNKNOWN,
	/* c5 */ Input::KEY_UNKNOWN,
	/* c6 */ Input::KEY_UNKNOWN,
	/* c7 */ Input::KEY_UNKNOWN,
	/* c8 */ Input::KEY_UNKNOWN,
	/* c9 */ Input::KEY_UNKNOWN,
	/* ca */ Input::KEY_UNKNOWN,
	/* cb */ Input::KEY_UNKNOWN,
	/* cc */ Input::KEY_UNKNOWN,
	/* cd */ Input::KEY_UNKNOWN,
	/* ce */ Input::KEY_UNKNOWN,
	/* cf */ Input::KEY_UNKNOWN,
	/* d0 */ Input::KEY_UNKNOWN,
	/* d1 */ Input::KEY_UNKNOWN,
	/* d2 */ Input::KEY_UNKNOWN,
	/* d3 */ Input::KEY_UNKNOWN,
	/* d4 */ Input::KEY_UNKNOWN,
	/* d5 */ Input::KEY_UNKNOWN,
	/* d6 */ Input::KEY_UNKNOWN,
	/* d7 */ Input::KEY_UNKNOWN,
	/* d8 */ Input::KEY_UNKNOWN,
	/* d9 */ Input::KEY_UNKNOWN,
	/* da */ Input::KEY_UNKNOWN,
	/* db */ Input::KEY_UNKNOWN,
	/* dc */ Input::KEY_UNKNOWN,
	/* dd */ Input::KEY_UNKNOWN,
	/* de */ Input::KEY_UNKNOWN,
	/* df */ Input::KEY_UNKNOWN,
	/* e0 */ Input::KEY_UNKNOWN,
	/* e1 */ Input::KEY_UNKNOWN,
	/* e2 */ Input::KEY_UNKNOWN,
	/* e3 */ Input::KEY_UNKNOWN,
	/* e4 */ Input::KEY_UNKNOWN,
	/* e5 */ Input::KEY_UNKNOWN,
	/* e6 */ Input::KEY_UNKNOWN,
	/* e7 */ Input::KEY_UNKNOWN,
	/* e8 */ Input::KEY_UNKNOWN,
	/* e9 */ Input::KEY_UNKNOWN,
	/* ea */ Input::KEY_UNKNOWN,
	/* eb */ Input::KEY_UNKNOWN,
	/* ec */ Input::KEY_UNKNOWN,
	/* ed */ Input::KEY_UNKNOWN,
	/* ee */ Input::KEY_UNKNOWN,
	/* ef */ Input::KEY_UNKNOWN,
	/* f0 */ Input::KEY_UNKNOWN,
	/* f1 */ Input::KEY_UNKNOWN,
	/* f2 */ Input::KEY_UNKNOWN,
	/* f3 */ Input::KEY_UNKNOWN,
	/* f4 */ Input::KEY_UNKNOWN,
	/* f5 */ Input::KEY_UNKNOWN,
	/* f6 */ Input::KEY_UNKNOWN,
	/* f7 */ Input::KEY_UNKNOWN,
	/* f8 */ Input::KEY_UNKNOWN,
	/* f9 */ Input::KEY_UNKNOWN,
	/* fa */ Input::KEY_UNKNOWN,
	/* fb */ Input::KEY_UNKNOWN,
	/* fc */ Input::KEY_UNKNOWN,
	/* fd */ Input::KEY_UNKNOWN,
	/* fe */ Input::KEY_UNKNOWN,
	/* ff */ Input::KEY_UNKNOWN,
};


/**
 * Scan-code table for keys with extended scan code
 */
static unsigned short scan_code_set_2_ext[SCAN_CODE_SET_2_NUM_KEYS];


/**
 * Init scan_code_set_2_ext table
 */
inline void init_scan_code_set_2_ext()
{
	for (int i = 0; i < SCAN_CODE_SET_2_NUM_KEYS; i++)
		scan_code_set_2_ext[i] = Input::KEY_UNKNOWN;

	scan_code_set_2_ext[0x11] = Input::KEY_RIGHTALT;
	scan_code_set_2_ext[0x12] = Input::KEY_RESERVED;  /* sometimes used as num-lock indicator */
	scan_code_set_2_ext[0x14] = Input::KEY_RIGHTCTRL;
	scan_code_set_2_ext[0x1f] = Input::KEY_LEFTMETA;
	scan_code_set_2_ext[0x27] = Input::KEY_RIGHTMETA;
	scan_code_set_2_ext[0x2f] = Input::KEY_COMPOSE;
	scan_code_set_2_ext[0x37] = Input::KEY_POWER;
	scan_code_set_2_ext[0x3f] = Input::KEY_SLEEP;
	scan_code_set_2_ext[0x4a] = Input::KEY_KPSLASH;
	scan_code_set_2_ext[0x5a] = Input::KEY_KPENTER;
	scan_code_set_2_ext[0x5e] = Input::KEY_WAKEUP;
	scan_code_set_2_ext[0x69] = Input::KEY_END;
	scan_code_set_2_ext[0x6b] = Input::KEY_LEFT;
	scan_code_set_2_ext[0x6c] = Input::KEY_HOME;
	scan_code_set_2_ext[0x70] = Input::KEY_INSERT;
	scan_code_set_2_ext[0x71] = Input::KEY_DELETE;
	scan_code_set_2_ext[0x72] = Input::KEY_DOWN;
	scan_code_set_2_ext[0x74] = Input::KEY_RIGHT;
	scan_code_set_2_ext[0x75] = Input::KEY_UP;
	scan_code_set_2_ext[0x77] = Input::KEY_PAUSE;     /* put here although it's prefixed with 0xe1 0x14 */
	scan_code_set_2_ext[0x7a] = Input::KEY_PAGEDOWN;
	scan_code_set_2_ext[0x7c] = Input::KEY_SYSRQ;
	scan_code_set_2_ext[0x7d] = Input::KEY_PAGEUP;
	scan_code_set_2_ext[0x7e] = Input::KEY_PAUSE;     /* emitted if CTRL is pressed too */
};

#endif /* _SCAN_CODE_SET_2_H_ */
