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:
48
kernel/include/kernel/Input/MouseEvent.h
Normal file
48
kernel/include/kernel/Input/MouseEvent.h
Normal 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;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
47
kernel/include/kernel/Input/PS2/Mouse.h
Normal file
47
kernel/include/kernel/Input/PS2/Mouse.h
Normal 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;
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user