Kernel: DeviceManager is now a 'FileSystem' so it can expose devices
Shell reads keyboard through /dev/input :)
This commit is contained in:
@@ -1,15 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
#include <BAN/StringView.h>
|
||||
#include <BAN/Vector.h>
|
||||
#include <kernel/FS/FileSystem.h>
|
||||
#include <kernel/FS/Inode.h>
|
||||
#include <kernel/SpinLock.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class Device
|
||||
class Device : public Inode
|
||||
{
|
||||
public:
|
||||
enum class Type
|
||||
enum class DeviceType
|
||||
{
|
||||
BlockDevice,
|
||||
CharacterDevice,
|
||||
@@ -17,36 +20,59 @@ namespace Kernel
|
||||
};
|
||||
|
||||
virtual ~Device() {}
|
||||
virtual Type type() const = 0;
|
||||
virtual DeviceType device_type() const = 0;
|
||||
virtual void update() {}
|
||||
};
|
||||
|
||||
class BlockDevice : public Device
|
||||
{
|
||||
public:
|
||||
virtual Type type() const override { return Type::BlockDevice; }
|
||||
virtual DeviceType device_type() const override { return DeviceType::BlockDevice; }
|
||||
};
|
||||
|
||||
class CharacterDevice : public Device
|
||||
{
|
||||
public:
|
||||
virtual Type type() const override { return Type::CharacterDevice; }
|
||||
|
||||
virtual BAN::ErrorOr<void> read(BAN::Span<uint8_t>);
|
||||
virtual DeviceType device_type() const override { return DeviceType::CharacterDevice; }
|
||||
};
|
||||
|
||||
class DeviceManager
|
||||
class DeviceManager final : public FileSystem, public Inode
|
||||
{
|
||||
BAN_NON_COPYABLE(DeviceManager);
|
||||
BAN_NON_MOVABLE(DeviceManager);
|
||||
|
||||
public:
|
||||
static void initialize();
|
||||
static DeviceManager& get();
|
||||
|
||||
void update();
|
||||
void add_device(Device*);
|
||||
|
||||
BAN::Vector<Device*> devices() { return m_devices; }
|
||||
virtual ino_t ino() const override { return 0; }
|
||||
virtual mode_t mode() const override { return IFDIR | IRUSR | IWUSR | IXUSR | IRGRP | IXGRP | IROTH | IXOTH; }
|
||||
virtual nlink_t nlink() const override { return 0; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual timespec atime() const override { return { 0, 0 }; }
|
||||
virtual timespec mtime() const override { return { 0, 0 }; }
|
||||
virtual timespec ctime() const override { return { 0, 0 }; }
|
||||
virtual blksize_t blksize() const override { return 0; }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
|
||||
virtual BAN::StringView name() const override { return "device-manager"sv; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override { return BAN::Error::from_errno(EISDIR); }
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) override { return BAN::Error::from_errno(EINVAL); };
|
||||
|
||||
virtual Type type() const override { return Type::DeviceManager; }
|
||||
virtual bool operator==(const Inode&) const override { return false; }
|
||||
|
||||
virtual BAN::RefPtr<Inode> root_inode() override { return this; }
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode_impl(BAN::StringView) override;
|
||||
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries_impl(size_t) override;
|
||||
|
||||
private:
|
||||
DeviceManager() = default;
|
||||
@@ -54,6 +80,8 @@ namespace Kernel
|
||||
private:
|
||||
SpinLock m_lock;
|
||||
BAN::Vector<Device*> m_devices;
|
||||
|
||||
friend class BAN::RefPtr<DeviceManager>;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -35,6 +35,8 @@ namespace Kernel
|
||||
|
||||
enum class Type
|
||||
{
|
||||
DeviceManager,
|
||||
Device,
|
||||
Ext2,
|
||||
};
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ namespace Kernel
|
||||
virtual BAN::RefPtr<Inode> root_inode() override { return m_root_inode; }
|
||||
|
||||
BAN::ErrorOr<void> mount_test();
|
||||
BAN::ErrorOr<void> mount(FileSystem*, BAN::StringView);
|
||||
|
||||
struct File
|
||||
{
|
||||
|
||||
@@ -31,8 +31,6 @@ namespace Kernel::Input
|
||||
virtual void on_byte(uint8_t) override;
|
||||
virtual void update() override;
|
||||
|
||||
virtual BAN::ErrorOr<void> read(BAN::Span<uint8_t>) override;
|
||||
|
||||
private:
|
||||
PS2Keyboard(PS2Controller& controller)
|
||||
: m_controller(controller)
|
||||
@@ -59,6 +57,31 @@ namespace Kernel::Input
|
||||
PS2Keymap m_keymap;
|
||||
|
||||
State m_state { State::Normal };
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return 0; }
|
||||
virtual mode_t mode() const override { return IFCHR | IRUSR | IRGRP; }
|
||||
virtual nlink_t nlink() const override { return 0; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual timespec atime() const override { return { 0, 0 }; }
|
||||
virtual timespec mtime() const override { return { 0, 0 }; }
|
||||
virtual timespec ctime() const override { return { 0, 0 }; }
|
||||
virtual blksize_t blksize() const override { return sizeof(KeyEvent); }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
|
||||
virtual BAN::StringView name() const override { return "input"sv; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) override { return BAN::Error::from_errno(ENOTDIR); }
|
||||
|
||||
virtual Type type() const override { return Type::Device; }
|
||||
virtual bool operator==(const Inode&) const override { return false; }
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode_impl(BAN::StringView) override { return BAN::Error::from_errno(ENOTDIR); }
|
||||
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries_impl(size_t) override { return BAN::Error::from_errno(ENOTDIR); }
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user