diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-28 20:46:37 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-28 20:46:37 -0500 |
| commit | e81f651b15be15624d7184e1823bf5b623f11604 (patch) | |
| tree | fda3d16b0245dd83f367f523042f02a0e1b14db0 /drivers/ps2kbd.c | |
| parent | 2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a (diff) | |
| download | kappa-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.c | 113 |
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) |