Kernel: Implement PS/2 mouse driver

This is realtively simple driver that queries extensions (scroll +
extra buttons) from mouse and reads mouse packages.
This commit is contained in:
2024-01-04 12:09:49 +02:00
parent d1e187570e
commit e45b544a39
5 changed files with 309 additions and 3 deletions

View File

@@ -0,0 +1,48 @@
#pragma once
#include <stdint.h>
namespace Kernel::Input
{
enum class MouseButton
{
Left, Right, Middle, Extra1, Extra2
};
struct MouseButtonEvent
{
MouseButton button;
bool pressed;
};
struct MouseMoveEvent
{
int32_t rel_x;
int32_t rel_y;
};
struct MouseScrollEvent
{
int32_t scroll;
};
enum class MouseEventType
{
MouseButtonEvent,
MouseMoveEvent,
MouseScrollEvent,
};
struct MouseEvent
{
MouseEventType type;
union
{
MouseButtonEvent button_event;
MouseMoveEvent move_event;
MouseScrollEvent scroll_event;
};
};
}

View File

@@ -0,0 +1,47 @@
#pragma once
#include <kernel/Input/MouseEvent.h>
#include <kernel/Input/PS2/Device.h>
#include <kernel/Semaphore.h>
namespace Kernel::Input
{
class PS2Mouse final : public PS2Device
{
private:
enum Command : uint8_t
{
SET_SAMPLE_RATE = 0xF3
};
public:
static BAN::ErrorOr<PS2Mouse*> create(PS2Controller&);
virtual void send_initialize() override;
virtual void handle_byte(uint8_t) final override;
virtual void handle_device_command_response(uint8_t) final override;
private:
PS2Mouse(PS2Controller& controller);
void initialize_extensions(uint8_t);
private:
uint8_t m_byte_buffer[10];
uint8_t m_byte_index { 0 };
bool m_enabled { false };
uint8_t m_mouse_id { 0x00 };
uint8_t m_button_mask { 0x00 };
BAN::CircularQueue<MouseEvent, 25> m_event_queue;
Semaphore m_semaphore;
protected:
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
virtual bool has_data_impl() const override;
};
}