7#include <etl/singleton.h>
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()),
41 etl::singleton<Ns16550aDriver>::instance()),
55 static constexpr size_t kMinRegisterSpace = 8;
56 return node.mmio_base != 0 && node.mmio_size >= kMinRegisterSpace;
68 return std::unexpected(ctx.error());
73 return std::unexpected(
Error(result.error().code));
76 uart_ = std::move(*result);
78 klog::Info(
"Ns16550aDriver: UART at {:#x} bound", node.mmio_base);
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?
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
static auto Create(uint64_t dev_addr) -> Expected< Ns16550a >
工厂方法:创建并初始化 NS16550A 驱动
std::expected< T, Error > Expected
std::expected 别名模板
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