PS/2 keyboard check availability
All checks were successful
Build ISO image / build-and-deploy (push) Successful in 2m16s
Build documentation / build-and-deploy (push) Successful in 38s

This commit is contained in:
2026-04-25 09:37:12 +02:00
parent eba9bd04ef
commit 6e86d61643

View File

@@ -15,10 +15,13 @@
#include <sync/spin_lock.h>
#include <sys/debug.h>
#include <sys/smp.h>
#include <sys/stall.h>
#define KB_CTL_STATUS 0x64
#define KB_DATA_IN_BUF 0x01
#define KB_DATA 0x60
#define KB_IDENTIFY 0xF2
#define KB_ACK 0xFA
#define PS2KB_RINGBUFFER_MAX 2048
@@ -225,7 +228,34 @@ static void ps2kb_set_typematic(uint8_t delay, uint8_t rate) {
outb(KB_DATA, (delay << 5) | (rate & 0x1F));
}
static bool ps2kb_check(void) {
while (inb(KB_CTL_STATUS) & KB_DATA_IN_BUF)
inb(KB_DATA);
while (inb(KB_CTL_STATUS) & 0x02)
;
outb(KB_DATA, KB_IDENTIFY);
for (int i = 0; i < 1000; i++) {
if (inb(KB_CTL_STATUS) & KB_DATA_IN_BUF) {
uint8_t response = inb(KB_DATA);
if (response == KB_ACK)
return true;
}
stall_ms(2);
}
return false;
}
DEFINE_DEVICE_INIT(ps2kb_init) {
if (!ps2kb_check()) {
DEBUG("PS/2 keyboard not detected!\n");
return false;
}
ioapic_route_irq(INTR_PS2KB, 1, 0, thiscpu->lapic_id);
irq_attach(&ps2kb_irq, NULL, INTR_PS2KB);