395 lines
9.8 KiB
C
395 lines
9.8 KiB
C
|
#include <kernel/ps2.h>
|
||
|
#include <kernel/io.h>
|
||
|
#include <kernel/pic.h>
|
||
|
#include <kernel/mem.h>
|
||
|
|
||
|
extern kernel_ctx_t ctx;
|
||
|
char shell_buffer[512] = {0};
|
||
|
int shell_index = 0;
|
||
|
|
||
|
// TODO: Support dual ports
|
||
|
void ps2_init() {
|
||
|
// disable ps/2 ports so nothing gets messed up
|
||
|
outb(PS2_8042_COMMAND, 0xAD);
|
||
|
outb(PS2_8042_COMMAND, 0xA7);
|
||
|
|
||
|
// flush output buffer
|
||
|
inb(PS2_8042_DATA);
|
||
|
|
||
|
// get config byte
|
||
|
outb(PS2_8042_COMMAND, 0x20);
|
||
|
uint8_t config = inb(0x60);
|
||
|
// disable IRQs and translation, also make sure 0 vals are 0
|
||
|
config &= 0b00110100;
|
||
|
// write our config byte back
|
||
|
outb(PS2_8042_COMMAND, 0x60);
|
||
|
while (inb(PS2_8042_STATUS) & 0x2) cpu_relax;
|
||
|
outb(PS2_8042_DATA, config);
|
||
|
|
||
|
// perform self test
|
||
|
outb(PS2_8042_COMMAND, 0xAA);
|
||
|
while (!(inb(PS2_8042_STATUS) & 0x1)) cpu_relax;
|
||
|
uint8_t result = inb(PS2_8042_DATA);
|
||
|
if (result == 0x55) LOG("Passed PS/2 self test\n")
|
||
|
else LOG("Failed!\n")
|
||
|
|
||
|
// perform test
|
||
|
outb(PS2_8042_COMMAND, 0xAB);
|
||
|
while (!(inb(PS2_8042_STATUS) & 0x1)) cpu_relax;
|
||
|
result = inb(PS2_8042_DATA);
|
||
|
if (!result) LOG("Passed PS/2 port 1 test\n")
|
||
|
else LOG("Failed!\n")
|
||
|
|
||
|
// enable ps/2
|
||
|
outb(PS2_8042_COMMAND, 0xAE);
|
||
|
|
||
|
// enable IRQ 1
|
||
|
config = 0b01100101;
|
||
|
outb(PS2_8042_COMMAND, 0x60);
|
||
|
while (inb(PS2_8042_STATUS) & 0x2) cpu_relax;
|
||
|
outb(PS2_8042_DATA, config);
|
||
|
}
|
||
|
|
||
|
void push_stdin(const char c) {
|
||
|
ctx.current_task->stdin[ctx.current_task->stdin_len++] = c;
|
||
|
_putchar(c);
|
||
|
}
|
||
|
|
||
|
void ps2_handler() {
|
||
|
uint8_t scancode = inb(0x60);
|
||
|
|
||
|
if (scancode > 0x80) goto eoi;
|
||
|
|
||
|
switch(scancode) {
|
||
|
case KBD_ESC:
|
||
|
break;
|
||
|
case KBD_1:
|
||
|
push_stdin('1');
|
||
|
break;
|
||
|
case KBD_2:
|
||
|
push_stdin('2');
|
||
|
break;
|
||
|
case KBD_3:
|
||
|
push_stdin('3');
|
||
|
break;
|
||
|
case KBD_4:
|
||
|
push_stdin('4');
|
||
|
break;
|
||
|
case KBD_5:
|
||
|
push_stdin('5');
|
||
|
break;
|
||
|
case KBD_6:
|
||
|
push_stdin('6');
|
||
|
break;
|
||
|
case KBD_7:
|
||
|
push_stdin('7');
|
||
|
break;
|
||
|
case KBD_8:
|
||
|
push_stdin('8');
|
||
|
break;
|
||
|
case KBD_9:
|
||
|
push_stdin('9');
|
||
|
break;
|
||
|
case KBD_0:
|
||
|
push_stdin('0');
|
||
|
break;
|
||
|
case KBD_MINUS:
|
||
|
push_stdin('-');
|
||
|
break;
|
||
|
case KBD_EQUALS:
|
||
|
push_stdin('=');
|
||
|
break;
|
||
|
case KBD_BACKSPACE:
|
||
|
/*
|
||
|
if (shell_index > 0) {
|
||
|
//popchar();
|
||
|
shell_buffer[--shell_index] = 0;
|
||
|
}*/
|
||
|
break;
|
||
|
case KBD_TAB:
|
||
|
break;
|
||
|
case KBD_Q:
|
||
|
push_stdin('Q');
|
||
|
break;
|
||
|
case KBD_W:
|
||
|
push_stdin('W');
|
||
|
break;
|
||
|
case KBD_E:
|
||
|
push_stdin('E');
|
||
|
break;
|
||
|
case KBD_R:
|
||
|
push_stdin('R');
|
||
|
break;
|
||
|
case KBD_T:
|
||
|
push_stdin('T');
|
||
|
break;
|
||
|
case KBD_Y:
|
||
|
push_stdin('Y');
|
||
|
break;
|
||
|
case KBD_U:
|
||
|
push_stdin('U');
|
||
|
break;
|
||
|
case KBD_I:
|
||
|
push_stdin('I');
|
||
|
break;
|
||
|
case KBD_O:
|
||
|
push_stdin('O');
|
||
|
break;
|
||
|
case KBD_P:
|
||
|
push_stdin('P');
|
||
|
break;
|
||
|
case KBD_LBRACKET:
|
||
|
push_stdin('[');
|
||
|
break;
|
||
|
case KBD_RBRACKET:
|
||
|
push_stdin(']');
|
||
|
break;
|
||
|
case KBD_ENTER:
|
||
|
/*
|
||
|
if (strcmp(shell_buffer, "PINGAS") == 0) {
|
||
|
printf("andew pingas detected");
|
||
|
} else if (strcmp(shell_buffer, "HELLO") == 0) {
|
||
|
printf("hi");
|
||
|
} else if (strcmp(shell_buffer, "READ") == 0) {
|
||
|
uint8_t sector[512] = {0};
|
||
|
ata_read_sector(ATA_PRIMARY, ATA_MASTER, 0, sector);
|
||
|
for (int i = 0; i < 512; i++) {
|
||
|
push_stdin(sector[i]);
|
||
|
}
|
||
|
} else {
|
||
|
printf("unknown command '%s' idiot", shell_buffer);
|
||
|
}
|
||
|
for (int i = 0; i < 512; i++) {
|
||
|
shell_buffer[i] = 0;
|
||
|
}
|
||
|
shell_index = 0;
|
||
|
*/
|
||
|
push_stdin('\n');
|
||
|
break;
|
||
|
case KBD_LCTRL:
|
||
|
// Handle left control key
|
||
|
break;
|
||
|
case KBD_A:
|
||
|
push_stdin('A');
|
||
|
break;
|
||
|
case KBD_S:
|
||
|
push_stdin('S');
|
||
|
break;
|
||
|
case KBD_D:
|
||
|
push_stdin('D');
|
||
|
break;
|
||
|
case KBD_F:
|
||
|
push_stdin('F');
|
||
|
break;
|
||
|
case KBD_G:
|
||
|
push_stdin('G');
|
||
|
break;
|
||
|
case KBD_H:
|
||
|
push_stdin('H');
|
||
|
break;
|
||
|
case KBD_J:
|
||
|
push_stdin('J');
|
||
|
break;
|
||
|
case KBD_K:
|
||
|
push_stdin('K');
|
||
|
break;
|
||
|
case KBD_L:
|
||
|
push_stdin('L');
|
||
|
break;
|
||
|
case KBD_SEMICOLON:
|
||
|
push_stdin(';');
|
||
|
break;
|
||
|
case KBD_APOSTROPHE:
|
||
|
push_stdin('\'');
|
||
|
break;
|
||
|
case KBD_GRAVE:
|
||
|
push_stdin('`');
|
||
|
break;
|
||
|
case KBD_LSHIFT:
|
||
|
// Handle left shift key
|
||
|
break;
|
||
|
case KBD_BACKSLASH:
|
||
|
push_stdin('\\');
|
||
|
break;
|
||
|
case KBD_Z:
|
||
|
push_stdin('Z');
|
||
|
break;
|
||
|
case KBD_X:
|
||
|
push_stdin('X');
|
||
|
break;
|
||
|
case KBD_C:
|
||
|
push_stdin('C');
|
||
|
break;
|
||
|
case KBD_V:
|
||
|
push_stdin('V');
|
||
|
break;
|
||
|
case KBD_B:
|
||
|
push_stdin('B');
|
||
|
break;
|
||
|
case KBD_N:
|
||
|
push_stdin('N');
|
||
|
break;
|
||
|
case KBD_M:
|
||
|
push_stdin('M');
|
||
|
break;
|
||
|
case KBD_COMMA:
|
||
|
push_stdin(',');
|
||
|
break;
|
||
|
case KBD_PERIOD:
|
||
|
push_stdin('.');
|
||
|
break;
|
||
|
case KBD_SLASH:
|
||
|
push_stdin('/');
|
||
|
break;
|
||
|
case KBD_RSHIFT:
|
||
|
// Handle right shift key
|
||
|
break;
|
||
|
case KBD_PRINTSCREEN:
|
||
|
// Handle print screen key
|
||
|
break;
|
||
|
case KBD_LALT:
|
||
|
// Handle left alt key
|
||
|
break;
|
||
|
case KBD_SPACE:
|
||
|
push_stdin(' ');
|
||
|
break;
|
||
|
case KBD_CAPSLOCK:
|
||
|
// Handle caps lock key
|
||
|
break;
|
||
|
case KBD_F1:
|
||
|
// Handle F1 key
|
||
|
break;
|
||
|
case KBD_F2:
|
||
|
// Handle F2 key
|
||
|
break;
|
||
|
case KBD_F3:
|
||
|
// Handle F3 key
|
||
|
break;
|
||
|
case KBD_F4:
|
||
|
// Handle F4 key
|
||
|
break;
|
||
|
case KBD_F5:
|
||
|
// Handle F5 key
|
||
|
break;
|
||
|
case KBD_F6:
|
||
|
// Handle F6 key
|
||
|
break;
|
||
|
case KBD_F7:
|
||
|
// Handle F7 key
|
||
|
break;
|
||
|
case KBD_F8:
|
||
|
// Handle F8 key
|
||
|
break;
|
||
|
case KBD_F9:
|
||
|
// Handle F9 key
|
||
|
break;
|
||
|
case KBD_F10:
|
||
|
// Handle F10 key
|
||
|
break;
|
||
|
case KBD_NUMLOCK:
|
||
|
// Handle num lock key
|
||
|
break;
|
||
|
case KBD_SCROLLLOCK:
|
||
|
// Handle scroll lock key
|
||
|
break;
|
||
|
case KBD_HOME:
|
||
|
// Handle home key
|
||
|
break;
|
||
|
case KBD_UP:
|
||
|
// Handle up arrow key
|
||
|
break;
|
||
|
case KBD_PAGEUP:
|
||
|
// Handle page up key
|
||
|
break;
|
||
|
case KBD_KP_MINUS:
|
||
|
// Handle keypad minus key
|
||
|
break;
|
||
|
case KBD_LEFT:
|
||
|
// Handle left arrow key
|
||
|
break;
|
||
|
case KBD_KP_5:
|
||
|
// Handle keypad 5 key
|
||
|
break;
|
||
|
case KBD_RIGHT:
|
||
|
// Handle right arrow key
|
||
|
break;
|
||
|
case KBD_KP_PLUS:
|
||
|
// Handle keypad plus key
|
||
|
break;
|
||
|
case KBD_END:
|
||
|
// Handle end key
|
||
|
break;
|
||
|
case KBD_DOWN:
|
||
|
// Handle down arrow key
|
||
|
break;
|
||
|
case KBD_PAGEDOWN:
|
||
|
// Handle page down key
|
||
|
break;
|
||
|
case KBD_INSERT:
|
||
|
// Handle insert key
|
||
|
break;
|
||
|
case KBD_DELETE:
|
||
|
// Handle delete key
|
||
|
break;
|
||
|
case KBD_SYSRQ:
|
||
|
// Handle system request key
|
||
|
break;
|
||
|
case KBD_F11:
|
||
|
// Handle F11 key
|
||
|
break;
|
||
|
case KBD_F12:
|
||
|
// Handle F12 key
|
||
|
break;
|
||
|
case KBD_KP_ENTER:
|
||
|
break;
|
||
|
case KBD_RCTRL:
|
||
|
// Handle right control key
|
||
|
break;
|
||
|
case KBD_KP_DIVIDE:
|
||
|
// Handle keypad divide key
|
||
|
break;
|
||
|
case KBD_PRINTSCREEN2:
|
||
|
// Handle print screen key (alternate)
|
||
|
break;
|
||
|
case KBD_RALT:
|
||
|
// Handle right alt key
|
||
|
break;
|
||
|
case KBD_HOME2:
|
||
|
// Handle home key (alternate)
|
||
|
break;
|
||
|
case KBD_UP2:
|
||
|
// Handle up arrow key (alternate)
|
||
|
break;
|
||
|
case KBD_PAGEUP2:
|
||
|
// Handle page up key (alternate)
|
||
|
break;
|
||
|
case KBD_LEFT2:
|
||
|
// Handle left arrow key (alternate)
|
||
|
break;
|
||
|
case KBD_RIGHT2:
|
||
|
// Handle right arrow key (alternate)
|
||
|
break;
|
||
|
case KBD_END2:
|
||
|
// Handle end key (alternate)
|
||
|
break;
|
||
|
case KBD_DOWN2:
|
||
|
// Handle down arrow key (alternate)
|
||
|
break;
|
||
|
case KBD_PAGEDOWN2:
|
||
|
// Handle page down key (alternate)
|
||
|
break;
|
||
|
case KBD_INSERT2:
|
||
|
// Handle insert key (alternate)
|
||
|
break;
|
||
|
case KBD_DELETE2:
|
||
|
// Handle delete key (alternate)
|
||
|
break;
|
||
|
default:
|
||
|
// Handle unknown scan codes
|
||
|
LOG("Unknown scan code\n");
|
||
|
break;
|
||
|
}
|
||
|
eoi:
|
||
|
pic_send_eoi(1);
|
||
|
}
|