123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #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;
- }
- }
|