#ifndef _MINIX_KEYMAP_H #define _MINIX_KEYMAP_H #include "type.h" #ifdef _SYSTEM /* Device type. */ #define INPUT_DEV_KBD 0x01 /* keyboard device */ #define INPUT_DEV_MOUSE 0x02 /* mouse device */ /* Known-invalid input device ID. */ #define INVALID_INPUT_ID (-1) #endif /* _SYSTEM */ /* * The input server heavily draws on the USB HID specification for events. * Every driver should convert its event codes into this format. This also * implies that we use the U.S. keyboard layout for key events. The mapping to * localized keyboard layouts will be done at a different place (TTY, Xserver). */ /* A single event, as read from one of the input devices. */ struct input_event { u16 page; /* event page (INPUT_PAGE_) */ u16 code; /* page-specific event code */ i32 value; /* event value */ u16 flags; /* event flags (INPUT_FLAG_) */ u16 devid; /* identifier of source device */ u16 rsvd[2]; /* reserved for a future timestamp */ }; /* Event pages. */ #define INPUT_PAGE_GD 0x0001 /* General Desktop page */ #define INPUT_PAGE_KEY 0x0007 /* Keyboard/Keypad page */ #define INPUT_PAGE_LED 0x0008 /* LED page */ #define INPUT_PAGE_BUTTON 0x0009 /* Button page */ #define INPUT_PAGE_CONS 0x000C /* Consumer page */ /* Event values. Not exhaustive. */ #define INPUT_RELEASE 0 #define INPUT_PRESS 1 /* Event flags. */ #define INPUT_FLAG_ABS 0x00 /* absolute value (the default) */ #define INPUT_FLAG_REL 0x04 /* relative value */ /* Page-specific event codes. */ enum { INPUT_GD_X = 0x0030, INPUT_GD_Y, INPUT_GD_SYSTEM_POWER_DOWN = 0x0081, INPUT_GD_SYSTEM_SLEEP, INPUT_GD_SYSTEM_WAKE_UP }; enum { INPUT_KEY_A = 0x0004, INPUT_KEY_B, INPUT_KEY_C, INPUT_KEY_D, INPUT_KEY_E, INPUT_KEY_F, INPUT_KEY_G, INPUT_KEY_H, INPUT_KEY_I, INPUT_KEY_J, INPUT_KEY_K, INPUT_KEY_L, INPUT_KEY_M, INPUT_KEY_N, INPUT_KEY_O, INPUT_KEY_P, INPUT_KEY_Q, INPUT_KEY_R, INPUT_KEY_S, INPUT_KEY_T, INPUT_KEY_U, INPUT_KEY_V, INPUT_KEY_W, INPUT_KEY_X, INPUT_KEY_Y, INPUT_KEY_Z, INPUT_KEY_1, INPUT_KEY_2, INPUT_KEY_3, INPUT_KEY_4, INPUT_KEY_5, INPUT_KEY_6, INPUT_KEY_7, INPUT_KEY_8, INPUT_KEY_9, INPUT_KEY_0, INPUT_KEY_ENTER, INPUT_KEY_ESCAPE, INPUT_KEY_BACKSPACE, INPUT_KEY_TAB, INPUT_KEY_SPACEBAR, INPUT_KEY_DASH, INPUT_KEY_EQUAL, INPUT_KEY_OPEN_BRACKET, INPUT_KEY_CLOSE_BRACKET, INPUT_KEY_BACKSLASH, INPUT_KEY_EUROPE_1, INPUT_KEY_SEMICOLON, INPUT_KEY_APOSTROPH, INPUT_KEY_GRAVE_ACCENT, INPUT_KEY_COMMA, INPUT_KEY_PERIOD, INPUT_KEY_SLASH, INPUT_KEY_CAPS_LOCK, INPUT_KEY_F1, INPUT_KEY_F2, INPUT_KEY_F3, INPUT_KEY_F4, INPUT_KEY_F5, INPUT_KEY_F6, INPUT_KEY_F7, INPUT_KEY_F8, INPUT_KEY_F9, INPUT_KEY_F10, INPUT_KEY_F11, INPUT_KEY_F12, INPUT_KEY_PRINT_SCREEN, INPUT_KEY_SCROLL_LOCK, INPUT_KEY_PAUSE, INPUT_KEY_INSERT, INPUT_KEY_HOME, INPUT_KEY_PAGE_UP, INPUT_KEY_DELETE, INPUT_KEY_END, INPUT_KEY_PAGE_DOWN, INPUT_KEY_RIGHT_ARROW, INPUT_KEY_LEFT_ARROW, INPUT_KEY_DOWN_ARROW, INPUT_KEY_UP_ARROW, INPUT_KEY_NUM_LOCK, INPUT_KEY_KP_SLASH, INPUT_KEY_KP_STAR, INPUT_KEY_KP_DASH, INPUT_KEY_KP_PLUS, INPUT_KEY_KP_ENTER, INPUT_KEY_KP_1, INPUT_KEY_KP_2, INPUT_KEY_KP_3, INPUT_KEY_KP_4, INPUT_KEY_KP_5, INPUT_KEY_KP_6, INPUT_KEY_KP_7, INPUT_KEY_KP_8, INPUT_KEY_KP_9, INPUT_KEY_KP_0, INPUT_KEY_KP_PERIOD, INPUT_KEY_EUROPE_2, INPUT_KEY_APPLICATION, INPUT_KEY_POWER, INPUT_KEY_KP_EQUAL, INPUT_KEY_F13, INPUT_KEY_F14, INPUT_KEY_F15, INPUT_KEY_F16, INPUT_KEY_F17, INPUT_KEY_F18, INPUT_KEY_F19, INPUT_KEY_F20, INPUT_KEY_F21, INPUT_KEY_F22, INPUT_KEY_F23, INPUT_KEY_F24, INPUT_KEY_EXECUTE, INPUT_KEY_HELP, INPUT_KEY_MENU, INPUT_KEY_SELECT, INPUT_KEY_STOP, INPUT_KEY_AGAIN, INPUT_KEY_UNDO, INPUT_KEY_CUT, INPUT_KEY_COPY, INPUT_KEY_PASTE, INPUT_KEY_FIND, INPUT_KEY_MUTE, INPUT_KEY_VOLUME_UP, INPUT_KEY_VOLUME_DOWN, INPUT_KEY_LOCKING_CAPS_LOCK, INPUT_KEY_LOCKING_NUM_LOCK, INPUT_KEY_LOCKING_SCROLL_LOCK, INPUT_KEY_KP_COMMA, INPUT_KEY_EQUAL_SIGN, INPUT_KEY_I10L_1, INPUT_KEY_I10L_2, INPUT_KEY_I10L_3, INPUT_KEY_I10L_4, INPUT_KEY_I10L_5, INPUT_KEY_I10L_6, INPUT_KEY_I10L_7, INPUT_KEY_I10L_8, INPUT_KEY_I10L_9, INPUT_KEY_LANG_1, INPUT_KEY_LANG_2, INPUT_KEY_LANG_3, INPUT_KEY_LANG_4, INPUT_KEY_LANG_5, INPUT_KEY_LANG_6, INPUT_KEY_LANG_7, INPUT_KEY_LANG_8, INPUT_KEY_LANG_9, INPUT_KEY_ALT_ERASE, INPUT_KEY_SYSREQ, INPUT_KEY_CANCEL, INPUT_KEY_CLEAR, INPUT_KEY_PRIOR, INPUT_KEY_RETURN, INPUT_KEY_SEPARATOR, INPUT_KEY_OUT, INPUT_KEY_OPER, INPUT_KEY_CLEAR_AGAIN, INPUT_KEY_CR_SEL, INPUT_KEY_EX_SEL, /* 0x00A5 -- 0x00AF RESERVED */ INPUT_KEY_KP_00 = 0x00B0, INPUT_KEY_KP_000, INPUT_KEY_THOUSANDS_SEP, INPUT_KEY_DECIMAL_SEP, INPUT_KEY_CURRENCY_UNIT, INPUT_KEY_CURRENCY_SUBUNIT, INPUT_KEY_KP_OPEN_PARENTHESIS, INPUT_KEY_KP_CLOSE_PARENTHESIS, INPUT_KEY_KP_OPEN_BRACE, INPUT_KEY_KP_CLOSE_BRACE, INPUT_KEY_KP_TAB, INPUT_KEY_KP_BACKSPACE, INPUT_KEY_KP_A, INPUT_KEY_KP_B, INPUT_KEY_KP_C, INPUT_KEY_KP_D, INPUT_KEY_KP_E, INPUT_KEY_KP_F, INPUT_KEY_KP_XOR, INPUT_KEY_KP_CARET, INPUT_KEY_KP_PERCENT, INPUT_KEY_KP_SMALLER_THEN, INPUT_KEY_KP_GREATER_THEN, INPUT_KEY_KP_AMP, INPUT_KEY_KP_DOUBLE_AMP, INPUT_KEY_KP_PIPE, INPUT_KEY_KP_DOUBLE_PIPE, INPUT_KEY_KP_COLON, INPUT_KEY_KP_NUMBER, INPUT_KEY_KP_SPACE, INPUT_KEY_KP_AT, INPUT_KEY_KP_EXCLAMATION_MARK, INPUT_KEY_KP_MEM_STORE, INPUT_KEY_KP_MEM_RECALL, INPUT_KEY_KP_MEM_CLEAR, INPUT_KEY_KP_MEM_ADD, INPUT_KEY_KP_MEM_SUBTRACT, INPUT_KEY_KP_MEM_MULTIPLY, INPUT_KEY_KP_MEM_DIVIDE, INPUT_KEY_KP_PLUS_MINUS, INPUT_KEY_KP_CLEAR, INPUT_KEY_KP_CLEAR_ENTRY, INPUT_KEY_KP_BIN, INPUT_KEY_KP_OCT, INPUT_KEY_KP_DEC, INPUT_KEY_KP_HEX, /* 0x00DE, 0x00DF RESERVED */ INPUT_KEY_LEFT_CTRL = 0x00E0, INPUT_KEY_LEFT_SHIFT, INPUT_KEY_LEFT_ALT, INPUT_KEY_LEFT_GUI, INPUT_KEY_RIGHT_CTRL, INPUT_KEY_RIGHT_SHIFT, INPUT_KEY_RIGHT_ALT, INPUT_KEY_RIGHT_GUI /* 0x00E8 -- 0xFFFF RESERVED */ }; enum { INPUT_LED_NUMLOCK = 0x0001, INPUT_LED_CAPSLOCK, INPUT_LED_SCROLLLOCK }; enum { INPUT_BUTTON_1 = 0x0001, }; enum { INPUT_CONS_SCAN_NEXT_TRACK = 0x00B5, INPUT_CONS_SCAN_PREVIOUS_TRACK, INPUT_CONS_STOP, INPUT_CONS_PLAY_PAUSE = 0x00CD, INPUT_CONS_MUTE = 0x00E2, INPUT_CONS_VOLUME_UP = 0x00E9, INPUT_CONS_VOLUME_DOWN, INPUT_CONS_AL_MEDIA_SELECT = 0x0183, INPUT_CONS_AL_EMAIL_READER = 0x018A, INPUT_CONS_AL_CALCULATOR = 0x0192, INPUT_CONS_AL_LOCAL_BROWSER = 0x0194, INPUT_CONS_AC_SEARCH = 0x0221, INPUT_CONS_AC_GO_TO, INPUT_CONS_AC_HOME, INPUT_CONS_AC_BACK, INPUT_CONS_AC_FORWARD, INPUT_CONS_AC_STOP, INPUT_CONS_AC_REFRESH, INPUT_CONS_AC_BOOKMARKS = 0x022A }; /* Standard and AT keyboard. (PS/2 MCA implies AT throughout.) */ #define KEYBD 0x60 /* I/O port for keyboard data */ /* AT keyboard. */ #define KB_COMMAND 0x64 /* I/O port for commands on AT */ #define KB_STATUS 0x64 /* I/O port for status on AT */ #define KB_ACK 0xFA /* keyboard ack response */ #define KB_AUX_BYTE 0x20 /* Auxiliary Device Output Buffer Full */ #define KB_OUT_FULL 0x01 /* status bit set when keypress char pending */ #define KB_IN_FULL 0x02 /* status bit set when not ready to receive */ #define KBC_RD_RAM_CCB 0x20 /* Read controller command byte */ #define KBC_WR_RAM_CCB 0x60 /* Write controller command byte */ #define KBC_DI_AUX 0xA7 /* Disable Auxiliary Device */ #define KBC_EN_AUX 0xA8 /* Enable Auxiliary Device */ #define KBC_DI_KBD 0xAD /* Disable Keybard Interface */ #define KBC_EN_KBD 0xAE /* Enable Keybard Interface */ #define LED_CODE 0xED /* command to keyboard to set LEDs */ #define KBC_WAIT_TIME 100000 /* wait this many usecs for a status update */ #define KBC_READ_TIME 1000000 /* wait this many usecs for a result byte */ #define KBC_IN_DELAY 7 /* wait 7 microseconds when polling */ #define KBD_OUT_BUFSZ 16 /* Output buffer for data to the keyboard. */ #define KBD_SCAN_CODES 0x80 #define SCAN_RELEASE 0x80 #define SCAN_CTRL 0x1D #define SCAN_NUMLOCK 0x45 #define SCAN_EXT0 0xE0 #define SCAN_EXT1 0xE1 #define LED_SCROLL_LOCK 0x01 #define LED_NUM_LOCK 0x02 #define LED_CAPS_LOCK 0x04 struct scanmap { u16 page; u16 code; }; const static struct scanmap scanmap_normal[KBD_SCAN_CODES] = { [0x01] = { INPUT_PAGE_KEY, INPUT_KEY_ESCAPE }, [0x02] = { INPUT_PAGE_KEY, INPUT_KEY_1 }, [0x03] = { INPUT_PAGE_KEY, INPUT_KEY_2 }, [0x04] = { INPUT_PAGE_KEY, INPUT_KEY_3 }, [0x05] = { INPUT_PAGE_KEY, INPUT_KEY_4 }, [0x06] = { INPUT_PAGE_KEY, INPUT_KEY_5 }, [0x07] = { INPUT_PAGE_KEY, INPUT_KEY_6 }, [0x08] = { INPUT_PAGE_KEY, INPUT_KEY_7 }, [0x09] = { INPUT_PAGE_KEY, INPUT_KEY_8 }, [0x0A] = { INPUT_PAGE_KEY, INPUT_KEY_9 }, [0x0B] = { INPUT_PAGE_KEY, INPUT_KEY_0 }, [0x0C] = { INPUT_PAGE_KEY, INPUT_KEY_DASH }, [0x0D] = { INPUT_PAGE_KEY, INPUT_KEY_EQUAL }, [0x0E] = { INPUT_PAGE_KEY, INPUT_KEY_BACKSPACE }, [0x0F] = { INPUT_PAGE_KEY, INPUT_KEY_TAB }, [0x10] = { INPUT_PAGE_KEY, INPUT_KEY_Q }, [0x11] = { INPUT_PAGE_KEY, INPUT_KEY_W }, [0x12] = { INPUT_PAGE_KEY, INPUT_KEY_E }, [0x13] = { INPUT_PAGE_KEY, INPUT_KEY_R }, [0x14] = { INPUT_PAGE_KEY, INPUT_KEY_T }, [0x15] = { INPUT_PAGE_KEY, INPUT_KEY_Y }, [0x16] = { INPUT_PAGE_KEY, INPUT_KEY_U }, [0x17] = { INPUT_PAGE_KEY, INPUT_KEY_I }, [0x18] = { INPUT_PAGE_KEY, INPUT_KEY_O }, [0x19] = { INPUT_PAGE_KEY, INPUT_KEY_P }, [0x1A] = { INPUT_PAGE_KEY, INPUT_KEY_OPEN_BRACKET }, [0x1B] = { INPUT_PAGE_KEY, INPUT_KEY_CLOSE_BRACKET }, [0x1C] = { INPUT_PAGE_KEY, INPUT_KEY_ENTER }, [0x1D] = { INPUT_PAGE_KEY, INPUT_KEY_LEFT_CTRL }, [0x1E] = { INPUT_PAGE_KEY, INPUT_KEY_A }, [0x1F] = { INPUT_PAGE_KEY, INPUT_KEY_S }, [0x20] = { INPUT_PAGE_KEY, INPUT_KEY_D }, [0x21] = { INPUT_PAGE_KEY, INPUT_KEY_F }, [0x22] = { INPUT_PAGE_KEY, INPUT_KEY_G }, [0x23] = { INPUT_PAGE_KEY, INPUT_KEY_H }, [0x24] = { INPUT_PAGE_KEY, INPUT_KEY_J }, [0x25] = { INPUT_PAGE_KEY, INPUT_KEY_K }, [0x26] = { INPUT_PAGE_KEY, INPUT_KEY_L }, [0x27] = { INPUT_PAGE_KEY, INPUT_KEY_SEMICOLON }, [0x28] = { INPUT_PAGE_KEY, INPUT_KEY_APOSTROPH }, [0x29] = { INPUT_PAGE_KEY, INPUT_KEY_GRAVE_ACCENT }, [0x2A] = { INPUT_PAGE_KEY, INPUT_KEY_LEFT_SHIFT }, [0x2B] = { INPUT_PAGE_KEY, INPUT_KEY_BACKSLASH }, [0x2C] = { INPUT_PAGE_KEY, INPUT_KEY_Z }, [0x2D] = { INPUT_PAGE_KEY, INPUT_KEY_X }, [0x2E] = { INPUT_PAGE_KEY, INPUT_KEY_C }, [0x2F] = { INPUT_PAGE_KEY, INPUT_KEY_V }, [0x30] = { INPUT_PAGE_KEY, INPUT_KEY_B }, [0x31] = { INPUT_PAGE_KEY, INPUT_KEY_N }, [0x32] = { INPUT_PAGE_KEY, INPUT_KEY_M }, [0x33] = { INPUT_PAGE_KEY, INPUT_KEY_COMMA }, [0x34] = { INPUT_PAGE_KEY, INPUT_KEY_PERIOD }, [0x35] = { INPUT_PAGE_KEY, INPUT_KEY_SLASH }, [0x36] = { INPUT_PAGE_KEY, INPUT_KEY_RIGHT_SHIFT }, [0x37] = { INPUT_PAGE_KEY, INPUT_KEY_KP_STAR }, [0x38] = { INPUT_PAGE_KEY, INPUT_KEY_LEFT_ALT }, [0x39] = { INPUT_PAGE_KEY, INPUT_KEY_SPACEBAR }, [0x3A] = { INPUT_PAGE_KEY, INPUT_KEY_CAPS_LOCK }, [0x3B] = { INPUT_PAGE_KEY, INPUT_KEY_F1 }, [0x3C] = { INPUT_PAGE_KEY, INPUT_KEY_F2 }, [0x3D] = { INPUT_PAGE_KEY, INPUT_KEY_F3 }, [0x3E] = { INPUT_PAGE_KEY, INPUT_KEY_F4 }, [0x3F] = { INPUT_PAGE_KEY, INPUT_KEY_F5 }, [0x40] = { INPUT_PAGE_KEY, INPUT_KEY_F6 }, [0x41] = { INPUT_PAGE_KEY, INPUT_KEY_F7 }, [0x42] = { INPUT_PAGE_KEY, INPUT_KEY_F8 }, [0x43] = { INPUT_PAGE_KEY, INPUT_KEY_F9 }, [0x44] = { INPUT_PAGE_KEY, INPUT_KEY_F10 }, [0x45] = { INPUT_PAGE_KEY, INPUT_KEY_NUM_LOCK }, [0x46] = { INPUT_PAGE_KEY, INPUT_KEY_SCROLL_LOCK }, [0x47] = { INPUT_PAGE_KEY, INPUT_KEY_KP_7 }, [0x48] = { INPUT_PAGE_KEY, INPUT_KEY_KP_8 }, [0x49] = { INPUT_PAGE_KEY, INPUT_KEY_KP_9 }, [0x4A] = { INPUT_PAGE_KEY, INPUT_KEY_KP_DASH }, [0x4B] = { INPUT_PAGE_KEY, INPUT_KEY_KP_4 }, [0x4C] = { INPUT_PAGE_KEY, INPUT_KEY_KP_5 }, [0x4D] = { INPUT_PAGE_KEY, INPUT_KEY_KP_6 }, [0x4E] = { INPUT_PAGE_KEY, INPUT_KEY_KP_PLUS }, [0x4F] = { INPUT_PAGE_KEY, INPUT_KEY_KP_1 }, [0x50] = { INPUT_PAGE_KEY, INPUT_KEY_KP_2 }, [0x51] = { INPUT_PAGE_KEY, INPUT_KEY_KP_3 }, [0x52] = { INPUT_PAGE_KEY, INPUT_KEY_KP_0 }, [0x53] = { INPUT_PAGE_KEY, INPUT_KEY_KP_PERIOD }, [0x54] = { INPUT_PAGE_KEY, INPUT_KEY_SYSREQ }, [0x56] = { INPUT_PAGE_KEY, INPUT_KEY_EUROPE_2 }, [0x57] = { INPUT_PAGE_KEY, INPUT_KEY_F11 }, [0x58] = { INPUT_PAGE_KEY, INPUT_KEY_F12 }, [0x59] = { INPUT_PAGE_KEY, INPUT_KEY_KP_EQUAL }, [0x5C] = { INPUT_PAGE_KEY, INPUT_KEY_I10L_6 }, [0x64] = { INPUT_PAGE_KEY, INPUT_KEY_F13 }, [0x65] = { INPUT_PAGE_KEY, INPUT_KEY_F14 }, [0x66] = { INPUT_PAGE_KEY, INPUT_KEY_F15 }, [0x67] = { INPUT_PAGE_KEY, INPUT_KEY_F16 }, [0x68] = { INPUT_PAGE_KEY, INPUT_KEY_F17 }, [0x69] = { INPUT_PAGE_KEY, INPUT_KEY_F18 }, [0x6A] = { INPUT_PAGE_KEY, INPUT_KEY_F19 }, [0x6B] = { INPUT_PAGE_KEY, INPUT_KEY_F20 }, [0x6C] = { INPUT_PAGE_KEY, INPUT_KEY_F21 }, [0x6D] = { INPUT_PAGE_KEY, INPUT_KEY_F22 }, [0x6E] = { INPUT_PAGE_KEY, INPUT_KEY_F23 }, [0x70] = { INPUT_PAGE_KEY, INPUT_KEY_I10L_2 }, /* The following two keys (0x71, 0x72) are release-only. */ [0x71] = { INPUT_PAGE_KEY, INPUT_KEY_LANG_2 }, [0x72] = { INPUT_PAGE_KEY, INPUT_KEY_LANG_1 }, [0x73] = { INPUT_PAGE_KEY, INPUT_KEY_I10L_1 }, /* The following key (0x76) can be either F24 or LANG_5. */ [0x76] = { INPUT_PAGE_KEY, INPUT_KEY_F24 }, [0x77] = { INPUT_PAGE_KEY, INPUT_KEY_LANG_4 }, [0x78] = { INPUT_PAGE_KEY, INPUT_KEY_LANG_3 }, [0x79] = { INPUT_PAGE_KEY, INPUT_KEY_I10L_4 }, [0x7B] = { INPUT_PAGE_KEY, INPUT_KEY_I10L_5 }, [0x7D] = { INPUT_PAGE_KEY, INPUT_KEY_I10L_3 }, [0x7E] = { INPUT_PAGE_KEY, INPUT_KEY_EQUAL_SIGN }, }; const static struct scanmap scanmap_escaped[KBD_SCAN_CODES] = { [0x10] = { INPUT_PAGE_CONS, INPUT_CONS_SCAN_PREVIOUS_TRACK }, [0x19] = { INPUT_PAGE_CONS, INPUT_CONS_SCAN_NEXT_TRACK }, [0x1C] = { INPUT_PAGE_KEY, INPUT_KEY_KP_ENTER }, [0x1D] = { INPUT_PAGE_KEY, INPUT_KEY_RIGHT_CTRL }, [0x20] = { INPUT_PAGE_CONS, INPUT_CONS_MUTE }, [0x21] = { INPUT_PAGE_CONS, INPUT_CONS_AL_CALCULATOR }, [0x22] = { INPUT_PAGE_CONS, INPUT_CONS_PLAY_PAUSE }, [0x24] = { INPUT_PAGE_CONS, INPUT_CONS_STOP }, [0x2E] = { INPUT_PAGE_CONS, INPUT_CONS_VOLUME_DOWN }, [0x30] = { INPUT_PAGE_CONS, INPUT_CONS_VOLUME_UP }, [0x32] = { INPUT_PAGE_CONS, INPUT_CONS_AC_HOME }, [0x35] = { INPUT_PAGE_KEY, INPUT_KEY_KP_SLASH }, [0x37] = { INPUT_PAGE_KEY, INPUT_KEY_PRINT_SCREEN }, [0x38] = { INPUT_PAGE_KEY, INPUT_KEY_RIGHT_ALT }, [0x46] = { INPUT_PAGE_KEY, INPUT_KEY_PAUSE }, [0x47] = { INPUT_PAGE_KEY, INPUT_KEY_HOME }, [0x48] = { INPUT_PAGE_KEY, INPUT_KEY_UP_ARROW }, [0x49] = { INPUT_PAGE_KEY, INPUT_KEY_PAGE_UP }, [0x4B] = { INPUT_PAGE_KEY, INPUT_KEY_LEFT_ARROW }, [0x4D] = { INPUT_PAGE_KEY, INPUT_KEY_RIGHT_ARROW }, [0x4F] = { INPUT_PAGE_KEY, INPUT_KEY_END }, [0x50] = { INPUT_PAGE_KEY, INPUT_KEY_DOWN_ARROW }, [0x51] = { INPUT_PAGE_KEY, INPUT_KEY_PAGE_DOWN }, [0x52] = { INPUT_PAGE_KEY, INPUT_KEY_INSERT }, [0x53] = { INPUT_PAGE_KEY, INPUT_KEY_DELETE }, [0x5B] = { INPUT_PAGE_KEY, INPUT_KEY_LEFT_GUI }, [0x5C] = { INPUT_PAGE_KEY, INPUT_KEY_RIGHT_GUI }, [0x5D] = { INPUT_PAGE_KEY, INPUT_KEY_APPLICATION }, /* The following extended key (0x5E) may also be INPUT_KEY_POWER. */ [0x5E] = { INPUT_PAGE_GD, INPUT_GD_SYSTEM_POWER_DOWN }, [0x5F] = { INPUT_PAGE_GD, INPUT_GD_SYSTEM_SLEEP }, [0x63] = { INPUT_PAGE_GD, INPUT_GD_SYSTEM_WAKE_UP }, [0x65] = { INPUT_PAGE_CONS, INPUT_CONS_AC_SEARCH }, [0x66] = { INPUT_PAGE_CONS, INPUT_CONS_AC_BOOKMARKS }, [0x67] = { INPUT_PAGE_CONS, INPUT_CONS_AC_REFRESH }, [0x68] = { INPUT_PAGE_CONS, INPUT_CONS_AC_STOP }, [0x69] = { INPUT_PAGE_CONS, INPUT_CONS_AC_FORWARD }, [0x6A] = { INPUT_PAGE_CONS, INPUT_CONS_AC_BACK }, [0x6B] = { INPUT_PAGE_CONS, INPUT_CONS_AL_LOCAL_BROWSER }, [0x6C] = { INPUT_PAGE_CONS, INPUT_CONS_AL_EMAIL_READER }, [0x6D] = { INPUT_PAGE_CONS, INPUT_CONS_AL_MEDIA_SELECT }, }; #define K(k) [INPUT_KEY_ ## k] /* Map to key entry */ #define C(c) ((c) & 0x1F) /* Map to control code */ #define A(c) ((c) | 0x80) /* Set eight bit (ALT) */ #define CA(c) A(C(c)) /* Control-Alt */ #define N(c) ((c) | HASNUM) /* Add "Num Lock has effect" attribute */ #define L(c) ((c) | HASCAPS) /* Add "Caps Lock has effect" attribute */ #define EXT 0x0100 /* Normal function keys */ #define CTRLKEY 0x0200 /* Control key */ #define SHIFT 0x0400 /* Shift key */ #define ALT 0x0800 /* Alternate key */ #define HASNUM 0x4000 /* Num Lock has effect */ #define HASCAPS 0x8000 /* Caps Lock has effect */ #define ISMOUSE 0x80000000 #define MOUSEBTN 0x40000000 #define MOUSEBTN_RELEASE 0x00 #define MOUSEBTN_CLICK 0x80 #define MOUSEBTN_L 0x1 #define MOUSEBTN_R 0x2 #define MOUSEBTN_M 0x4 #define MOUSEPOS 0x20000000 #define MOUSEPOS_XY 0x00000200 #define MOUSEPOS_NEG 0x00000100 #define MOUSESCR 0x10000000 #define MOUSESCR_UP 0x1 #define MOUSESCR_DOWN 0x2 /* The left and right versions for the actual keys in the keymap. */ #define LCTRL CTRLKEY #define RCTRL (CTRLKEY | EXT) #define LSHIFT SHIFT #define RSHIFT (SHIFT | EXT) #define LALT ALT #define RALT (ALT | EXT) /* Delete key */ #define DEL 0177 /* Numeric keypad */ #define HOME (0x01 + EXT) #define END (0x02 + EXT) #define UP (0x03 + EXT) #define DOWN (0x04 + EXT) #define LEFT (0x05 + EXT) #define RIGHT (0x06 + EXT) #define PGUP (0x07 + EXT) #define PGDN (0x08 + EXT) #define MID (0x09 + EXT) /* UNUSED (0x0A + EXT) */ /* UNUSED (0x0B + EXT) */ #define INSRT (0x0C + EXT) /* Keys affected by Num Lock */ #define NHOME N(HOME) #define NEND N(END) #define NUP N(UP) #define NDOWN N(DOWN) #define NLEFT N(LEFT) #define NRIGHT N(RIGHT) #define NPGUP N(PGUP) #define NPGDN N(PGDN) #define NMID N(MID) #define NINSRT N(INSRT) #define NDEL N(DEL) /* Alt + Numeric keypad */ #define AHOME (0x01 + ALT) #define AEND (0x02 + ALT) #define AUP (0x03 + ALT) #define ADOWN (0x04 + ALT) #define ALEFT (0x05 + ALT) #define ARIGHT (0x06 + ALT) #define APGUP (0x07 + ALT) #define APGDN (0x08 + ALT) #define AMID (0x09 + ALT) #define AMIN (0x0A + ALT) #define APLUS (0x0B + ALT) #define AINSRT (0x0C + ALT) /* Ctrl + Numeric keypad */ #define CHOME (0x01 + CTRLKEY) #define CEND (0x02 + CTRLKEY) #define CUP (0x03 + CTRLKEY) #define CDOWN (0x04 + CTRLKEY) #define CLEFT (0x05 + CTRLKEY) #define CRIGHT (0x06 + CTRLKEY) #define CPGUP (0x07 + CTRLKEY) #define CPGDN (0x08 + CTRLKEY) #define CMID (0x09 + CTRLKEY) #define CNMIN (0x0A + CTRLKEY) #define CPLUS (0x0B + CTRLKEY) #define CINSRT (0x0C + CTRLKEY) /* Lock keys */ #define CALOCK (0x0D + EXT) /* caps lock */ #define NLOCK (0x0E + EXT) /* number lock */ #define SLOCK (0x0F + EXT) /* scroll lock */ /* Function keys */ #define F1 (0x10 + EXT) #define F2 (0x11 + EXT) #define F3 (0x12 + EXT) #define F4 (0x13 + EXT) #define F5 (0x14 + EXT) #define F6 (0x15 + EXT) #define F7 (0x16 + EXT) #define F8 (0x17 + EXT) #define F9 (0x18 + EXT) #define F10 (0x19 + EXT) #define F11 (0x1A + EXT) #define F12 (0x1B + EXT) /* Alt+Fn */ #define AF1 (0x10 + ALT) #define AF2 (0x11 + ALT) #define AF3 (0x12 + ALT) #define AF4 (0x13 + ALT) #define AF5 (0x14 + ALT) #define AF6 (0x15 + ALT) #define AF7 (0x16 + ALT) #define AF8 (0x17 + ALT) #define AF9 (0x18 + ALT) #define AF10 (0x19 + ALT) #define AF11 (0x1A + ALT) #define AF12 (0x1B + ALT) /* Ctrl+Fn */ #define CF1 (0x10 + CTRLKEY) #define CF2 (0x11 + CTRLKEY) #define CF3 (0x12 + CTRLKEY) #define CF4 (0x13 + CTRLKEY) #define CF5 (0x14 + CTRLKEY) #define CF6 (0x15 + CTRLKEY) #define CF7 (0x16 + CTRLKEY) #define CF8 (0x17 + CTRLKEY) #define CF9 (0x18 + CTRLKEY) #define CF10 (0x19 + CTRLKEY) #define CF11 (0x1A + CTRLKEY) #define CF12 (0x1B + CTRLKEY) /* Shift+Fn */ #define SF1 (0x10 + SHIFT) #define SF2 (0x11 + SHIFT) #define SF3 (0x12 + SHIFT) #define SF4 (0x13 + SHIFT) #define SF5 (0x14 + SHIFT) #define SF6 (0x15 + SHIFT) #define SF7 (0x16 + SHIFT) #define SF8 (0x17 + SHIFT) #define SF9 (0x18 + SHIFT) #define SF10 (0x19 + SHIFT) #define SF11 (0x1A + SHIFT) #define SF12 (0x1B + SHIFT) /* Alt+Shift+Fn */ #define ASF1 (0x10 + ALT + SHIFT) #define ASF2 (0x11 + ALT + SHIFT) #define ASF3 (0x12 + ALT + SHIFT) #define ASF4 (0x13 + ALT + SHIFT) #define ASF5 (0x14 + ALT + SHIFT) #define ASF6 (0x15 + ALT + SHIFT) #define ASF7 (0x16 + ALT + SHIFT) #define ASF8 (0x17 + ALT + SHIFT) #define ASF9 (0x18 + ALT + SHIFT) #define ASF10 (0x19 + ALT + SHIFT) #define ASF11 (0x1A + ALT + SHIFT) #define ASF12 (0x1B + ALT + SHIFT) #define MAP_COLS 6 /* Number of columns in keymap */ #define NR_SCAN_CODES 0xE8 /* Number of scan codes (rows in keymap) */ static u16 minix_keymap[NR_SCAN_CODES][MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ K(A) = { L('a'), 'A', A('a'), A('a'), A('A'), C('A') }, K(B) = { L('b'), 'B', A('b'), A('b'), A('B'), C('B') }, K(C) = { L('c'), 'C', A('c'), A('c'), A('C'), C('C') }, K(D) = { L('d'), 'D', A('d'), A('d'), A('D'), C('D') }, K(E) = { L('e'), 'E', A('e'), A('e'), A('E'), C('E') }, K(F) = { L('f'), 'F', A('f'), A('f'), A('F'), C('F') }, K(G) = { L('g'), 'G', A('g'), A('g'), A('G'), C('G') }, K(H) = { L('h'), 'H', A('h'), A('h'), A('H'), C('H') }, K(I) = { L('i'), 'I', A('i'), A('i'), A('I'), C('I') }, K(J) = { L('j'), 'J', A('j'), A('j'), A('J'), C('J') }, K(K) = { L('k'), 'K', A('k'), A('k'), A('K'), C('K') }, K(L) = { L('l'), 'L', A('l'), A('l'), A('L'), C('L') }, K(M) = { L('m'), 'M', A('m'), A('m'), A('M'), C('M') }, K(N) = { L('n'), 'N', A('n'), A('n'), A('N'), C('N') }, K(O) = { L('o'), 'O', A('o'), A('o'), A('O'), C('O') }, K(P) = { L('p'), 'P', A('p'), A('p'), A('P'), C('P') }, K(Q) = { L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q') }, K(R) = { L('r'), 'R', A('r'), A('r'), A('R'), C('R') }, K(S) = { L('s'), 'S', A('s'), A('s'), A('S'), C('S') }, K(T) = { L('t'), 'T', A('t'), A('t'), A('T'), C('T') }, K(U) = { L('u'), 'U', A('u'), A('u'), A('U'), C('U') }, K(V) = { L('v'), 'V', A('v'), A('v'), A('V'), C('V') }, K(W) = { L('w'), 'W', A('w'), A('w'), A('W'), C('W') }, K(X) = { L('x'), 'X', A('x'), A('x'), A('X'), C('X') }, K(Y) = { L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y') }, K(Z) = { L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z') }, K(1) = { '1', '!', A('1'), A('1'), A('!'), C('A') }, K(2) = { '2', '@', A('2'), A('2'), A('@'), C('@') }, K(3) = { '3', '#', A('3'), A('3'), A('#'), C('C') }, K(4) = { '4', '$', A('4'), A('4'), A('$'), C('D') }, K(5) = { '5', '%', A('5'), A('5'), A('%'), C('E') }, K(6) = { '6', '^', A('6'), A('6'), A('^'), C('^') }, K(7) = { '7', '&', A('7'), A('7'), A('&'), C('G') }, K(8) = { '8', '*', A('8'), A('8'), A('*'), C('H') }, K(9) = { '9', '(', A('9'), A('9'), A('('), C('I') }, K(0) = { '0', ')', A('0'), A('0'), A(')'), C('@') }, K(ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') }, K(ESCAPE) = { C('['), C('['), CA('['),CA('['),CA('['),C('[') }, K(BACKSPACE) = { C('H'), C('H'), CA('H'),CA('H'),CA('H'),DEL }, K(TAB) = { C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I') }, K(SPACEBAR) = { ' ', ' ', A(' '), A(' '), A(' '), C('@') }, K(DASH) = { '-', '_', A('-'), A('-'), A('_'), C('_') }, K(EQUAL) = { '=', '+', A('='), A('='), A('+'), C('@') }, K(OPEN_BRACKET) = { '[', '{', A('['), A('['), A('{'), C('[') }, K(CLOSE_BRACKET) = { ']', '}', A(']'), A(']'), A('}'), C(']') }, K(BACKSLASH) = { '\\', '|', A('\\'),A('\\'),A('|'), C('\\') }, K(SEMICOLON) = { ';', ':', A(';'), A(';'), A(':'), C('@') }, K(APOSTROPH) = { '\'', '"', A('\''),A('\''),A('"'), C('@') }, K(GRAVE_ACCENT) = { '`', '~', A('`'), A('`'), A('~'), C('@') }, K(COMMA) = { ',', '<', A(','), A(','), A('<'), C('@') }, K(PERIOD) = { '.', '>', A('.'), A('.'), A('>'), C('@') }, K(SLASH) = { '/', '?', A('/'), A('/'), A('?'), C('@') }, K(CAPS_LOCK) = { CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK }, K(F1) = { F1, SF1, AF1, AF1, ASF1, CF1 }, K(F2) = { F2, SF2, AF2, AF2, ASF2, CF2 }, K(F3) = { F3, SF3, AF3, AF3, ASF3, CF3 }, K(F4) = { F4, SF4, AF4, AF4, ASF4, CF4 }, K(F5) = { F5, SF5, AF5, AF5, ASF5, CF5 }, K(F6) = { F6, SF6, AF6, AF6, ASF6, CF6 }, K(F7) = { F7, SF7, AF7, AF7, ASF7, CF7 }, K(F8) = { F8, SF8, AF8, AF8, ASF8, CF8 }, K(F9) = { F9, SF9, AF9, AF9, ASF9, CF9 }, K(F10) = { F10, SF10, AF10, AF10, ASF10, CF10 }, K(F11) = { F11, SF11, AF11, AF11, ASF11, CF11 }, K(F12) = { F12, SF12, AF12, AF12, ASF12, CF12 }, K(SCROLL_LOCK) = { SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK }, K(INSERT) = { INSRT, INSRT, AINSRT, AINSRT, AINSRT, CINSRT }, K(HOME) = { HOME, HOME, AHOME, AHOME, AHOME, CHOME }, K(PAGE_UP) = { PGUP, PGUP, APGUP, APGUP, APGUP, CPGUP }, K(DELETE) = { DEL, DEL, A(DEL), A(DEL), A(DEL), DEL }, K(END) = { END, END, AEND, AEND, AEND, CEND }, K(PAGE_DOWN) = { PGDN, PGDN, APGDN, APGDN, APGDN, CPGDN }, K(RIGHT_ARROW) = { RIGHT, RIGHT, ARIGHT, ARIGHT, ARIGHT, CRIGHT }, K(LEFT_ARROW) = { LEFT, LEFT, ALEFT, ALEFT, ALEFT, CLEFT }, K(DOWN_ARROW) = { DOWN, DOWN, ADOWN, ADOWN, ADOWN, CDOWN }, K(UP_ARROW) = { UP, UP, AUP, AUP, AUP, CUP }, K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK }, K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') }, K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') }, K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN }, K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS }, K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') }, K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND }, K(KP_2) = { NDOWN, '2', ADOWN, ADOWN, A('2'), CDOWN }, K(KP_3) = { NPGDN, '3', APGDN, APGDN, A('3'), CPGDN }, K(KP_4) = { NLEFT, '4', ALEFT, ALEFT, A('4'), CLEFT }, K(KP_5) = { NMID, '5', AMID, AMID, A('5'), CMID }, K(KP_6) = { NRIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT }, K(KP_7) = { NHOME, '7', AHOME, AHOME, A('7'), CHOME }, K(KP_8) = { NUP, '8', AUP, AUP, A('8'), CUP }, K(KP_9) = { NPGUP, '9', APGUP, APGUP, A('9'), CPGUP }, K(KP_0) = { NINSRT, '0', AINSRT, AINSRT, A('0'), CINSRT }, K(KP_PERIOD) = { NDEL, '.', A(DEL), A(DEL), A('.'), DEL }, K(EUROPE_2) = { '<', '>', A('<'), A('|'), A('>'), C('@') }, K(APPLICATION) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') }, K(SYSREQ) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') }, K(LEFT_CTRL) = { LCTRL, LCTRL, LCTRL, LCTRL, LCTRL, LCTRL }, K(LEFT_SHIFT) = { LSHIFT, LSHIFT, LSHIFT, LSHIFT, LSHIFT, LSHIFT }, K(LEFT_ALT) = { LALT, LALT, LALT, LALT, LALT, LALT }, K(LEFT_GUI) = { LEFT, '<', ALEFT, ALEFT, A('<'), CLEFT }, K(RIGHT_CTRL) = { RCTRL, RCTRL, RCTRL, RCTRL, RCTRL, RCTRL }, K(RIGHT_SHIFT) = { RSHIFT, RSHIFT, RSHIFT, RSHIFT, RSHIFT, RSHIFT }, K(RIGHT_ALT) = { RALT, RALT, RALT, RALT, RALT, RALT }, K(RIGHT_GUI) = { RIGHT, '>', ARIGHT, ARIGHT, A('>'), CRIGHT } }; #endif