213 lines
4.4 KiB
C
Executable File
213 lines
4.4 KiB
C
Executable File
#include "keyboard.h"
|
|
#include "ports.h"
|
|
#include "../cpu/isr.h"
|
|
#include "screen.h"
|
|
#include "../kernel/util.h"
|
|
|
|
void init_keyboard() {
|
|
register_interrupt_handler(IRQ1, keyboard_callback);
|
|
}
|
|
|
|
void print_letter(u8 scancode) {
|
|
switch (scancode) {
|
|
case 0x0:
|
|
kprint("ERROR");
|
|
break;
|
|
case 0x1:
|
|
kprint("ESC");
|
|
break;
|
|
case 0x2:
|
|
kprint("1");
|
|
break;
|
|
case 0x3:
|
|
kprint("2");
|
|
break;
|
|
case 0x4:
|
|
kprint("3");
|
|
break;
|
|
case 0x5:
|
|
kprint("4");
|
|
break;
|
|
case 0x6:
|
|
kprint("5");
|
|
break;
|
|
case 0x7:
|
|
kprint("6");
|
|
break;
|
|
case 0x8:
|
|
kprint("7");
|
|
break;
|
|
case 0x9:
|
|
kprint("8");
|
|
break;
|
|
case 0x0A:
|
|
kprint("9");
|
|
break;
|
|
case 0x0B:
|
|
kprint("0");
|
|
break;
|
|
case 0x0C:
|
|
kprint("-");
|
|
break;
|
|
case 0x0D:
|
|
kprint("+");
|
|
break;
|
|
case 0x0E:
|
|
kprint("Backspace");
|
|
break;
|
|
case 0x0F:
|
|
kprint("Tab");
|
|
break;
|
|
case 0x10:
|
|
kprint("Q");
|
|
break;
|
|
case 0x11:
|
|
kprint("W");
|
|
break;
|
|
case 0x12:
|
|
kprint("E");
|
|
break;
|
|
case 0x13:
|
|
kprint("R");
|
|
break;
|
|
case 0x14:
|
|
kprint("T");
|
|
break;
|
|
case 0x15:
|
|
kprint("Y");
|
|
break;
|
|
case 0x16:
|
|
kprint("U");
|
|
break;
|
|
case 0x17:
|
|
kprint("I");
|
|
break;
|
|
case 0x18:
|
|
kprint("O");
|
|
break;
|
|
case 0x19:
|
|
kprint("P");
|
|
break;
|
|
case 0x1A:
|
|
kprint("[");
|
|
break;
|
|
case 0x1B:
|
|
kprint("]");
|
|
break;
|
|
case 0x1C:
|
|
kprint("ENTER");
|
|
break;
|
|
case 0x1D:
|
|
kprint("LCtrl");
|
|
break;
|
|
case 0x1E:
|
|
kprint("A");
|
|
break;
|
|
case 0x1F:
|
|
kprint("S");
|
|
break;
|
|
case 0x20:
|
|
kprint("D");
|
|
break;
|
|
case 0x21:
|
|
kprint("F");
|
|
break;
|
|
case 0x22:
|
|
kprint("G");
|
|
break;
|
|
case 0x23:
|
|
kprint("H");
|
|
break;
|
|
case 0x24:
|
|
kprint("J");
|
|
break;
|
|
case 0x25:
|
|
kprint("K");
|
|
break;
|
|
case 0x26:
|
|
kprint("L");
|
|
break;
|
|
case 0x27:
|
|
kprint(";");
|
|
break;
|
|
case 0x28:
|
|
kprint("'");
|
|
break;
|
|
case 0x29:
|
|
kprint("`");
|
|
break;
|
|
case 0x2A:
|
|
kprint("LShift");
|
|
break;
|
|
case 0x2B:
|
|
kprint("\\");
|
|
break;
|
|
case 0x2C:
|
|
kprint("Z");
|
|
break;
|
|
case 0x2D:
|
|
kprint("X");
|
|
break;
|
|
case 0x2E:
|
|
kprint("C");
|
|
break;
|
|
case 0x2F:
|
|
kprint("V");
|
|
break;
|
|
case 0x30:
|
|
kprint("B");
|
|
break;
|
|
case 0x31:
|
|
kprint("N");
|
|
break;
|
|
case 0x32:
|
|
kprint("M");
|
|
break;
|
|
case 0x33:
|
|
kprint(",");
|
|
break;
|
|
case 0x34:
|
|
kprint(".");
|
|
break;
|
|
case 0x35:
|
|
kprint("/");
|
|
break;
|
|
case 0x36:
|
|
kprint("Rshift");
|
|
break;
|
|
case 0x37:
|
|
kprint("Keypad *");
|
|
break;
|
|
case 0x38:
|
|
kprint("LAlt");
|
|
break;
|
|
case 0x39:
|
|
kprint("Spc");
|
|
break;
|
|
default:
|
|
/* 'keuyp' event corresponds to the 'keydown' + 0x80
|
|
* it may still be a scancode we haven't implemented yet, or
|
|
* maybe a control/escape sequence */
|
|
if (scancode <= 0x7f) {
|
|
kprint("Unknown key down");
|
|
} else if (scancode <= 0x39 + 0x80) {
|
|
kprint("key up ");
|
|
print_letter(scancode - 0x80);
|
|
} else kprint("Unknown key up");
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void keyboard_callback(registers_t regs) {
|
|
/* The PIC leaves us the scancode in port 0x60 */
|
|
u8 scancode = port_byte_in(0x60);
|
|
char *sc_ascii;
|
|
int_to_ascii(scancode, sc_ascii);
|
|
kprint("Keyboard scancode: ");
|
|
kprint(sc_ascii);
|
|
kprint(", ");
|
|
print_letter(scancode);
|
|
kprint("\n");
|
|
}
|
|
|