SysFSUSB.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/Bus/USB/USBDevice.h>
  8. #include <Kernel/FileSystem/SysFS.h>
  9. #include <Kernel/KBufferBuilder.h>
  10. #include <Kernel/Locking/Mutex.h>
  11. namespace Kernel::USB {
  12. class SysFSUSBDeviceInformation : public SysFSComponent {
  13. friend class SysFSUSBBusDirectory;
  14. public:
  15. virtual ~SysFSUSBDeviceInformation() override;
  16. static NonnullRefPtr<SysFSUSBDeviceInformation> create(USB::Device&);
  17. RefPtr<USB::Device> device() const { return m_device; }
  18. protected:
  19. explicit SysFSUSBDeviceInformation(USB::Device& device);
  20. virtual KResultOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription*) const override;
  21. IntrusiveListNode<SysFSUSBDeviceInformation, RefPtr<SysFSUSBDeviceInformation>> m_list_node;
  22. NonnullRefPtr<USB::Device> m_device;
  23. private:
  24. bool output(KBufferBuilder& builder);
  25. virtual KResult refresh_data(FileDescription& description) const override;
  26. mutable Mutex m_lock { "SysFSUSBDeviceInformation" };
  27. };
  28. class SysFSUSBBusDirectory final : public SysFSDirectory {
  29. public:
  30. static void initialize();
  31. static SysFSUSBBusDirectory& the();
  32. void plug(USB::Device&);
  33. void unplug(USB::Device&);
  34. virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  35. virtual RefPtr<SysFSComponent> lookup(StringView name) override;
  36. private:
  37. explicit SysFSUSBBusDirectory(SysFSBusDirectory&);
  38. RefPtr<SysFSUSBDeviceInformation> device_node_for(USB::Device& device);
  39. IntrusiveList<SysFSUSBDeviceInformation, RefPtr<SysFSUSBDeviceInformation>, &SysFSUSBDeviceInformation::m_list_node> m_device_nodes;
  40. mutable Spinlock<u8> m_lock;
  41. };
  42. }