From 593bf4df3d8db49286c1a7ae4ef75c887b629930 Mon Sep 17 00:00:00 2001 From: Alex AUVOLAT Date: Thu, 17 May 2012 17:56:23 +0200 Subject: Devices using the VFS structure. Basic keyboard handler. --- src/kernel/dev/ps2keyboard.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/kernel/dev/ps2keyboard.cpp (limited to 'src/kernel/dev/ps2keyboard.cpp') diff --git a/src/kernel/dev/ps2keyboard.cpp b/src/kernel/dev/ps2keyboard.cpp new file mode 100644 index 0000000..31cd75f --- /dev/null +++ b/src/kernel/dev/ps2keyboard.cpp @@ -0,0 +1,55 @@ +#include "ps2keyboard.h" + +#include +#include + +ps2kbd *kbd = 0; + +static void kbd_irq(registers*) { + kbd->kbdIrq(); +} + +ps2kbd::ps2kbd(node* parent) : keyboard(parent) { + uint8_t temp = inb(0x60), temp2 = 0; + while (temp != temp2) { + temp2 = temp; + temp = inb(0x60); + } + + kbd = this; + idt_handleIrq(1, kbd_irq); + + escaped = false; + + updateLeds(); +} + +void ps2kbd::updateLeds() { + uint8_t tmp = 0; + if (scroll) tmp |= 1; + if (num) tmp |= 2; + if (caps) tmp |= 4; + outb(0x60, tmp); +} + +void ps2kbd::kbdIrq() { + uint8_t scancode = inb(0x60); + if (scancode == 0xE0) { + escaped = true; + } else { + if (scancode & 0x80) { + if (escaped) { + handle(scancode, false); + } else { + handle(scancode & 0x7F, false); + } + } else { + if (escaped) { + handle(scancode | 0x80, true); + } else { + handle(scancode, true); + } + } + escaped = false; + } +} -- cgit v1.2.3