diff --git a/common/include/villas/kernel/devices/platform_driver.hpp b/common/include/villas/kernel/devices/platform_driver.hpp new file mode 100644 index 000000000..0a3f89f57 --- /dev/null +++ b/common/include/villas/kernel/devices/platform_driver.hpp @@ -0,0 +1,53 @@ +/* PlatformDriver + * + * Author: Pascal Bauer + * + * SPDX-FileCopyrightText: 2023-2024 Pascal Bauer + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include + +namespace villas { +namespace kernel { +namespace devices { + +class PlatformDevice; + +class PlatformDriver { +private: + static constexpr char BIND_DEFAULT[] = "bind"; + static constexpr char UNBIND_DEFAULT[] = "unbind"; + +public: + const std::filesystem::path path; + +private: + const std::filesystem::path bind_path; + const std::filesystem::path unbind_path; + +public: + PlatformDriver(const std::filesystem::path path) + : PlatformDriver(path, path / std::filesystem::path(BIND_DEFAULT), + path / std::filesystem::path(UNBIND_DEFAULT)){}; + + PlatformDriver(const std::filesystem::path path, + const std::filesystem::path bind_path, + const std::filesystem::path unbind_path) + : path(path), bind_path(bind_path), unbind_path(unbind_path){}; + + std::string name() const; + void attach(const PlatformDevice &device) const; + +private: + void bind(const PlatformDevice &device) const; + void unbind(const PlatformDevice &device) const; + void override(const PlatformDevice &device) const; +}; + +} // namespace devices +} // namespace kernel +} // namespace villas \ No newline at end of file diff --git a/common/lib/kernel/devices/platform_driver.cpp b/common/lib/kernel/devices/platform_driver.cpp new file mode 100644 index 000000000..28c3ed1f1 --- /dev/null +++ b/common/lib/kernel/devices/platform_driver.cpp @@ -0,0 +1,39 @@ +/* PlatformDriver + * + * Author: Pascal Bauer + * + * SPDX-FileCopyrightText: 2023-2024 Pascal Bauer + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +using villas::kernel::devices::PlatformDevice, + villas::kernel::devices::PlatformDriver; +using villas::kernel::devices::utils::write_to_file; + +std::string PlatformDriver::name() const { + size_t pos = path.u8string().rfind('/'); + return path.u8string().substr(pos + 1); +} + +void PlatformDriver::bind(const PlatformDevice &device) const { + write_to_file(device.name(), this->bind_path); +}; + +void PlatformDriver::unbind(const PlatformDevice &device) const { + write_to_file(device.name(), this->unbind_path); +}; + +void PlatformDriver::override(const PlatformDevice &device) const { + write_to_file(this->name(), device.override_path()); +}; + +void PlatformDriver::attach(const PlatformDevice &device) const { + if (device.driver().has_value()) { + device.driver().value().unbind(device); + } + this->override(device); + device.probe(); +}; \ No newline at end of file