aboutsummaryrefslogtreecommitdiff
path: root/drivers/ps2kbd.c
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-20 21:59:07 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-20 21:59:07 -0500
commitd4a70e316e0991d788fb922e3e4eafae97fe950e (patch)
tree850f39e49c5bbd389a0b401e3837528b216b4afd /drivers/ps2kbd.c
parent0c128aab93656974bbf77132a487cff002c51d35 (diff)
downloadkappa-d4a70e316e0991d788fb922e3e4eafae97fe950e.zip
kappa-d4a70e316e0991d788fb922e3e4eafae97fe950e.tar.gz
kappa-d4a70e316e0991d788fb922e3e4eafae97fe950e.tar.bz2
kappa-d4a70e316e0991d788fb922e3e4eafae97fe950e.tar.xz
keyboard driver WIP
Diffstat (limited to 'drivers/ps2kbd.c')
-rw-r--r--drivers/ps2kbd.c62
1 files changed, 10 insertions, 52 deletions
diff --git a/drivers/ps2kbd.c b/drivers/ps2kbd.c
index 30fe762..73b75d1 100644
--- a/drivers/ps2kbd.c
+++ b/drivers/ps2kbd.c
@@ -61,59 +61,17 @@ static void key_handler(struct regs_t *regs)
{
(void) regs;
uint8_t scancode = inb(0x60);
- switch(scancode)
+ if(scancode == 0xE0)
+ /* extended, forget it! */
+ return;
+ /* AND by 0x7F to get in the range of [0,128) */
+ int type = ps2_scancodes_set1[scancode & 0x7F];
+ int release = (scancode & 0x80) >> 7;
+ switch(type)
{
- case 0x2A:
- ps2_shift = 1;
- break;
- case 0xAA:
- ps2_shift = 0;
- break;
- case 0x1D:
- ps2_ctrl = 1;
- break;
- case 0x9D:
- ps2_ctrl = 0;
- break;
- case 0x38:
- ps2_alt = 1;
- break;
- case 0xB8:
- ps2_alt = 0;
- break;
- case 0xE0:
- {
- uint8_t spec = inb(0x60);
- switch(spec)
- {
- case 0x48:
- ps2_arrowkeys[IDX_UP] = 1;
- break;
- case 0x4B:
- ps2_arrowkeys[IDX_LEFT] = 1;
- break;
- case 0x50:
- ps2_arrowkeys[IDX_DOWN] = 1;
- break;
- case 0x4D:
- ps2_arrowkeys[IDX_RIGHT] = 1;
- break;
- case 0xC8:
- ps2_arrowkeys[IDX_UP] = 0;
- break;
- case 0xCB:
- ps2_arrowkeys[IDX_LEFT] = 0;
- break;
- case 0xD0:
- ps2_arrowkeys[IDX_DOWN] = 0;
- break;
- case 0xCD:
- ps2_arrowkeys[IDX_RIGHT] = 0;
- break;
- }
- break;
- }
- default:
+ case PRINTING_KEY:
+ if(!release)
+ putchar(ps2_set1_ascii[scancode]);
break;
}
}