forked from Bananymous/banan-os
Kernel: Keyboard is now handeled "properly"
This commit is contained in:
parent
998184e288
commit
b7a600c86d
|
@ -1,21 +1,359 @@
|
||||||
#include <kernel/IDT.h>
|
#include <kernel/IDT.h>
|
||||||
|
#include <kernel/IO.h>
|
||||||
#include <kernel/PIC.h>
|
#include <kernel/PIC.h>
|
||||||
#include <kernel/PS2.h>
|
#include <kernel/PS2.h>
|
||||||
#include <kernel/kprint.h>
|
#include <kernel/kprint.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define PS2_DATA_PORT 0x60
|
||||||
|
#define PS2_STATUS_REGISTER 0x64
|
||||||
|
#define PS2_COMMAND_REGISTER 0x64
|
||||||
|
|
||||||
|
#define PS2_ACK 0xfa
|
||||||
|
|
||||||
#define PS2_IRQ 0x01
|
#define PS2_IRQ 0x01
|
||||||
|
|
||||||
|
#define ALT 0
|
||||||
|
#define CTRL 1
|
||||||
|
#define SHIFT 2
|
||||||
|
|
||||||
|
#define KEYBOARD_FI
|
||||||
|
|
||||||
namespace PS2
|
namespace PS2
|
||||||
{
|
{
|
||||||
|
|
||||||
|
static bool s_keyboard_state[0x7f];
|
||||||
|
static uint8_t s_modifiers = 0;
|
||||||
|
|
||||||
|
#ifdef KEYBOARD_FI
|
||||||
|
enum class Key
|
||||||
|
{
|
||||||
|
Key_INVALID,
|
||||||
|
Key_ESC,
|
||||||
|
Key_1,
|
||||||
|
Key_2,
|
||||||
|
Key_3,
|
||||||
|
Key_4,
|
||||||
|
Key_5,
|
||||||
|
Key_6,
|
||||||
|
Key_7,
|
||||||
|
Key_8,
|
||||||
|
Key_9,
|
||||||
|
Key_0,
|
||||||
|
Key_Plus,
|
||||||
|
Key_Tick,
|
||||||
|
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_Å,
|
||||||
|
Key_Caret,
|
||||||
|
Key_Enter,
|
||||||
|
Key_Control,
|
||||||
|
Key_A,
|
||||||
|
Key_S,
|
||||||
|
Key_D,
|
||||||
|
Key_F,
|
||||||
|
Key_G,
|
||||||
|
Key_H,
|
||||||
|
Key_J,
|
||||||
|
Key_K,
|
||||||
|
Key_L,
|
||||||
|
Key_Ö,
|
||||||
|
Key_Ä,
|
||||||
|
Key_Section, // §
|
||||||
|
Key_LeftShift,
|
||||||
|
Key_SingleQuote,
|
||||||
|
Key_Z,
|
||||||
|
Key_X,
|
||||||
|
Key_C,
|
||||||
|
Key_V,
|
||||||
|
Key_B,
|
||||||
|
Key_N,
|
||||||
|
Key_M,
|
||||||
|
Key_Comma,
|
||||||
|
Key_Period,
|
||||||
|
Key_Hyphen,
|
||||||
|
Key_RightShift,
|
||||||
|
Key_Unknown, // Maybe other alt
|
||||||
|
Key_Alt,
|
||||||
|
Key_Space,
|
||||||
|
Key_CapsLock,
|
||||||
|
Key_F1,
|
||||||
|
Key_F2,
|
||||||
|
Key_F3,
|
||||||
|
Key_F4,
|
||||||
|
Key_F5,
|
||||||
|
Key_F6,
|
||||||
|
Key_F7,
|
||||||
|
Key_F8,
|
||||||
|
Key_F9,
|
||||||
|
Key_F10,
|
||||||
|
// TODO
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char fi_keymap[0x7f]
|
||||||
|
{
|
||||||
|
'\0',
|
||||||
|
'\0', // esc
|
||||||
|
'1',
|
||||||
|
'2',
|
||||||
|
'3',
|
||||||
|
'4',
|
||||||
|
'5',
|
||||||
|
'6',
|
||||||
|
'7',
|
||||||
|
'8',
|
||||||
|
'9',
|
||||||
|
'0',
|
||||||
|
'+',
|
||||||
|
'`',
|
||||||
|
'\b',
|
||||||
|
'\t', // tab
|
||||||
|
'q',
|
||||||
|
'w',
|
||||||
|
'e',
|
||||||
|
'r',
|
||||||
|
't',
|
||||||
|
'y',
|
||||||
|
'u',
|
||||||
|
'i',
|
||||||
|
'o',
|
||||||
|
'p',
|
||||||
|
'?',
|
||||||
|
'^',
|
||||||
|
'\n', // enter
|
||||||
|
'\0',
|
||||||
|
'a',
|
||||||
|
's',
|
||||||
|
'd',
|
||||||
|
'f',
|
||||||
|
'g',
|
||||||
|
'h',
|
||||||
|
'j',
|
||||||
|
'k',
|
||||||
|
'l',
|
||||||
|
'\0', // ö
|
||||||
|
'\0', // ä
|
||||||
|
'\0', // §
|
||||||
|
'\0',
|
||||||
|
'\'',
|
||||||
|
'z',
|
||||||
|
'x',
|
||||||
|
'c',
|
||||||
|
'v',
|
||||||
|
'b',
|
||||||
|
'n',
|
||||||
|
'm',
|
||||||
|
',',
|
||||||
|
'.',
|
||||||
|
'-',
|
||||||
|
'\0',
|
||||||
|
'\0',
|
||||||
|
'\0',
|
||||||
|
' ',
|
||||||
|
};
|
||||||
|
|
||||||
|
char fi_keymap_shift[0x7f]
|
||||||
|
{
|
||||||
|
'\0',
|
||||||
|
'\0', // esc
|
||||||
|
'!',
|
||||||
|
'"',
|
||||||
|
'#',
|
||||||
|
'\0', // ¤
|
||||||
|
'%',
|
||||||
|
'&',
|
||||||
|
'/',
|
||||||
|
'(',
|
||||||
|
')',
|
||||||
|
'=',
|
||||||
|
'?',
|
||||||
|
'`',
|
||||||
|
'\b',
|
||||||
|
'\t', // tab
|
||||||
|
'Q',
|
||||||
|
'W',
|
||||||
|
'E',
|
||||||
|
'R',
|
||||||
|
'T',
|
||||||
|
'Y',
|
||||||
|
'U',
|
||||||
|
'I',
|
||||||
|
'O',
|
||||||
|
'P',
|
||||||
|
'?',
|
||||||
|
'^',
|
||||||
|
'\n', // enter
|
||||||
|
'\0',
|
||||||
|
'A',
|
||||||
|
'S',
|
||||||
|
'D',
|
||||||
|
'F',
|
||||||
|
'G',
|
||||||
|
'H',
|
||||||
|
'J',
|
||||||
|
'K',
|
||||||
|
'L',
|
||||||
|
'\0', // ö
|
||||||
|
'\0', // ä
|
||||||
|
'\0', // ½
|
||||||
|
'\0',
|
||||||
|
'*',
|
||||||
|
'Z',
|
||||||
|
'X',
|
||||||
|
'C',
|
||||||
|
'V',
|
||||||
|
'B',
|
||||||
|
'N',
|
||||||
|
'M',
|
||||||
|
';',
|
||||||
|
':',
|
||||||
|
'_',
|
||||||
|
'\0',
|
||||||
|
'\0',
|
||||||
|
'\0',
|
||||||
|
' ',
|
||||||
|
};
|
||||||
|
|
||||||
void irq_handler()
|
void irq_handler()
|
||||||
{
|
{
|
||||||
kprint("keyboard\n");
|
while (IO::inb(PS2_STATUS_REGISTER) & 0x01)
|
||||||
|
{
|
||||||
|
uint8_t raw = IO::inb(PS2_DATA_PORT);
|
||||||
|
uint8_t ch = raw & 0x7f;
|
||||||
|
bool pressed = !(raw & 0x80);
|
||||||
|
|
||||||
|
switch (ch)
|
||||||
|
{
|
||||||
|
case 0x38: pressed ? (s_modifiers |= 1 << ALT ) : (s_modifiers &= ~(1 << ALT )); break;
|
||||||
|
case 0x1d: pressed ? (s_modifiers |= 1 << CTRL ) : (s_modifiers &= ~(1 << CTRL )); break;
|
||||||
|
case 0x2a: pressed ? (s_modifiers |= 1 << SHIFT) : (s_modifiers &= ~(1 << SHIFT)); break;
|
||||||
|
default:
|
||||||
|
s_keyboard_state[ch] = pressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pressed)
|
||||||
|
{
|
||||||
|
char c = s_modifiers & (1 << SHIFT) ? fi_keymap_shift[ch] : fi_keymap[ch];
|
||||||
|
if (c) kprint("{}", c);
|
||||||
|
}
|
||||||
|
|
||||||
|
IO::io_wait();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialize()
|
void initialize()
|
||||||
{
|
{
|
||||||
|
// Clear keyboard buffer
|
||||||
|
while (IO::inb(PS2_STATUS_REGISTER) & 0x01)
|
||||||
|
IO::inb(PS2_DATA_PORT);
|
||||||
|
|
||||||
|
memset(s_keyboard_state, 0, sizeof(s_keyboard_state));
|
||||||
|
|
||||||
IDT::register_irq_handler(PS2_IRQ, irq_handler);
|
IDT::register_irq_handler(PS2_IRQ, irq_handler);
|
||||||
PIC::unmask(PS2_IRQ);
|
PIC::unmask(PS2_IRQ);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue