aboutsummaryrefslogtreecommitdiff
path: root/drivers/ps2kbd.c
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-28 20:46:37 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-28 20:46:37 -0500
commite81f651b15be15624d7184e1823bf5b623f11604 (patch)
treefda3d16b0245dd83f367f523042f02a0e1b14db0 /drivers/ps2kbd.c
parent2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a (diff)
downloadkappa-e81f651b15be15624d7184e1823bf5b623f11604.zip
kappa-e81f651b15be15624d7184e1823bf5b623f11604.tar.gz
kappa-e81f651b15be15624d7184e1823bf5b623f11604.tar.bz2
kappa-e81f651b15be15624d7184e1823bf5b623f11604.tar.xz
stuff
Diffstat (limited to 'drivers/ps2kbd.c')
-rw-r--r--drivers/ps2kbd.c113
1 files changed, 107 insertions, 6 deletions
diff --git a/drivers/ps2kbd.c b/drivers/ps2kbd.c
index 73b75d1..40b06ac 100644
--- a/drivers/ps2kbd.c
+++ b/drivers/ps2kbd.c
@@ -1,6 +1,7 @@
-/* this is both a PS/2 keyboard driver */
+/* this is a PS/2 keyboard driver */
#include <stdint.h>
#include <stdio.h>
+#include <string.h>
#include "io.h"
#include "isr.h"
#include "ps2kbd.h"
@@ -57,23 +58,122 @@ uint8_t ps2kbd_modifier_get(void)
return ret;
}
+static struct ps2_specialkeys_t special_keys;
+
+static void handle_special_key(uint8_t scancode, int release)
+{
+ int press = ~release;
+ switch(ps2_set1_special[scancode])
+ {
+ case SPECIAL_SHIFT:
+ special_keys.shift = press;
+ break;
+ case SPECIAL_CTRL:
+ special_keys.ctrl = press;
+ break;
+ case SPECIAL_BKSP:
+ special_keys.bksp = press;
+ break;
+ case SPECIAL_ALT:
+ special_keys.alt = press;
+ break;
+ case SPECIAL_NUMLOCK:
+ special_keys.numlock = ~special_keys.numlock;
+ ps2kbd_set_leds((special_keys.capslock << 2) | (special_keys.numlock << 1) | special_keys.scrllock);
+ break;
+ case SPECIAL_CAPLOCK:
+ special_keys.capslock = ~special_keys.capslock;
+ ps2kbd_set_leds((special_keys.capslock << 2) | (special_keys.numlock << 1) | special_keys.scrllock);
+ break;
+ case SPECIAL_SCRLLOCK:
+ special_keys.scrllock = ~special_keys.scrllock;
+ ps2kbd_set_leds((special_keys.capslock << 2) | (special_keys.numlock << 1) | special_keys.scrllock);
+ break;
+ case SPECIAL_ESC:
+ special_keys.esc = press;
+ break;
+ case SPECIAL_F1:
+ special_keys.f1 = press;
+ break;
+ case SPECIAL_F2:
+ special_keys.f2 = press;
+ break;
+ case SPECIAL_F3:
+ special_keys.f3 = press;
+ break;
+ case SPECIAL_F4:
+ special_keys.f4 = press;
+ break;
+ case SPECIAL_F5:
+ special_keys.f5 = press;
+ break;
+ case SPECIAL_F6:
+ special_keys.f6 = press;
+ break;
+ case SPECIAL_F7:
+ special_keys.f7 = press;
+ break;
+ case SPECIAL_F8:
+ special_keys.f8 = press;
+ break;
+ case SPECIAL_F9:
+ special_keys.f9 = press;
+ break;
+ case SPECIAL_F10:
+ special_keys.f10 = press;
+ break;
+ case SPECIAL_F11:
+ special_keys.f11 = press;
+ break;
+ case SPECIAL_F12:
+ special_keys.f12 = press;
+ break;
+ }
+}
+
+static void handle_extended_scancode(void)
+{
+ uint8_t temp = inb(0x60);
+ //printf("Extended scancode: 0x%x\n", temp);
+}
+
static void key_handler(struct regs_t *regs)
{
(void) regs;
uint8_t scancode = inb(0x60);
- if(scancode == 0xE0)
- /* extended, forget it! */
+ //printf("INTR SCAN: 0x%x\n", scancode);
+ if(scancode == EXTENDED_SCANCODE)
+ {
+ handle_extended_scancode();
return;
+ }
+
/* AND by 0x7F to get in the range of [0,128) */
- int type = ps2_scancodes_set1[scancode & 0x7F];
- int release = (scancode & 0x80) >> 7;
+
+ int type = ps2_set1_scancodes[scancode & 0x7F];
+ int release = (scancode & (1<<7)) >> 7;
switch(type)
{
case PRINTING_KEY:
+ {
if(!release)
- putchar(ps2_set1_ascii[scancode]);
+ {
+ int capitals = special_keys.capslock;
+ if(special_keys.shift)
+ capitals = ~capitals;
+ if(capitals)
+ putchar(ps2_set1_shift[scancode]);
+ else
+ putchar(ps2_set1_ascii[scancode]);
+ }
+ break;
+ }
+ case SPECIAL_KEY:
+ handle_special_key(scancode & 0x7F, release);
break;
}
+ if(special_keys.bksp)
+ putchar('\b');
}
static void ps2_set_scancode_set(uint8_t set)
@@ -87,6 +187,7 @@ static void keyboard_init(void)
{
set_interrupt_handler(IRQ(1), key_handler);
ps2_set_scancode_set(1);
+ memset(&special_keys, 0, sizeof(special_keys));
}
void ps2kbd_init(void)