From 62c2c9df6918e843181aab57a9148c8b8b9d1b4f Mon Sep 17 00:00:00 2001 From: Liav A Date: Sat, 5 Mar 2022 14:12:36 +0200 Subject: [PATCH] Kernel/HID: Add methods to attach and detach standalone devices --- Kernel/Devices/HID/Device.h | 4 ++++ Kernel/Devices/HID/Management.cpp | 14 ++++++++++++++ Kernel/Devices/HID/Management.h | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/Kernel/Devices/HID/Device.h b/Kernel/Devices/HID/Device.h index ec99422548..0d0a57279b 100644 --- a/Kernel/Devices/HID/Device.h +++ b/Kernel/Devices/HID/Device.h @@ -11,7 +11,9 @@ namespace Kernel { +class HIDManagement; class HIDDevice : public CharacterDevice { + friend class HIDManagement; protected: HIDDevice(MajorNumber major, MinorNumber minor) @@ -20,6 +22,8 @@ protected: } EntropySource m_entropy_source; + + IntrusiveListNode> m_list_node; }; } diff --git a/Kernel/Devices/HID/Management.cpp b/Kernel/Devices/HID/Management.cpp index 030ee2439b..6badd34b8c 100644 --- a/Kernel/Devices/HID/Management.cpp +++ b/Kernel/Devices/HID/Management.cpp @@ -115,6 +115,20 @@ void HIDManagement::set_maps(NonnullOwnPtr character_map_name, Keyboard }); } +void HIDManagement::detach_standalone_hid_device(HIDDevice& device) +{ + m_standalone_hid_devices.with([&](auto& list) { + list.remove(device); + }); +} + +void HIDManagement::attach_standalone_hid_device(HIDDevice& device) +{ + m_standalone_hid_devices.with([&](auto& list) { + list.append(device); + }); +} + UNMAP_AFTER_INIT ErrorOr HIDManagement::enumerate() { // FIXME: When we have USB HID support, we should ensure that we disable diff --git a/Kernel/Devices/HID/Management.h b/Kernel/Devices/HID/Management.h index 39afe00f77..5dc07b416a 100644 --- a/Kernel/Devices/HID/Management.h +++ b/Kernel/Devices/HID/Management.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -15,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +53,9 @@ public: void set_client(KeyboardClient* client); void set_maps(NonnullOwnPtr character_map_name, Keyboard::CharacterMapData const& character_map); + void attach_standalone_hid_device(HIDDevice&); + void detach_standalone_hid_device(HIDDevice&); + private: size_t generate_minor_device_number_for_mouse(); size_t generate_minor_device_number_for_keyboard(); @@ -61,6 +66,10 @@ private: KeyboardClient* m_client { nullptr }; SpinlockProtected, LockRank::None> m_hid_serial_io_controllers; + // NOTE: This list is used for standalone devices, like USB HID devices + // (which are not attached via a SerialIO controller in the sense that + // there's no specific serial IO controller to coordinate their usage). + SpinlockProtected, LockRank::None> m_standalone_hid_devices; Spinlock m_client_lock; };