From 4cd2a7b41c8a4a7b5e5804c2b7dd20f92ed8c550 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 11 Jul 2024 00:05:42 -0300 Subject: [PATCH] ps2: fix real hw --- kernel-src/arch/x86-64/ps2mouse.c | 18 +++++++++++++----- kernel-src/include/x86-64/arch/ps2.h | 3 ++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/kernel-src/arch/x86-64/ps2mouse.c b/kernel-src/arch/x86-64/ps2mouse.c index d58119a3..029b00cd 100644 --- a/kernel-src/arch/x86-64/ps2mouse.c +++ b/kernel-src/arch/x86-64/ps2mouse.c @@ -18,13 +18,19 @@ static void mouse_setrate(int port, uint8_t rate) { } static uint8_t identify(int port) { - __assert(device_write_response(port, DEVICE_CMD_IDENTIFY) == ACK); - bool timeout; - uint8_t b = read_data_timeout(5, &timeout); - __assert(!timeout); - return b; + device_command(port, DEVICE_CMD_IDENTIFY); + uint8_t b = read_data_timeout(5, &timeout); + + if (b != ACK) { + printf("ps2mouse: identify failed: %x\n", b); + return RESEND; + } + + b = read_data_timeout(5, &timeout); + + return timeout ? RESEND : b; } static int datac; @@ -77,6 +83,8 @@ static void mouseisr() { void ps2mouse_init() { + inb(PS2_PORT_DATA); + if (identify(2) != MOUSE) { printf("Not a mouse!\n"); return; diff --git a/kernel-src/include/x86-64/arch/ps2.h b/kernel-src/include/x86-64/arch/ps2.h index db30d547..4306248d 100644 --- a/kernel-src/include/x86-64/arch/ps2.h +++ b/kernel-src/include/x86-64/arch/ps2.h @@ -89,9 +89,10 @@ static inline uint8_t device_write_response(int port, uint8_t command) { uint8_t r = RESEND; int tries = 0; - while (r == RESEND && tries-- < 5) { + while (r == RESEND && tries < 5) { device_command(port, command); r = read_data(); + ++tries; } return r;