hazel/kernel/ps2.c

399 lines
10 KiB
C
Raw Normal View History

2024-07-28 10:11:15 -04:00
#include <kernel/ps2.h>
#include <kernel/io.h>
#include <kernel/pic.h>
#include <kernel/mem.h>
#include <kernel/vga.h>
2024-07-28 10:11:15 -04:00
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")
2024-07-28 10:18:59 -04:00
// perform test
outb(PS2_8042_COMMAND, 0xAB);
2024-07-28 10:11:15 -04:00
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")
2024-07-28 10:18:59 -04:00
// enable ps/2
outb(PS2_8042_COMMAND, 0xAE);
2024-07-28 10:11:15 -04:00
// 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;
vga_putc(c);
}
void pop_stdin() {
ctx.current_task->stdin[--ctx.current_task->stdin_len] = 0;
2024-07-28 10:11:15 -04:00
}
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 (ctx.current_task->stdin_len > 0) {
popchar();
pop_stdin();
}
2024-07-28 10:11:15 -04:00
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:
/*
2024-07-28 10:18:59 -04:00
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');
2024-07-28 10:11:15 -04:00
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);
}