mirror of
https://github.com/cfenollosa/os-tutorial.git
synced 2025-12-17 12:24:37 +03:00
lesson 20, keyboard
This commit is contained in:
208
20-interrupts-timer/drivers/keyboard.c
Normal file
208
20-interrupts-timer/drivers/keyboard.c
Normal file
@@ -0,0 +1,208 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user