#include #include #include #include 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); }