From 3e1146d4b8a47be866dd45e7cce5931abd6ea5d5 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sat, 22 Jul 2023 19:41:50 +0200 Subject: [PATCH] Kernel: Detect PS2 keyboards on some chromebooks properly Some chromebooks don't support PS2 controller reset and ignore it. Other OSes in case of failed reset check by keyboard ID. Do the same --- Kernel/Devices/HID/PS2/KeyboardDevice.cpp | 24 ++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Kernel/Devices/HID/PS2/KeyboardDevice.cpp b/Kernel/Devices/HID/PS2/KeyboardDevice.cpp index 45e5a535fd..59d5e7fb6a 100644 --- a/Kernel/Devices/HID/PS2/KeyboardDevice.cpp +++ b/Kernel/Devices/HID/PS2/KeyboardDevice.cpp @@ -47,7 +47,29 @@ UNMAP_AFTER_INIT ErrorOr> PS2KeyboardDevice::tr UNMAP_AFTER_INIT ErrorOr PS2KeyboardDevice::initialize() { - return attached_controller().reset_device(attached_port_index()); + ErrorOr err = attached_controller().reset_device(attached_port_index()); + + if (err.is_error()) { + TRY(attached_controller().send_command(attached_port_index(), SerialIOController::DeviceCommand::GetDeviceID)); + ErrorOr res = attached_controller().read_from_device(attached_port_index()); + if (res.is_error()) { + return err; + } + switch (res.value()) { + // Regular and NCD Sun keyboards. + case 0xab: + case 0xac: + // Trust keyboard, raw and translated + case 0x2b: + case 0x5d: + // NMB SGI keyboard, raw and translated + case 0x60: + case 0x47: + return {}; + } + } + + return err; } // FIXME: UNMAP_AFTER_INIT might not be correct, because in practice PS/2 devices