diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-18 16:09:10 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-18 16:09:10 -0500 |
| commit | d86f31a5f428a3937b56d34e026a88ed737eb7bf (patch) | |
| tree | e86d34a36e92cd14b7b8c54a9cfe31f21786f451 /drivers | |
| parent | 3fbc39f482df596c832cf4ffcf3956a20e71cb38 (diff) | |
| download | kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.zip kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.gz kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.bz2 kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.xz | |
support modifier keys
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); |