diff options
author | Marvin Borner | 2019-09-19 19:56:59 +0200 |
---|---|---|
committer | Marvin Borner | 2019-09-19 20:05:38 +0200 |
commit | 05e1fedcc9cd30d1a34a65e640da45e980b4f859 (patch) | |
tree | 9cfb7620907ac126f26cdfe9363cb73ed74ea179 /src/kernel/input | |
parent | ffd82e18b5259fab477ad375a7af8550fac526d8 (diff) |
Moved source to kernel directory
Diffstat (limited to 'src/kernel/input')
-rw-r--r-- | src/kernel/input/input.h | 10 | ||||
-rw-r--r-- | src/kernel/input/ps2/keyboard.c | 50 | ||||
-rw-r--r-- | src/kernel/input/ps2/mouse.c | 107 |
3 files changed, 167 insertions, 0 deletions
diff --git a/src/kernel/input/input.h b/src/kernel/input/input.h new file mode 100644 index 0000000..60d2f79 --- /dev/null +++ b/src/kernel/input/input.h @@ -0,0 +1,10 @@ +#ifndef MELVIX_INPUT_H +#define MELVIX_INPUT_H + +void mouse_install(); + +char get_mouse(int n); + +void keyboard_install(); + +#endif diff --git a/src/kernel/input/ps2/keyboard.c b/src/kernel/input/ps2/keyboard.c new file mode 100644 index 0000000..ae17675 --- /dev/null +++ b/src/kernel/input/ps2/keyboard.c @@ -0,0 +1,50 @@ +#include "../../interrupts/interrupts.h" +#include "../../io/io.h" +#include "../../graphics/graphics.h" + +unsigned char keymap[128] = { + 0 /*E*/, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', + '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', + 0 /*C*/, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0 /*LS*/, + '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0 /*RS*/, '*', + 0, // Alt key + ' ', // Space bar + 0, // Caps lock + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // F keys + 0, // Num lock + 0, // Scroll lock + 0, // Home key + 0, // Up arrow + 0, // Page up + '-', + 0, // Left arrow + 0, + 0, // Right arrow + '+', + 0, // End key + 0, // Down arrow + 0, // Page down + 0, // Insert key + 0, // Delete key + 0, 0, 0, + 0, // F11 + 0, // F12 + 0, // Other keys +}; + +void keyboard_handler(struct regs *r) { + unsigned char scan_code; + + scan_code = receive(0x60); + + if (scan_code & 0x80) { + // Release + } else { + terminal_put_char(keymap[scan_code]); + } +} + +/* Installs the keyboard handler into IRQ1 */ +void keyboard_install() { + irq_install_handler(1, keyboard_handler); +} diff --git a/src/kernel/input/ps2/mouse.c b/src/kernel/input/ps2/mouse.c new file mode 100644 index 0000000..49c5a6c --- /dev/null +++ b/src/kernel/input/ps2/mouse.c @@ -0,0 +1,107 @@ +#include "../../io/io.h" +#include "../../interrupts/interrupts.h" + +char mouse_cycle = 0; +signed char mouse_byte[3], mouse_ex[3]; +signed char mouse_x = 0; +signed char mouse_y = 0; +int mouse_but_1 = 0; +int mouse_but_2 = 0; +int mm_n[3] = {0, 0, 0,}; + +void mouse_handler(struct regs *a_r) { + switch (mouse_cycle) { + case 0: + mouse_byte[0] = receive(0x60); + mouse_cycle++; + break; + case 1: + mouse_byte[1] = receive(0x60); + mouse_cycle++; + break; + case 2: + mouse_byte[2] = receive(0x60); + mouse_x = mouse_byte[1]; + mouse_y = mouse_byte[2]; + mouse_but_1 = (mouse_byte[0] % 2); + mouse_but_2 = ((mouse_byte[0] % 4) - (mouse_byte[0] % 2)) / 2; + mouse_cycle = 0; + mouse_ex[0] = mouse_byte[0]; + mm_n[0] = 1; + mouse_ex[1] = mouse_byte[1]; + mm_n[1] = 1; + mouse_ex[2] = mouse_byte[2]; + mm_n[2] = 1; + break; + default: + break; + } +} + +inline void mouse_wait(char a_type) { + unsigned int _time_out = 100000; + if (a_type == 0) { + while (_time_out--) { + if ((receive(0x64) & 1) == 1) { + return; + } + } + return; + } else { + while (_time_out--) { + if ((receive(0x64) & 2) == 0) { + return; + } + } + return; + } +} + +inline void mouse_write(char a_write) { + mouse_wait(1); + send(0x64, 0xD4); + mouse_wait(1); + send(0x60, a_write); +} + +char mouse_read() { + mouse_wait(0); + return receive(0x60); +} + +void mouse_install() { + char _status; + + // Enable auxiliary mouse device + mouse_wait(1); + send(0x64, 0xA8); + + // Enable interrupts + mouse_wait(1); + send(0x64, 0x20); + mouse_wait(0); + _status = (receive(0x60) | 2); + mouse_wait(1); + send(0x64, 0x60); + mouse_wait(1); + send(0x60, _status); + + // Use default settings + mouse_write(0xF6); + mouse_read(); + + // Enable mouse + mouse_write(0xF4); + mouse_read(); + + // Setup the mouse handler + irq_install_handler(2, mouse_handler); +} + +char get_mouse(int n) { + if (mm_n[n] == 1) { + mm_n[n] = 0; + return mouse_ex[n]; + } else + return 0; +}
\ No newline at end of file |