mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-12 01:10:42 +00:00
Kernel/HID: Add methods to attach and detach standalone devices
This commit is contained in:
parent
83835c7256
commit
62c2c9df69
Notes:
sideshowbarker
2024-07-17 11:06:06 +09:00
Author: https://github.com/supercomputer7 Commit: https://github.com/SerenityOS/serenity/commit/62c2c9df69 Pull-request: https://github.com/SerenityOS/serenity/pull/21085 Reviewed-by: https://github.com/ADKaster Reviewed-by: https://github.com/FireFox317 Reviewed-by: https://github.com/Hendiadyoin1 ✅ Reviewed-by: https://github.com/gmta ✅
3 changed files with 27 additions and 0 deletions
|
@ -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<HIDDevice, NonnullRefPtr<HIDDevice>> m_list_node;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -115,6 +115,20 @@ void HIDManagement::set_maps(NonnullOwnPtr<KString> 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<void> HIDManagement::enumerate()
|
||||
{
|
||||
// FIXME: When we have USB HID support, we should ensure that we disable
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <AK/Atomic.h>
|
||||
#include <AK/Badge.h>
|
||||
#include <AK/CircularQueue.h>
|
||||
#include <AK/Error.h>
|
||||
#include <AK/IntrusiveList.h>
|
||||
|
@ -15,6 +16,7 @@
|
|||
#include <AK/Types.h>
|
||||
#include <Kernel/API/KeyCode.h>
|
||||
#include <Kernel/Bus/SerialIO/Controller.h>
|
||||
#include <Kernel/Devices/HID/Device.h>
|
||||
#include <Kernel/Locking/Spinlock.h>
|
||||
#include <Kernel/Locking/SpinlockProtected.h>
|
||||
#include <Kernel/UnixTypes.h>
|
||||
|
@ -51,6 +53,9 @@ public:
|
|||
void set_client(KeyboardClient* client);
|
||||
void set_maps(NonnullOwnPtr<KString> 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<IntrusiveList<&SerialIOController::m_list_node>, 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<IntrusiveList<&HIDDevice::m_list_node>, LockRank::None> m_standalone_hid_devices;
|
||||
Spinlock<LockRank::None> m_client_lock;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue