diff --git a/kernel/include/kernel/Input/PS2/Controller.h b/kernel/include/kernel/Input/PS2/Controller.h index 7afe0858..06501051 100644 --- a/kernel/include/kernel/Input/PS2/Controller.h +++ b/kernel/include/kernel/Input/PS2/Controller.h @@ -61,6 +61,7 @@ namespace Kernel::Input RecursiveSpinLock m_lock; BAN::CircularQueue m_command_queue; + uint64_t m_command_send_time { 0 }; }; } diff --git a/kernel/include/kernel/Input/PS2/Device.h b/kernel/include/kernel/Input/PS2/Device.h index 0654bacf..e49e08db 100644 --- a/kernel/include/kernel/Input/PS2/Device.h +++ b/kernel/include/kernel/Input/PS2/Device.h @@ -14,6 +14,8 @@ namespace Kernel::Input virtual void send_initialize() = 0; + virtual void command_timedout(uint8_t* command_data, uint8_t command_size) = 0; + bool append_command_queue(uint8_t command, uint8_t response_size); bool append_command_queue(uint8_t command, uint8_t data, uint8_t response_size); virtual void handle_irq() final override; diff --git a/kernel/include/kernel/Input/PS2/Keyboard.h b/kernel/include/kernel/Input/PS2/Keyboard.h index 8ce66639..425ede52 100644 --- a/kernel/include/kernel/Input/PS2/Keyboard.h +++ b/kernel/include/kernel/Input/PS2/Keyboard.h @@ -23,6 +23,8 @@ namespace Kernel::Input static BAN::ErrorOr create(PS2Controller&); virtual void send_initialize() override; + virtual void command_timedout(uint8_t* command_data, uint8_t command_size) final override; + virtual void handle_byte(uint8_t) final override; private: diff --git a/kernel/include/kernel/Input/PS2/Mouse.h b/kernel/include/kernel/Input/PS2/Mouse.h index 8447413e..b9c84dfb 100644 --- a/kernel/include/kernel/Input/PS2/Mouse.h +++ b/kernel/include/kernel/Input/PS2/Mouse.h @@ -19,6 +19,8 @@ namespace Kernel::Input static BAN::ErrorOr create(PS2Controller&); virtual void send_initialize() override; + virtual void command_timedout(uint8_t* command_data, uint8_t command_size) final override {} + virtual void handle_byte(uint8_t) final override; private: diff --git a/kernel/kernel/Input/PS2/Controller.cpp b/kernel/kernel/Input/PS2/Controller.cpp index bc28a9f7..537d0a3f 100644 --- a/kernel/kernel/Input/PS2/Controller.cpp +++ b/kernel/kernel/Input/PS2/Controller.cpp @@ -139,9 +139,18 @@ namespace Kernel::Input return; auto& command = m_command_queue.front(); if (command.state == Command::State::WaitingResponse || command.state == Command::State::WaitingAck) + { + if (SystemTimer::get().ms_since_boot() >= m_command_send_time + s_ps2_timeout_ms) + { + dwarnln_if(DEBUG_PS2, "Command timedout"); + m_devices[command.device_index]->command_timedout(command.out_data, command.out_count); + m_command_queue.pop(); + } return; + } ASSERT(command.send_index < command.out_count); command.state = Command::State::WaitingAck; + m_command_send_time = SystemTimer::get().ms_since_boot(); if (auto ret = device_send_byte(command.device_index, command.out_data[command.send_index]); ret.is_error()) { command.state = Command::State::Sending;