simple new input ok
This commit is contained in:
parent
627a6e323b
commit
1a7f6d024e
@ -16,6 +16,8 @@
|
||||
/************************************************************************/
|
||||
#define KB_IN_BYTES 320 /* size of keyboard input buffer */ /* FIXME */
|
||||
#define MOUSE_IN_BYTES 4
|
||||
#define DEBUGNEW
|
||||
#ifndef DEBUGNEW
|
||||
#define MAP_COLS 3 /* Number of columns in keymap */
|
||||
#define NR_SCAN_CODES 0x80 /* Number of scan codes (rows in keymap) */
|
||||
|
||||
@ -118,7 +120,7 @@
|
||||
#define PAD_INS PAD_0 /* Ins */
|
||||
#define PAD_MID PAD_5 /* Middle key */
|
||||
#define PAD_DEL PAD_DOT /* Del */
|
||||
|
||||
#endif
|
||||
#define PS2_PORT_DATA (0x60)
|
||||
#define PS2_PORT_CMD (0x64)
|
||||
|
||||
|
||||
801
include/minix_keymap.h
Normal file
801
include/minix_keymap.h
Normal file
@ -0,0 +1,801 @@
|
||||
#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 */
|
||||
|
||||
/* 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
|
||||
@ -77,8 +77,10 @@ typedef struct vga_buf {
|
||||
|
||||
typedef struct keyboard_buf {
|
||||
void* buf; // 1d array, buffer input virtual line, works as a ldisc
|
||||
int max_buf;
|
||||
int tail;
|
||||
int head;
|
||||
int len;
|
||||
int readable;
|
||||
} keyboard_buf;
|
||||
|
||||
#include "console.h"
|
||||
@ -95,5 +97,15 @@ void write_serial(char a);
|
||||
void vga_tty_init(NTTY* tty);
|
||||
void vga_tty_write(NTTY* tty, char ch);
|
||||
void vga_tty_flush(NTTY* tty);
|
||||
void vga_tty_backspace(NTTY* tty);
|
||||
void ps2_tty_init(NTTY* tty);
|
||||
int ps2_tty_read(NTTY* tty, u8* buf, int nr);
|
||||
|
||||
|
||||
#define CYCLE_SUB(head, tail, _max) ((head) < (tail) ? (tail)-(head) : (tail) + (_max) - (head))
|
||||
#define NEXT(x, _max) (((x) + 1) % (_max))
|
||||
#define LAST(x, _max) (((x) - 1) >= 0 ? ((x) - 1) % (_max) : (_max) - 1)
|
||||
#define DEBUGNEW
|
||||
extern int cur_ntty;
|
||||
extern NTTY ntty_table[3];
|
||||
#endif /* _ORANGES_TTY_H_ */
|
||||
@ -8,10 +8,11 @@
|
||||
#include "global.h"
|
||||
#include "proto.h"
|
||||
#include "keyboard.h"
|
||||
#include "keymap.h"
|
||||
// #include "keymap.h"
|
||||
#include "x86.h"
|
||||
#include "stdio.h"
|
||||
#include "assert.h"
|
||||
#include "minix_keymap.h"
|
||||
|
||||
|
||||
static KB_INPUT kb_in;
|
||||
@ -30,10 +31,13 @@ static int num_lock; /* Num Lock */
|
||||
static int scroll_lock; /* Scroll Lock */
|
||||
static int column;
|
||||
|
||||
static u8 get_byte_from_kb_buf();
|
||||
static u8 get_byte_from_kb_buf();
|
||||
static void set_leds();
|
||||
static void set_mouse_leds();
|
||||
static void kb_wait();
|
||||
static void ps2_push(NTTY* tty, u16 key);
|
||||
static void kbd_process(unsigned char scode);
|
||||
|
||||
// static void kb_ack();
|
||||
/*
|
||||
* Helper Procedures for PS/2 Mouse Operation
|
||||
@ -83,6 +87,9 @@ static u8 mouse_get_id() {
|
||||
|
||||
void kb_handler(int irq){
|
||||
u8 scan_code = inb(PS2_PORT_DATA);
|
||||
#ifdef DEBUGNEW
|
||||
kbd_process(scan_code);
|
||||
#else
|
||||
if(kb_in.count < KB_IN_BYTES){
|
||||
*(kb_in.p_head) = scan_code;
|
||||
kb_in.p_head++;
|
||||
@ -91,7 +98,7 @@ void kb_handler(int irq){
|
||||
}
|
||||
kb_in.count++;
|
||||
}
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
#define TTY_FIRST (tty_table)
|
||||
@ -190,7 +197,7 @@ void init_kb(){
|
||||
set_mouse_leds();
|
||||
|
||||
}
|
||||
|
||||
#ifndef DEBUGNEW
|
||||
void keyboard_read(TTY* p_tty)
|
||||
{
|
||||
u8 scan_code;
|
||||
@ -407,12 +414,108 @@ void keyboard_read(TTY* p_tty)
|
||||
key |= alt_l ? FLAG_ALT_L : 0;
|
||||
key |= alt_r ? FLAG_ALT_R : 0;
|
||||
key |= pad ? FLAG_PAD : 0;
|
||||
|
||||
in_process(p_tty,key);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static u16 map_key(int code) {
|
||||
int caps, column;
|
||||
int shift = shift_l | shift_r;
|
||||
int alt = alt_l | alt_r;
|
||||
int ctrl = ctrl_l | ctrl_r;
|
||||
u16 *keyrow = minix_keymap[code];
|
||||
caps = shift_l | shift_r;
|
||||
if (num_lock&& (keyrow[0] & HASNUM)) caps = !caps;
|
||||
if (caps_lock && (keyrow[0] & HASCAPS)) caps = !caps;
|
||||
|
||||
if (alt) {
|
||||
column = 2;
|
||||
if (ctrl || alt_r) column = 3; /* Ctrl + Alt == AltGr */
|
||||
if (caps) column = 4;
|
||||
} else {
|
||||
// if (sticky_alt_mode && (lk & ALT_LOCK)) {
|
||||
// column = 2;
|
||||
// if (caps) column = 4;
|
||||
// } else {
|
||||
column = 0;
|
||||
if (caps) column = 1;
|
||||
if (ctrl) column = 5;
|
||||
// }
|
||||
}
|
||||
return keyrow[column] & ~(HASNUM | HASCAPS);
|
||||
}
|
||||
|
||||
static void kbd_process(unsigned char scode)
|
||||
{
|
||||
int press, index, page, code;
|
||||
static int kbd_state = 0;
|
||||
|
||||
press = !(scode & SCAN_RELEASE) ? INPUT_PRESS : INPUT_RELEASE;
|
||||
index = scode & ~SCAN_RELEASE;
|
||||
|
||||
switch (kbd_state) {
|
||||
case 1:
|
||||
page = scanmap_escaped[index].page;
|
||||
code = scanmap_escaped[index].code;
|
||||
break;
|
||||
case 2:
|
||||
kbd_state = (index == SCAN_CTRL) ? 3 : 0;
|
||||
return;
|
||||
case 3:
|
||||
if (index == SCAN_NUMLOCK) {
|
||||
page = INPUT_PAGE_KEY;
|
||||
code = INPUT_KEY_PAUSE;
|
||||
break;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
switch (scode) {
|
||||
case SCAN_EXT0:
|
||||
kbd_state = 1;
|
||||
return;
|
||||
case SCAN_EXT1:
|
||||
kbd_state = 2;
|
||||
return;
|
||||
}
|
||||
page = scanmap_normal[index].page;
|
||||
code = scanmap_normal[index].code;
|
||||
break;
|
||||
}
|
||||
|
||||
if (page) {
|
||||
switch (code)
|
||||
{
|
||||
case INPUT_KEY_LEFT_SHIFT:
|
||||
shift_l = press; break;
|
||||
case INPUT_KEY_RIGHT_SHIFT:
|
||||
shift_r = press; break;
|
||||
case INPUT_KEY_LEFT_CTRL:
|
||||
ctrl_l = press; break;
|
||||
case INPUT_KEY_RIGHT_CTRL:
|
||||
ctrl_r = press; break;
|
||||
case INPUT_KEY_LEFT_ALT:
|
||||
alt_l = press; break;
|
||||
case INPUT_KEY_RIGHT_ALT:
|
||||
alt_r = press; break;
|
||||
case INPUT_KEY_NUM_LOCK:
|
||||
if (press) num_lock = !num_lock;
|
||||
break;
|
||||
case INPUT_KEY_CAPS_LOCK:
|
||||
if (press) caps_lock = !caps_lock;
|
||||
break;
|
||||
case INPUT_KEY_SCROLL_LOCK:
|
||||
if (press) scroll_lock = !scroll_lock;
|
||||
break;
|
||||
}
|
||||
|
||||
// inputdriver_send_event(FALSE /*mouse*/, page, code, press, 0);
|
||||
if (press) ps2_push(&ntty_table[cur_ntty], map_key(code));
|
||||
}
|
||||
|
||||
kbd_state = 0;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
@ -460,23 +563,6 @@ static void kb_wait() /* 等待 8042 的输入缓冲区空 */
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* kb_ack
|
||||
*****************************************************************************/
|
||||
/**
|
||||
* Read from the keyboard controller until a KB_ACK is received.
|
||||
*
|
||||
*****************************************************************************/
|
||||
// static void kb_ack()
|
||||
// {
|
||||
// u8 kb_read;
|
||||
|
||||
// do {
|
||||
// kb_read = inb(KB_DATA);
|
||||
// } while (kb_read != KB_ACK);
|
||||
// }
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* set_leds
|
||||
*****************************************************************************/
|
||||
@ -505,3 +591,81 @@ static void set_mouse_leds(){
|
||||
outb(KB_DATA, KBC_MODE);
|
||||
}
|
||||
|
||||
|
||||
#define LASTKEY(x) LAST(x, TTY_IN_BYTES)
|
||||
#define NEXTKEY(x) NEXT(x, TTY_IN_BYTES)
|
||||
|
||||
static u8 keybuf[3][TTY_IN_BYTES];
|
||||
void ps2_tty_init(NTTY* tty) {
|
||||
static int _cnt = 0;
|
||||
assert(tty->driver_type == 1);
|
||||
assert(tty->input_buf);
|
||||
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
||||
kbd->buf = (void*)keybuf[_cnt ++];
|
||||
kbd->head = kbd->tail = kbd->readable = 0;
|
||||
kbd->len = 0;
|
||||
}
|
||||
|
||||
int ps2_tty_read(NTTY* tty, u8* buf, int nr) {
|
||||
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
||||
int i = 0;
|
||||
while (kbd->readable == 0);
|
||||
for (; i < nr && i < kbd->readable; ++ i) {
|
||||
buf[i] = ((int*)kbd->buf)[kbd->head];
|
||||
kbd->head = NEXTKEY(kbd->head);
|
||||
}
|
||||
kbd->readable -= i;
|
||||
kbd->len -= i;
|
||||
return i;
|
||||
}
|
||||
|
||||
void ps2_tty_flush(NTTY* tty) {
|
||||
|
||||
}
|
||||
|
||||
static void ps2_push(NTTY* tty, u16 key) {
|
||||
// kprintf("%x\n", key);
|
||||
keyboard_buf* kbd = (keyboard_buf*)tty->input_buf;
|
||||
if (key & EXT) {
|
||||
switch (key)
|
||||
{
|
||||
case F1: case F2: case F3: case F4: case F5: case F6:
|
||||
case F7: case F8: case F9: case F10: case F11: case F12:
|
||||
// select_console((key & 0xff) - (F1 & 0xff)); // TODO
|
||||
kprintf("select console %d\n", (key & 0xff) - (F1 & 0xff));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch (key)
|
||||
{
|
||||
case '\r': case '\n': // escape ENTER
|
||||
vga_tty_write(tty, '\n');
|
||||
((int*)kbd->buf)[kbd->tail] = '\n';
|
||||
kbd->len ++;
|
||||
kbd->tail = NEXTKEY(kbd->tail);
|
||||
kbd->readable = CYCLE_SUB(kbd->head, kbd->tail, TTY_IN_BYTES);
|
||||
break;
|
||||
case '\b':
|
||||
if (kbd->len > kbd->readable) {
|
||||
vga_tty_backspace(tty);
|
||||
kbd->len --;
|
||||
kbd->tail = LASTKEY(kbd->tail);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((key & 0xff) == 0) return;
|
||||
if (kbd->len == TTY_IN_BYTES - 1) return; // leave one space for ctrl ascii
|
||||
vga_tty_write(tty, key);
|
||||
((int*)kbd->buf)[kbd->tail] = key & 0xff;
|
||||
kbd->len ++;
|
||||
kbd->tail = NEXTKEY(kbd->tail);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: 1. 修改键盘驱动 2. 添加测试代码 3. 添加鼠标并调试滚动
|
||||
@ -127,7 +127,7 @@ void initial()
|
||||
do_vclose(stdout);
|
||||
do_vclose(stderr);
|
||||
|
||||
exec("orange/test.bin");
|
||||
exec("orange/shell_0.bin");
|
||||
|
||||
while(1);
|
||||
}
|
||||
21
kernel/tty.c
21
kernel/tty.c
@ -12,7 +12,6 @@
|
||||
#include "memman.h"
|
||||
#include "stdio.h"
|
||||
|
||||
#define DEBUGNEW
|
||||
|
||||
int current_console; //当前显示在屏幕上的console
|
||||
void tty_write(TTY *tty, char *buf, int len);
|
||||
@ -26,8 +25,8 @@ static void put_key(TTY *tty, u32 key);
|
||||
|
||||
#ifdef DEBUGNEW
|
||||
|
||||
static NTTY ntty_table[3];
|
||||
static int cur_ntty = 0;
|
||||
NTTY ntty_table[3];
|
||||
int cur_ntty = 0;
|
||||
static keyboard_buf keyboardbuf[3];
|
||||
static vga_buf vgabuf[3];
|
||||
|
||||
@ -41,10 +40,13 @@ void init_tty_main() {
|
||||
tty->input_buf = &keyboardbuf[i];
|
||||
tty->output_buf = &vgabuf[i];
|
||||
vga_tty_init(tty);
|
||||
ps2_tty_init(tty);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef DEBUGNEW
|
||||
void in_process(TTY *p_tty, u32 key)
|
||||
{
|
||||
int real_line = p_tty->console->orig / SCR_WIDTH;
|
||||
@ -106,6 +108,7 @@ void in_process(TTY *p_tty, u32 key)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#define TTY_FIRST (tty_table)
|
||||
#define TTY_END (tty_table + NR_CONSOLES)
|
||||
@ -119,7 +122,7 @@ void task_tty()
|
||||
// }
|
||||
while(1)
|
||||
{
|
||||
// vga_tty_flush(&ntty_table[cur_ntty]);
|
||||
vga_tty_flush(&ntty_table[cur_ntty]);
|
||||
}
|
||||
|
||||
#else
|
||||
@ -223,7 +226,7 @@ static void tty_mouse(TTY *tty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef DEBUGNEW
|
||||
static void tty_dev_read(TTY *tty)
|
||||
{
|
||||
if (is_current_console(tty->console))
|
||||
@ -273,7 +276,7 @@ static void tty_dev_write(TTY *tty)
|
||||
out_char(tty->console, ch);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
static void put_key(TTY *tty, u32 key)
|
||||
{
|
||||
if (tty->ibuf_cnt < TTY_IN_BYTES)
|
||||
@ -299,7 +302,7 @@ void tty_write(TTY *tty, char *buf, int len)
|
||||
while (--len >= 0) {
|
||||
vga_tty_write(&ntty_table[cur_ntty], *buf++);
|
||||
}
|
||||
vga_tty_flush(&ntty_table[cur_ntty]);
|
||||
// vga_tty_flush(&ntty_table[cur_ntty]);
|
||||
#else
|
||||
while (--len >= 0)
|
||||
out_char(tty->console, *buf++);
|
||||
@ -314,6 +317,9 @@ void tty_write(TTY *tty, char *buf, int len)
|
||||
*****************************************************************************/
|
||||
int tty_read(TTY *tty, char *buf, int len)
|
||||
{
|
||||
#ifdef DEBUGNEW
|
||||
return ps2_tty_read(&ntty_table[cur_ntty], (u8*)buf, len);
|
||||
#else
|
||||
int i = 0;
|
||||
if (!tty->ibuf_read_cnt)
|
||||
{
|
||||
@ -336,4 +342,5 @@ int tty_read(TTY *tty, char *buf, int len)
|
||||
}
|
||||
|
||||
return i;
|
||||
#endif
|
||||
}
|
||||
40
kernel/vga.c
40
kernel/vga.c
@ -118,11 +118,12 @@ static inline void vga_flush_blankline(int line_no) {
|
||||
static u16 pagebuf[3][SCR_BUFSIZE];
|
||||
|
||||
void vga_tty_init(NTTY* tty) {
|
||||
static int _cnt = 0;
|
||||
assert(tty->driver_type == 1);
|
||||
assert(tty->output_buf);
|
||||
vga_buf* vga = tty->output_buf;
|
||||
// vga->buf = (void*)do_kmalloc(sizeof(u16) * SCR_BUFSIZE);
|
||||
vga->buf = (void*)pagebuf[0];
|
||||
vga->buf = (void*)pagebuf[_cnt ++];
|
||||
// kprintf("malloced %p %p %p\n", vga->buf, &vga->buf, &vga->scr_top_line);
|
||||
vga->cur_col = vga->cur_row = 0;
|
||||
// buf->max_line = SCR_BUFSIZE / SCR_WIDTH;
|
||||
@ -137,22 +138,22 @@ void vga_tty_init(NTTY* tty) {
|
||||
}
|
||||
|
||||
#define INDEX(row, col) ((row) * SCR_WIDTH + (col))
|
||||
#define NEXTLINE(row) (((row) + 1) % SCR_MAXLINE)
|
||||
#define LASTLINE(row) (((row) - 1) >= 0 ? ((row) - 1) % SCR_MAXLINE : SCR_MAXLINE)
|
||||
#define NEXTLINE(row) NEXT(row, SCR_MAXLINE)
|
||||
#define LASTLINE(row) LAST(row, SCR_MAXLINE)
|
||||
|
||||
static void newline(vga_buf* vgabuf) {
|
||||
vgabuf->cur_col = 0;
|
||||
static void newline(vga_buf* vga) {
|
||||
vga->cur_col = 0;
|
||||
// kprintf("bf %x\n", vgabuf->scr_cur_line);
|
||||
vgabuf->scr_cur_line = NEXTLINE(vgabuf->scr_cur_line);
|
||||
vga->scr_cur_line = NEXTLINE(vga->scr_cur_line);
|
||||
// kprintf("af %x\n", vgabuf->scr_cur_line);
|
||||
vgabuf->cur_row = abs(vgabuf->scr_cur_line - vgabuf->scr_top_line);
|
||||
if (vgabuf->cur_row == SCR_HEIGHT) {
|
||||
vga->cur_row = CYCLE_SUB(vga->scr_top_line, vga->scr_cur_line, SCR_MAXLINE);
|
||||
if (vga->cur_row == SCR_HEIGHT) {
|
||||
// auto scroll
|
||||
vgabuf->scr_top_line = NEXTLINE(vgabuf->scr_top_line);
|
||||
if(vgabuf->scr_cur_line == vgabuf->head_line) {
|
||||
vgabuf->head_line = NEXTLINE(vgabuf->head_line);
|
||||
vga->scr_top_line = NEXTLINE(vga->scr_top_line);
|
||||
if(vga->scr_cur_line == vga->head_line) {
|
||||
vga->head_line = NEXTLINE(vga->head_line);
|
||||
// remember to fill blank the old line
|
||||
u32* ptr_buf = (u32*) (vgabuf->buf + sizeof(u16) * vgabuf->head_line * SCR_WIDTH);
|
||||
u32* ptr_buf = (u32*) (vga->buf + sizeof(u16) * vga->head_line * SCR_WIDTH);
|
||||
for (int i = 0; i < SCR_WIDTH * sizeof(u16) / sizeof(u32); ++i) {
|
||||
*ptr_buf++ = (BLANK << 16) | BLANK; // bg-black, fg-white, ascii-space
|
||||
}
|
||||
@ -189,10 +190,23 @@ void vga_tty_write(NTTY* tty, char ch) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
vga->cur_row = abs(vga->scr_cur_line - vga->scr_top_line);
|
||||
vga->cur_row = CYCLE_SUB(vga->scr_top_line, vga->scr_cur_line, SCR_MAXLINE);
|
||||
// kprintf("row: %d; ", vga->cur_row);
|
||||
}
|
||||
|
||||
void vga_tty_backspace(NTTY* tty) {
|
||||
vga_buf* vga = tty->output_buf;
|
||||
u16* buf = vga->buf;
|
||||
if (vga->cur_col == 0) {
|
||||
vga->cur_col = SCR_WIDTH - 1;
|
||||
vga->scr_cur_line = LASTLINE(vga->scr_cur_line);
|
||||
} else {
|
||||
vga->cur_col --;
|
||||
}
|
||||
buf[INDEX(vga->scr_cur_line, vga->cur_col)] = BLANK;
|
||||
vga->cur_row = CYCLE_SUB(vga->scr_top_line, vga->scr_cur_line, SCR_MAXLINE);
|
||||
}
|
||||
|
||||
void vga_tty_flush(NTTY* tty) {
|
||||
vga_buf* vga = tty->output_buf;
|
||||
u16* buf = vga->buf;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user