From 2b542cb4d5f2302f41d478892694124472cde8b0 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 30 Jul 2026 13:45:18 +0200 Subject: kernel: add support for character devices --- kernel/kernel/drivers/storage/ram_disk.hpp | 1 + kernel/kernel/filesystem/device_inode.cpp | 19 ++++++++++++++++++- kernel/kernel/filesystem/device_inode.hpp | 10 ++++++++-- kernel/kernel/filesystem/file_type_bindings.hpp | 3 ++- 4 files changed, 29 insertions(+), 4 deletions(-) (limited to 'kernel') diff --git a/kernel/kernel/drivers/storage/ram_disk.hpp b/kernel/kernel/drivers/storage/ram_disk.hpp index d5d54551..45c5bbc2 100644 --- a/kernel/kernel/drivers/storage/ram_disk.hpp +++ b/kernel/kernel/drivers/storage/ram_disk.hpp @@ -2,6 +2,7 @@ #define TEACH_OS_KERNEL_DRIVERS_STORAGE_RAM_DISK_HPP #include +#include #include #include diff --git a/kernel/kernel/filesystem/device_inode.cpp b/kernel/kernel/filesystem/device_inode.cpp index 4696504e..d6f7637a 100644 --- a/kernel/kernel/filesystem/device_inode.cpp +++ b/kernel/kernel/filesystem/device_inode.cpp @@ -14,7 +14,9 @@ #include #include +#include #include +#include namespace kernel::filesystem { @@ -51,6 +53,11 @@ namespace kernel::filesystem { return devices::block_device_utils::read(*block_device, buffer, offset, size); } + else if (auto character_device = + kapi::devices::facet_registry::get().resolve(*m_device)) + { + return character_device->read(std::span{static_cast(buffer), size.value}); + } return kstd::failure(vfs_errc::no_such_device); } @@ -68,6 +75,11 @@ namespace kernel::filesystem { return devices::block_device_utils::write(*block_device, buffer, offset, size); } + else if (auto character_device = + kapi::devices::facet_registry::get().resolve(*m_device)) + { + return character_device->write(std::span{static_cast(buffer), size.value}); + } return kstd::failure(vfs_errc::no_such_device); } @@ -79,7 +91,12 @@ namespace kernel::filesystem auto device_inode::is_block_device() const -> bool { - return true; + return kapi::devices::facet_registry::get().resolve(*m_device); + } + + auto device_inode::is_character_device() const -> bool + { + return kapi::devices::facet_registry::get().resolve(*m_device); } auto device_inode::status() const -> kstd::result diff --git a/kernel/kernel/filesystem/device_inode.hpp b/kernel/kernel/filesystem/device_inode.hpp index e2167131..17ebe236 100644 --- a/kernel/kernel/filesystem/device_inode.hpp +++ b/kernel/kernel/filesystem/device_inode.hpp @@ -61,11 +61,17 @@ namespace kernel::filesystem [[nodiscard]] auto device() const -> kstd::shared_ptr const &; /** - @brief Check if this inode represents a device. - @return returns true, since this inode is a device inode and represents a device. + @brief Check if this inode represents a block device. + @return true iff. the underlying device is a block device, false otherwise. */ [[nodiscard]] auto is_block_device() const -> bool override; + /** + @brief Check if this inode represents a character device. + @return true iff. the underlying device is a character device, false otherwise. + */ + [[nodiscard]] auto is_character_device() const -> bool override; + [[nodiscard]] auto status() const -> kstd::result override; [[nodiscard]] auto raw_device() const -> std::optional override; diff --git a/kernel/kernel/filesystem/file_type_bindings.hpp b/kernel/kernel/filesystem/file_type_bindings.hpp index ea52972b..b4338024 100644 --- a/kernel/kernel/filesystem/file_type_bindings.hpp +++ b/kernel/kernel/filesystem/file_type_bindings.hpp @@ -22,7 +22,8 @@ namespace kernel::filesystem //! //! This array associates published facets with files types. constexpr auto inline file_type_bindings = std::array{ - file_type_binding{kapi::filesystem::block_special_file::id, file_type::block}, + file_type_binding{kapi::filesystem::character_special_file::id, file_type::character}, + file_type_binding{ kapi::filesystem::block_special_file::id, file_type::block}, }; } // namespace kernel::filesystem -- cgit v1.2.3