PS2MouseDevice.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/CircularQueue.h>
  8. #include <Kernel/API/MousePacket.h>
  9. #include <Kernel/Devices/HID/I8042Controller.h>
  10. #include <Kernel/Devices/HID/MouseDevice.h>
  11. #include <Kernel/Interrupts/IRQHandler.h>
  12. #include <Kernel/Random.h>
  13. namespace Kernel {
  14. class PS2MouseDevice : public IRQHandler
  15. , public MouseDevice
  16. , public I8042Device {
  17. public:
  18. static RefPtr<PS2MouseDevice> try_to_initialize(const I8042Controller&);
  19. bool initialize();
  20. virtual ~PS2MouseDevice() override;
  21. virtual StringView purpose() const override { return class_name(); }
  22. // ^I8042Device
  23. virtual void irq_handle_byte_read(u8 byte) override;
  24. virtual void enable_interrupts() override
  25. {
  26. enable_irq();
  27. }
  28. protected:
  29. explicit PS2MouseDevice(const I8042Controller&);
  30. // ^IRQHandler
  31. virtual bool handle_irq(const RegisterState&) override;
  32. struct RawPacket {
  33. union {
  34. u32 dword;
  35. u8 bytes[4];
  36. };
  37. };
  38. u8 read_from_device();
  39. u8 send_command(u8 command);
  40. u8 send_command(u8 command, u8 data);
  41. MousePacket parse_data_packet(const RawPacket&);
  42. void set_sample_rate(u8);
  43. u8 get_device_id();
  44. u8 m_data_state { 0 };
  45. RawPacket m_data;
  46. bool m_has_wheel { false };
  47. bool m_has_five_buttons { false };
  48. };
  49. }