diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/include/ps2kbd.h | 15 | ||||
| -rw-r--r-- | drivers/ps2kbd.c | 35 |
2 files changed, 45 insertions, 5 deletions
diff --git a/drivers/include/ps2kbd.h b/drivers/include/ps2kbd.h index 477882f..dcde1d8 100644 --- a/drivers/include/ps2kbd.h +++ b/drivers/include/ps2kbd.h @@ -6,14 +6,21 @@ #define PS2_NUM_LOCK (1 << 1) #define PS2_CAPS_LOCK (1 << 2) -#define BUTTON_UP (1 << 0) -#define BUTTON_LEFT (1 << 1) -#define BUTTON_DOWN (1 << 2) -#define BUTTON_RIGHT (1 << 3) +#define BUTTON_UP (1 << 0) +#define BUTTON_LEFT (1 << 1) +#define BUTTON_DOWN (1 << 2) +#define BUTTON_RIGHT (1 << 3) + +#define MODIFIER_NONE 0 +#define MODIFIER_SHIFT (1 << 0) +#define MODIFIER_CTRL (1 << 1) +#define MODIFIER_ALT (1 << 2) /* returns which arrow keys are down */ uint8_t ps2kbd_button_get(void); +uint8_t ps2kbd_modifier_get(void); + void ps2kbd_set_leds(uint8_t status); void ps2kbd_init(void); diff --git a/drivers/ps2kbd.c b/drivers/ps2kbd.c index 5aa9d2a..30fe762 100644 --- a/drivers/ps2kbd.c +++ b/drivers/ps2kbd.c @@ -41,13 +41,46 @@ uint8_t ps2kbd_button_get(void) return ret; } +static uint8_t ps2_ctrl; +static uint8_t ps2_shift; +static uint8_t ps2_alt; + +uint8_t ps2kbd_modifier_get(void) +{ + uint8_t ret = 0; + if(ps2_ctrl) + ret |= MODIFIER_CTRL; + if(ps2_shift) + ret |= MODIFIER_SHIFT; + if(ps2_alt) + ret |= MODIFIER_ALT; + return ret; +} + static void key_handler(struct regs_t *regs) { (void) regs; uint8_t scancode = inb(0x60); switch(scancode) { - /* ... the only one we care about! */ + 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); |