working on kernel tasklets

This commit is contained in:
2026-07-22 17:34:00 -05:00
parent 974e23987e
commit 21c66f13fb
7 changed files with 82 additions and 48 deletions

View File

@@ -1,8 +1,13 @@
#include "kbd.h"
#include <stdint.h>
#include <drivers/ps2/ps2.h>
#include <lib/print.h>
#include <lib/ringbuf.h>
#include <vfs.h>
#include <scheduler.h>
static const char scancode_to_ascii[] = {
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b',
@@ -18,6 +23,8 @@ extern void ps2_write_data(uint8_t);
extern void ps2_flush_output_buffer(void);
extern void io_wait(void);
void ps2_task();
static uint8_t read_ccb() {
ps2_write_command(CMD_READ_CCB);
io_wait();
@@ -48,40 +55,7 @@ static void enable_port_1() {
io_wait();
}
int init_ps2() {
ps2_write_command(CMD_DISABLE_P1);
ps2_write_command(CMD_DISABLE_P2);
ps2_flush_output_buffer();
uint8_t ccb = read_ccb();
ccb = ccb & 0xEC;
write_ccb(ccb);
int result = perform_self_test();
if (result != SELF_TEST_SUCCESS) {
return -1;
}
result = test_port_1();
if (result != PORT_TEST_SUCCESS) {
return -1;
}
enable_port_1();
ccb = read_ccb();
ccb |= 0x01; // this enables interrupts for port 1, which we want
write_ccb(ccb);
return 0;
}
void ps2_init_kbd(vfs_node_t* dev) {
}
char ps2_get_ascii(uint8_t scancode) {
static char ps2_get_ascii(uint8_t scancode) {
if (scancode & 0x80) {
return 0;
}
@@ -96,3 +70,59 @@ char ps2_get_ascii(uint8_t scancode) {
return 0;
}
static ring_buf_t scancode_buf;
static void push_scancode(uint8_t scancode) {
ring_buf_write(&scancode_buf, scancode);
}
int init_ps2() {
ps2_write_command(CMD_DISABLE_P1);
ps2_write_command(CMD_DISABLE_P2);
ps2_flush_output_buffer();
if (perform_self_test() != SELF_TEST_SUCCESS) {
return 0;
}
uint8_t ccb = read_ccb();
ccb &= ~(0x01 | 0x02); // Disable interrupts
ccb |= (1 << 6); // Enable translation
write_ccb(ccb);
if (test_port_1() != PORT_TEST_SUCCESS) {
return 0;
}
enable_port_1();
ccb = read_ccb();
ccb |= 0x01;
write_ccb(ccb);
ps2_flush_output_buffer();
// start the tasklet
ring_buf_init(&scancode_buf);
sched_create_ktask(ps2_task);
return 1;
}
void ps2_task() {
kprintf("started ps2 task\n");
while (1) {
char sc;
ring_buf_read(&scancode_buf, &sc);
kprintf("ps2 read\n");
if (sc == -1) yield(); continue;
kprintf("pushing char\n");
kbd_push(ps2_get_ascii(sc));
}
}
void ps2_handle_scancode(uint8_t scancode) {
push_scancode(scancode);
}