diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/keyboard.cc | 147 | ||||
-rw-r--r-- | drivers/keyboard.h | 15 | ||||
-rw-r--r-- | drivers/makefile | 3 | ||||
-rw-r--r-- | drivers/ports.h | 4 |
4 files changed, 167 insertions, 2 deletions
diff --git a/drivers/keyboard.cc b/drivers/keyboard.cc new file mode 100644 index 0000000..268ce2b --- /dev/null +++ b/drivers/keyboard.cc @@ -0,0 +1,147 @@ +#include "keyboard.h" +#include <stdlib.h> + +Keyboard::Keyboard() : InterruptHandler(0x01) { + // eat all previous keystrikes + while (commandport.read() & 0x1) dataport.read(); + commandport.write(0xae); // ??? + commandport.write(0x20); // get state ??? + auto status = (dataport.read() | 1) & ~0x10; + commandport.write(0x60); // set state ??? + dataport.write(status); // ??? + dataport.write(0xf4); // ??? +} + +void Keyboard::trigger() { + const auto key = dataport.read(); + + if (key < 0x80) { + switch (key) { + case 0x04: + printk('3'); + break; + case 0x05: + printk('4'); + break; + case 0x06: + printk('5'); + break; + case 0x07: + printk('6'); + break; + case 0x08: + printk('7'); + break; + case 0x09: + printk('8'); + break; + case 0x0A: + printk('9'); + break; + case 0x0B: + printk('0'); + break; + + case 0x10: + printk('q'); + break; + case 0x11: + printk('w'); + break; + case 0x12: + printk('e'); + break; + case 0x13: + printk('r'); + break; + case 0x14: + printk('t'); + break; + case 0x15: + printk('y'); + break; + case 0x16: + printk('u'); + break; + case 0x17: + printk('i'); + break; + case 0x18: + printk('o'); + break; + case 0x19: + printk('p'); + break; + + case 0x1E: + printk('a'); + break; + case 0x1F: + printk('s'); + break; + case 0x20: + printk('d'); + break; + case 0x21: + printk('f'); + break; + case 0x22: + printk('g'); + break; + case 0x23: + printk('h'); + break; + case 0x24: + printk('j'); + break; + case 0x25: + printk('k'); + break; + case 0x26: + printk('l'); + break; + + case 0x2C: + printk('z'); + break; + case 0x2D: + printk('x'); + break; + case 0x2E: + printk('c'); + break; + case 0x2F: + printk('v'); + break; + case 0x30: + printk('b'); + break; + case 0x31: + printk('n'); + break; + case 0x32: + printk('m'); + break; + case 0x33: + printk(','); + break; + case 0x34: + printk('.'); + break; + case 0x35: + printk('/'); + break; + + case 0x1C: + printk('\n'); + break; + case 0x39: + printk(' '); + break; + + default: + printk("keyboard interrupt: ", uhex{key}, "\n"); + break; + } + } +} diff --git a/drivers/keyboard.h b/drivers/keyboard.h new file mode 100644 index 0000000..a14c2c0 --- /dev/null +++ b/drivers/keyboard.h @@ -0,0 +1,15 @@ +#pragma once + +#include "idt.h" +#include "ports.h" + +class Keyboard : public InterruptHandler { +public: + Keyboard(); + + void trigger() override; + +private: + keyboard_comm_t commandport; + keyboard_data_t dataport; +}; diff --git a/drivers/makefile b/drivers/makefile index ad255c4..2a1fa0c 100644 --- a/drivers/makefile +++ b/drivers/makefile @@ -1,5 +1,6 @@ CXX_OBJ += drivers/cga.o \ - drivers/serial.o + drivers/serial.o \ + drivers/keyboard.o HWH := drivers/hardware.h autogen := $(autogen) $(HWH) diff --git a/drivers/ports.h b/drivers/ports.h index f241299..2d26e65 100644 --- a/drivers/ports.h +++ b/drivers/ports.h @@ -58,4 +58,6 @@ typedef Port<0x2e8, uint8_t> com4_port_t; typedef Port<0x20, uint8_t> pic1_t; typedef Port<0xa0, uint8_t> pic2_t; -typedef Port<0x60, uint8_t> kb_t; +/* PS/2 keyboard */ +typedef Port<0x60, uint8_t> keyboard_data_t; +typedef Port<0x64, uint8_t> keyboard_comm_t; |