diff --git a/kernel/arch/boot.s b/kernel/arch/boot.s index 5b117ed..dc31dbc 100644 --- a/kernel/arch/boot.s +++ b/kernel/arch/boot.s @@ -4,7 +4,6 @@ global loader ; entry symbol for ELF extern kmain -extern gdt_init MAGIC_NUMBER equ 0x1BADB002 ; magic number constant FLAGS equ 0x3 diff --git a/kernel/arch/idt/idt.c b/kernel/arch/idt/idt.c index c0ce9c2..cdb8661 100644 --- a/kernel/arch/idt/idt.c +++ b/kernel/arch/idt/idt.c @@ -7,6 +7,7 @@ #include #include #include +#include __attribute__((aligned(0x10))) static idt_entry_t idt[256]; @@ -27,9 +28,13 @@ void exception_handler(unsigned int i) if (i == PIC_KEYB) { #ifdef __TESTING__ - kinfo("Sending EOI instruction to KEYB"); + //kinfo("Sending EOI instruction to KEYB"); #endif - printf("Scancode: %x\n", inb(0x60)); // read from kb + unsigned char in = inb(0x60); + char to_print = decode_key_enum(decode_scancode(in)); + if (to_print != '\0') + printf("%c", to_print); + /** * TODO: this is a cute temporary fix but lets do a real keyboard driver please? */ diff --git a/kernel/arch/io/keyb.c b/kernel/arch/io/keyb.c new file mode 100644 index 0000000..acad79f --- /dev/null +++ b/kernel/arch/io/keyb.c @@ -0,0 +1,125 @@ +#include + +#include + +bool is_shift_down = false; + + +kb_key_press_t decode_scancode(uint8_t scancode) + {return (kb_key_press_t) scancode;} + +// TODO: check the shift scan code as a boolean, if yes ... blah blah + +char decode_key_enum(kb_key_press_t keycode) +{ + switch(keycode) { + case KEY_Q: + return (is_shift_down) ? 'Q' : 'q'; + case KEY_W: + return (is_shift_down) ? 'W' : 'w'; + case KEY_E: + return (is_shift_down) ? 'E' : 'e'; + case KEY_R: + return (is_shift_down) ? 'R' : 'r'; + case KEY_T: + return (is_shift_down) ? 'T' : 't'; + case KEY_Y: + return (is_shift_down) ? 'Y' : 'y'; + case KEY_U: + return (is_shift_down) ? 'U' : 'u'; + case KEY_I: + return (is_shift_down) ? 'I' : 'i'; + case KEY_O: + return (is_shift_down) ? 'O' : 'o'; + case KEY_P: + return (is_shift_down) ? 'P' : 'p'; + case KEY_A: + return (is_shift_down) ? 'A' : 'a'; + case KEY_S: + return (is_shift_down) ? 'S' : 's'; + case KEY_D: + return (is_shift_down) ? 'D' : 'd'; + case KEY_F: + return (is_shift_down) ? 'F' : 'f'; + case KEY_G: + return (is_shift_down) ? 'G' : 'g'; + case KEY_H: + return (is_shift_down) ? 'H' : 'h'; + case KEY_J: + return (is_shift_down) ? 'J' : 'j'; + case KEY_K: + return (is_shift_down) ? 'K' : 'k'; + case KEY_L: + return (is_shift_down) ? 'L' : 'l'; + case KEY_Z: + return (is_shift_down) ? 'Z' : 'z'; + case KEY_X: + return (is_shift_down) ? 'X' : 'x'; + case KEY_C: + return (is_shift_down) ? 'C' : 'c'; + case KEY_V: + return (is_shift_down) ? 'V' : 'v'; + case KEY_B: + return (is_shift_down) ? 'B' : 'b'; + case KEY_N: + return (is_shift_down) ? 'N' : 'n'; + case KEY_M: + return (is_shift_down) ? 'M' : 'm'; + case KEY_1: + return (is_shift_down) ? '!' : '1'; + case KEY_2: + return (is_shift_down) ? '@' : '2'; + case KEY_3: + return (is_shift_down) ? '#' : '3'; + case KEY_4: + return (is_shift_down) ? '$' : '4'; + case KEY_5: + return (is_shift_down) ? '%' : '5'; + case KEY_6: + return (is_shift_down) ? '^' : '6'; + case KEY_7: + return (is_shift_down) ? '&' : '7'; + case KEY_8: + return (is_shift_down) ? '*' : '8'; + case KEY_9: + return (is_shift_down) ? '(' : '9'; + case KEY_0: + return (is_shift_down) ? ')' : '0'; + case KEY_MINUS: + return (is_shift_down) ? '_' : '-'; + case KEY_EQUALS: + return (is_shift_down) ? '=' : '+'; + case KEY_LEFT_BRACKET: + return (is_shift_down) ? '{' : '['; + case KEY_RIGHT_BRACKET: + return (is_shift_down) ? '}' : ']'; + case KEY_BACKSLASH: + return (is_shift_down) ? '|' : '\\'; + case KEY_SEMICOLON: + return (is_shift_down) ? ':' : ';'; + case KEY_SINGLE_QUOTE: + return (is_shift_down) ? '\"' : '\''; + case KEY_COMMA: + return (is_shift_down) ? '<' : ','; + case KEY_PERIOD: + return (is_shift_down) ? '>' : '.'; + case KEY_FORWARDSLASH: + return (is_shift_down) ? '?' : '/'; + case KEY_BACK_TICK: + return (is_shift_down) ? '~' : '`'; + case KEY_ENTER: + return '\n'; + case KEY_SPACE: + return ' '; + case KEY_LEFT_SHIFT: + case KEY_RIGHT_SHIFT: + is_shift_down = true; + return '\0'; + case KEY_LEFT_SHIFT_R: + case KEY_RIGHT_SHIFT_R: + is_shift_down = false; + return '\0'; // TODO: should i send a character on a no op key? + default: + return '\0'; + } +} diff --git a/kernel/include/kernel/x86/keyb.h b/kernel/include/kernel/x86/keyb.h new file mode 100644 index 0000000..b50e880 --- /dev/null +++ b/kernel/include/kernel/x86/keyb.h @@ -0,0 +1,65 @@ +#include + +#ifndef ARCH_KEYB_H +#define ARCH_KEYB_H + +typedef enum { + KEY_ESC = 0x01, + KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, + KEY_MINUS, KEY_EQUALS, + KEY_BACKSPACE, KEY_TAB, + KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, + KEY_LEFT_BRACKET, KEY_RIGHT_BRACKET, KEY_ENTER, KET_LEFT_CTRL, + KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, + KEY_SEMICOLON, KEY_SINGLE_QUOTE, KEY_BACK_TICK, KEY_LEFT_SHIFT, KEY_BACKSLASH, + KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, + KEY_COMMA, KEY_PERIOD, + KEY_FORWARDSLASH, + KEY_RIGHT_SHIFT, + KEY_KP_ASTERISK, + KEY_LEFT_ALT, + KEY_SPACE, KEY_CAPSLOCK, + KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, + KEY_NUMLOCK, KEY_SCROLLLOCK, + KEY_KP_7, KEY_KP_8, KEY_KP_9, + KEY_KP_MINUS, + KEY_KP_4, KEY_KP_5, KEY_KP_6, + KEY_KP_PLUS, + KEY_KP_1, KEY_KP_2, KEY_KP_3, KEY_KP_0, + KEY_KP_PERIOD, + KEY_F11 = 0x57, + KEY_F12, + KEY_ESC_R = 0x81, + KEY_1_R, KEY_2_R, KEY_3_R, KEY_4_R, KEY_5_R, KEY_6_R, KEY_7_R, KEY_8_R, KEY_9_R, KEY_0_R, + KEY_MINUS_R, KEY_EQUALS_R, + KEY_BACKSPACE_R, + KEY_TAB_R, + KEY_Q_R, KEY_W_R, KEY_E_R, KEY_R_R, KEY_T_R, KEY_Y_R, KEY_U_R, KEY_I_R, KEY_O_R, KEY_P_R, + KEY_LEFT_BRACKET_R, KEY_RIGHT_BRACKET_R, + KEY_ENTER_R, KET_LEFT_CTRL_R, + KEY_A_R, KEY_S_R, KEY_D_R, KEY_F_R, KEY_G_R, KEY_H_R, KEY_J_R, KEY_K_R, KEY_L_R, + KEY_SEMICOLON_R, KEY_SINGLE_QUOTE_R, KEY_BACK_TICK_R, KEY_LEFT_SHIFT_R, KEY_BACKSLASH_R, + KEY_Z_R, KEY_X_R, KEY_C_R, KEY_V_R, KEY_B_R, KEY_N_R, KEY_M_R, + KEY_COMMA_R, KEY_PERIOD_R, + KEY_FORWARDSLASH_R, + KEY_RIGHT_SHIFT_R, + KEY_KP_ASTERISK_R, + KEY_LEFT_ALT_R, + KEY_SPACE_R, KEY_CAPSLOCK_R, + KEY_F1_R, KEY_F2_R, KEY_F3_R, KEY_F4_R, KEY_F5_R, KEY_F6_R, KEY_F7_R, KEY_F8_R, KEY_F9_R, KEY_F10_R, + KEY_NUMLOCK_R, KEY_SCROLLLOCK_R, + KEY_KP_7_R, KEY_KP_8_R, KEY_KP_9_R, + KEY_KP_MINUS_R, + KEY_KP_4_R, KEY_KP_5_R, KEY_KP_6_R, + KEY_KP_PLUS_R, + KEY_KP_1_R, KEY_KP_2_R, KEY_KP_3_R, KEY_KP_0_R, + KEY_KP_PERIOD_R, + KEY_F11_R = 0xD7, + KEY_F12_R, +} kb_key_press_t; + +kb_key_press_t decode_scancode(uint8_t scancode); + +char decode_key_enum(kb_key_press_t keycode); + +#endif