cfenollosa_os-tutorial/20-interrupts-timer/drivers/keyboard.c
2015-03-20 11:39:30 +01:00

209 lines
4.2 KiB
C

#include "keyboard.h"
#include "ports.h"
#include "../cpu/isr.h"
#include "screen.h"
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");
}
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 */
if (scancode - 0x80 <= 0x39) {
kprint("key up ");
print_letter(scancode - 0x80);
} else kprint("Unknown");
break;
}
}