aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/include/ps2_keymaps.h28
-rw-r--r--drivers/ps2_keymaps.c314
-rw-r--r--drivers/ps2kbd.c62
3 files changed, 294 insertions, 110 deletions
diff --git a/drivers/include/ps2_keymaps.h b/drivers/include/ps2_keymaps.h
index 0e71cc5..91688c8 100644
--- a/drivers/include/ps2_keymaps.h
+++ b/drivers/include/ps2_keymaps.h
@@ -1,26 +1,8 @@
#include <stdint.h>
-#define PS2_KEY_UNKNOWN 0xFF00
-#define PS2_KEY_ESCAPE 0xFF01
-#define PS2_KEY_NUMLOCK 0xFF02
-#define PS2_KEY_CAPSLOCK 0xFF03
-#define PS2_KEY_SCRLLOCK 0xFF04
-#define PS2_KEY_CONTROL 0xFF05
-#define PS2_KEY_BKSP 0xFF06
-#define PS2_KEY_F1 0xFF07
-#define PS2_KEY_F2 0xFF08
-#define PS2_KEY_F3 0xFF09
-#define PS2_KEY_F4 0xFF0A
-#define PS2_KEY_F5 0xFF0B
-#define PS2_KEY_F6 0xFF0C
-#define PS2_KEY_F7 0xFF0D
-#define PS2_KEY_F8 0xFF0E
-#define PS2_KEY_F9 0xFF0F
-#define PS2_KEY_F10 0xFF10
-#define PS2_KEY_F11 0xFF11
-#define PS2_KEY_F12 0xFF12
-#define PS2_KEY_ALT 0xFF13
-#define PS2_KEY_GUI 0xFF14
-#define PS2_KEY_SHIFT 0xFF15
+#define ERROR_KEY 0x00
+#define PRINTING_KEY 0x01
+#define SPECIAL_KEY 0x02
-extern uint16_t ps2_keymap_set1[128];
+extern uint8_t ps2_scancodes_set1[128];
+extern char ps2_set1_ascii[128];
diff --git a/drivers/ps2_keymaps.c b/drivers/ps2_keymaps.c
index 9a92452..cd7fd08 100644
--- a/drivers/ps2_keymaps.c
+++ b/drivers/ps2_keymaps.c
@@ -1,45 +1,289 @@
#include <stdint.h>
#include "ps2_keymaps.h"
-uint16_t ps2_keymap_set1[128] = {
- PS2_KEY_UNKNOWN,
- PS2_KEY_ESCAPE,
- '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', PS2_KEY_BKSP,
- '\t','q', 'w', 'e', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',
- PS2_KEY_CONTROL,
- 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`',
- PS2_KEY_SHIFT,
+uint8_t ps2_scancodes_set1[128] = {
+ ERROR_KEY, /* error */
+ SPECIAL_KEY, /* esc */
+ PRINTING_KEY, /* 1 */
+ PRINTING_KEY, /* 2 */
+ PRINTING_KEY, /* 3 */
+ PRINTING_KEY, /* 4 */
+ PRINTING_KEY, /* 5 */
+ PRINTING_KEY, /* 6 */
+ PRINTING_KEY, /* 7 */
+ PRINTING_KEY, /* 8 */
+ PRINTING_KEY, /* 9 */
+ PRINTING_KEY, /* 0 */
+ PRINTING_KEY, /* - */
+ PRINTING_KEY, /* = */
+ SPECIAL_KEY, /* backspace */
+ PRINTING_KEY, /* tab */
+ PRINTING_KEY, /* Q */
+ PRINTING_KEY, /* W */
+ PRINTING_KEY, /* E */
+ PRINTING_KEY, /* R */
+ PRINTING_KEY, /* T */
+ PRINTING_KEY, /* Y */
+ PRINTING_KEY, /* U */
+ PRINTING_KEY, /* I */
+ PRINTING_KEY, /* O */
+ PRINTING_KEY, /* P */
+ PRINTING_KEY, /* [ */
+ PRINTING_KEY, /* ] */
+ PRINTING_KEY, /* enter */
+ SPECIAL_KEY, /* left ctrl */
+ PRINTING_KEY, /* A */
+ PRINTING_KEY, /* S */
+ PRINTING_KEY, /* D */
+ PRINTING_KEY, /* F */
+ PRINTING_KEY, /* G */
+ PRINTING_KEY, /* H */
+ PRINTING_KEY, /* J */
+ PRINTING_KEY, /* K */
+ PRINTING_KEY, /* L */
+ PRINTING_KEY, /* ; */
+ PRINTING_KEY, /* ' */
+ PRINTING_KEY, /* ` */
+ SPECIAL_KEY, /* left shift */
+ PRINTING_KEY, /* \ (backslash) */
+ PRINTING_KEY, /* Z */
+ PRINTING_KEY, /* X */
+ PRINTING_KEY, /* C */
+ PRINTING_KEY, /* V */
+ PRINTING_KEY, /* B */
+ PRINTING_KEY, /* N */
+ PRINTING_KEY, /* M */
+ PRINTING_KEY, /* , */
+ PRINTING_KEY, /* . */
+ PRINTING_KEY, /* / */
+ SPECIAL_KEY, /* right shift */
+ PRINTING_KEY, /* keypad * */
+ SPECIAL_KEY, /* right alt */
+ PRINTING_KEY, /* space */
+ SPECIAL_KEY, /* caps lock */
+ SPECIAL_KEY, /* F1 */
+ SPECIAL_KEY, /* F2 */
+ SPECIAL_KEY, /* F3 */
+ SPECIAL_KEY, /* F4 */
+ SPECIAL_KEY, /* F5 */
+ SPECIAL_KEY, /* F6 */
+ SPECIAL_KEY, /* F7 */
+ SPECIAL_KEY, /* F8 */
+ SPECIAL_KEY, /* F9 */
+ SPECIAL_KEY, /* F10 */
+ SPECIAL_KEY, /* num lock */
+ SPECIAL_KEY, /* scroll lock */
+ PRINTING_KEY, /* keypad 7 */
+ PRINTING_KEY, /* keypad 8 */
+ PRINTING_KEY, /* keypad 9 */
+ PRINTING_KEY, /* keypad - */
+ PRINTING_KEY, /* keypad 4 */
+ PRINTING_KEY, /* keypad 5 */
+ PRINTING_KEY, /* keypad 6 */
+ PRINTING_KEY, /* keypad + */
+ PRINTING_KEY, /* keypad 1 */
+ PRINTING_KEY, /* keypad 2 */
+ PRINTING_KEY, /* keypad 3 */
+ PRINTING_KEY, /* keypad 0 */
+ PRINTING_KEY, /* keypad . */
+ ERROR_KEY, /* 0x54 */
+ ERROR_KEY, /* 0x55 */
+ ERROR_KEY, /* 0x56 */
+ SPECIAL_KEY, /* F11 */
+ SPECIAL_KEY, /* F12 */
+ ERROR_KEY,
+ ERROR_KEY,
+ ERROR_KEY,
+ ERROR_KEY
+};
+
+char ps2_set1_ascii[128] = {
+ '\0',
+ '\0',
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ '0',
+ '-',
+ '=',
+ '\0',
+ '\t',
+ 'q',
+ 'w',
+ 'e',
+ 'r',
+ 't',
+ 'y',
+ 'u',
+ 'i',
+ 'o',
+ 'p',
+ '[',
+ ']',
+ '\n',
+ '\0',
+ 'a',
+ 's',
+ 'd',
+ 'f',
+ 'g',
+ 'h',
+ 'j',
+ 'k',
+ 'l',
+ ';',
+ '\'',
+ '`',
+ '\0',
'\\',
- 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', PS2_KEY_SHIFT,
+ 'z',
+ 'x',
+ 'c',
+ 'v',
+ 'b',
+ 'n',
+ 'm',
+ ',',
+ '.',
+ '/',
+ '\0',
+ '*',
+ '\0',
+ ' ',
+ '\0', /* caps lock */
+ '\0', /* F1 */
+ '\0', /* F2 */
+ '\0', /* F3 */
+ '\0', /* F4 */
+ '\0', /* F5 */
+ '\0', /* F6 */
+ '\0', /* F7 */
+ '\0', /* F8 */
+ '\0', /* F9 */
+ '\0', /* F10 */
+ '\0', /* num lock */
+ '\0', /* scroll lock */
+ '7',
+ '8',
+ '9',
+ '-',
+ '4',
+ '5',
+ '6',
+ '+',
+ '1',
+ '2',
+ '3',
+ '0',
+ '.',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+};
+char ps2_set1_shift[128] = {
+ '\0',
+ '\0',
+ '!',
+ '@',
+ '#',
+ '$',
+ '%',
+ '^',
+ '&',
+ '*',
+ '(',
+ ')',
+ '_',
+ '+',
+ '\0',
+ '\t',
+ 'Q',
+ 'w',
+ 'E',
+ 'R',
+ 'T',
+ 'Y',
+ 'U',
+ 'I',
+ 'O',
+ 'P',
+ '{',
+ '}',
+ '\n',
+ '\0',
+ 'A',
+ 'S',
+ 'D',
+ 'F',
+ 'G',
+ 'H',
+ 'J',
+ 'K',
+ 'L',
+ ':',
+ '"',
+ '~',
+ '\0',
+ '|',
+ 'Z',
+ 'X',
+ 'C',
+ 'V',
+ 'B',
+ 'N',
+ 'M',
+ '<',
+ '>',
+ '?',
+ '\0',
'*',
- PS2_KEY_ALT,
- ' ', PS2_KEY_CAPSLOCK,
- PS2_KEY_F1,
- PS2_KEY_F2,
- PS2_KEY_F3,
- PS2_KEY_F4,
- PS2_KEY_F5,
- PS2_KEY_F6,
- PS2_KEY_F7,
- PS2_KEY_F8,
- PS2_KEY_F9,
- PS2_KEY_F10,
- PS2_KEY_NUMLOCK,
- PS2_KEY_SCRLLOCK,
- '7', '8', '9',
+ '\0',
+ ' ',
+ '\0', /* caps lock */
+ '\0', /* F1 */
+ '\0', /* F2 */
+ '\0', /* F3 */
+ '\0', /* F4 */
+ '\0', /* F5 */
+ '\0', /* F6 */
+ '\0', /* F7 */
+ '\0', /* F8 */
+ '\0', /* F9 */
+ '\0', /* F10 */
+ '\0', /* num lock */
+ '\0', /* scroll lock */
+ '7',
+ '8',
+ '9',
'-',
- '4', '5', '6',
+ '4',
+ '5',
+ '6',
'+',
- '1', '2', '3',
+ '1',
+ '2',
+ '3',
'0',
'.',
- PS2_KEY_UNKNOWN,
- PS2_KEY_UNKNOWN,
- PS2_KEY_UNKNOWN,
- PS2_KEY_F11,
- PS2_KEY_F12,
- PS2_KEY_UNKNOWN,
- PS2_KEY_UNKNOWN,
- PS2_KEY_UNKNOWN,
- PS2_KEY_UNKNOWN,
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
+ '\0',
};
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;
}
}