SimpleKernel 1.17.0
Loading...
Searching...
No Matches
ns16550a_driver.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <etl/singleton.h>
8
9#include "device_node.hpp"
10#include "driver_registry.hpp"
11#include "expected.hpp"
12#include "kernel_log.hpp"
13#include "ns16550a/ns16550a.hpp"
14
21 public:
23
25
30 [[nodiscard]] static auto GetEntry() -> const DriverEntry& {
31 static const DriverEntry entry{
32 .name = "ns16550a",
33 .match_table = etl::span<const MatchEntry>(kMatchTable),
34 .match = etl::delegate<bool(
35 DeviceNode&)>::create<&Ns16550aDriver::MatchStatic>(),
36 .probe = etl::delegate<Expected<void>(DeviceNode&)>::create<
38 etl::singleton<Ns16550aDriver>::instance()),
39 .remove = etl::delegate<Expected<void>(DeviceNode&)>::create<
41 etl::singleton<Ns16550aDriver>::instance()),
42 };
43 return entry;
44 }
45
53 [[nodiscard]] static auto MatchStatic([[maybe_unused]] DeviceNode& node)
54 -> bool {
55 static constexpr size_t kMinRegisterSpace = 8;
56 return node.mmio_base != 0 && node.mmio_size >= kMinRegisterSpace;
57 }
58
65 [[nodiscard]] auto Probe(DeviceNode& node) -> Expected<void> {
66 auto ctx = mmio_helper::Prepare(node, 0x100);
67 if (!ctx) {
68 return std::unexpected(ctx.error());
69 }
70
71 auto result = Ns16550aType::Create(ctx->base);
72 if (!result) {
73 return std::unexpected(Error(result.error().code));
74 }
75
76 uart_ = std::move(*result);
77 node.type = DeviceType::kChar;
78 klog::Info("Ns16550aDriver: UART at {:#x} bound", node.mmio_base);
79 return {};
80 }
81
87 [[nodiscard]] auto Remove([[maybe_unused]] DeviceNode& node)
89 return {};
90 }
91
96 [[nodiscard]] auto GetDevice() -> Ns16550aType* { return &uart_; }
97
100 Ns16550aDriver() = default;
103 auto operator=(const Ns16550aDriver&) -> Ns16550aDriver& = delete;
105 ~Ns16550aDriver() = default;
107
108 private:
109 static constexpr MatchEntry kMatchTable[] = {
110 {BusType::kPlatform, "ns16550a"},
111 {BusType::kPlatform, "ns16550"},
112 };
113
115};
116
117using Ns16550aDriverSingleton = etl::singleton<Ns16550aDriver>;
NS16550A UART 驱动
auto Probe(DeviceNode &node) -> Expected< void >
初始化 NS16550A UART。
static auto GetEntry() -> const DriverEntry &
返回用于注册的 DriverEntry
auto operator=(const Ns16550aDriver &) -> Ns16550aDriver &=delete
Ns16550aDriver(Ns16550aDriver &&)=default
static auto MatchStatic(DeviceNode &node) -> bool
硬件检测:MMIO 区域大小是否足够 NS16550A?
Ns16550aDriver()=default
auto operator=(Ns16550aDriver &&) -> Ns16550aDriver &=default
auto Remove(DeviceNode &node) -> Expected< void >
卸载驱动
auto GetDevice() -> Ns16550aType *
获取 NS16550A 设备实例
static constexpr MatchEntry kMatchTable[]
~Ns16550aDriver()=default
Ns16550aDriver(const Ns16550aDriver &)=delete
NS16550A 串口驱动
Definition ns16550a.hpp:23
static auto Create(uint64_t dev_addr) -> Expected< Ns16550a >
工厂方法:创建并初始化 NS16550A 驱动
Definition ns16550a.hpp:30
@ kChar
字符设备(串口等)
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
auto Prepare(const DeviceNode &node, size_t default_size) -> Expected< ProbeContext >
从节点提取 MMIO base/size 并通过 VirtualMemory 映射该区域。
etl::singleton< Ns16550aDriver > Ns16550aDriverSingleton
单个设备的硬件资源描述。
类型擦除的驱动条目 — 每个已注册驱动对应一条。
const char * name
错误类型,用于 std::expected
Definition expected.hpp:343
驱动静态匹配表中的一条记录