SimpleKernel 1.17.0
Loading...
Searching...
No Matches
Ns16550aDriver Class Reference

NS16550A UART 驱动 More...

#include <ns16550a_driver.hpp>

Collaboration diagram for Ns16550aDriver:
Collaboration graph

Public Types

using Ns16550aType = ns16550a::Ns16550a
 

Public Member Functions

auto Probe (DeviceNode &node) -> Expected< void >
 初始化 NS16550A UART。
 
auto Remove (DeviceNode &node) -> Expected< void >
 卸载驱动
 
auto GetDevice () -> Ns16550aType *
 获取 NS16550A 设备实例
 
构造/析构函数
 Ns16550aDriver ()=default
 
 Ns16550aDriver (const Ns16550aDriver &)=delete
 
 Ns16550aDriver (Ns16550aDriver &&)=default
 
auto operator= (const Ns16550aDriver &) -> Ns16550aDriver &=delete
 
auto operator= (Ns16550aDriver &&) -> Ns16550aDriver &=default
 
 ~Ns16550aDriver ()=default
 

Static Public Member Functions

static auto GetEntry () -> const DriverEntry &
 返回用于注册的 DriverEntry
 
static auto MatchStatic (DeviceNode &node) -> bool
 硬件检测:MMIO 区域大小是否足够 NS16550A?
 

Private Attributes

Ns16550aType uart_ {}
 

Static Private Attributes

static constexpr MatchEntry kMatchTable []
 

Detailed Description

NS16550A UART 驱动

提供 NS16550A UART 设备的驱动程序实现,包括设备检测、初始化和访问接口。

Definition at line 20 of file ns16550a_driver.hpp.

Member Typedef Documentation

◆ Ns16550aType

Constructor & Destructor Documentation

◆ Ns16550aDriver() [1/3]

Ns16550aDriver::Ns16550aDriver ( )
default
Here is the caller graph for this function:

◆ Ns16550aDriver() [2/3]

Ns16550aDriver::Ns16550aDriver ( const Ns16550aDriver )
delete

◆ Ns16550aDriver() [3/3]

Ns16550aDriver::Ns16550aDriver ( Ns16550aDriver &&  )
default

◆ ~Ns16550aDriver()

Ns16550aDriver::~Ns16550aDriver ( )
default

Member Function Documentation

◆ GetDevice()

auto Ns16550aDriver::GetDevice ( ) -> Ns16550aType*
inline

获取 NS16550A 设备实例

Returns
设备实例指针

Definition at line 96 of file ns16550a_driver.hpp.

96{ return &uart_; }

◆ GetEntry()

static auto Ns16550aDriver::GetEntry ( ) -> const DriverEntry&
inlinestatic

返回用于注册的 DriverEntry

Note
使用 Ns16550aDriverSingleton::instance() 访问单例。
Returns
DriverEntry 常量引用

Definition at line 30 of file ns16550a_driver.hpp.

30 {
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 }
auto Probe(DeviceNode &node) -> Expected< void >
初始化 NS16550A UART。
Ns16550aDriver()=default
auto Remove(DeviceNode &node) -> Expected< void >
卸载驱动
static constexpr MatchEntry kMatchTable[]
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
单个设备的硬件资源描述。
类型擦除的驱动条目 — 每个已注册驱动对应一条。
const char * name
Here is the call graph for this function:

◆ MatchStatic()

static auto Ns16550aDriver::MatchStatic ( DeviceNode node) -> bool
inlinestatic

硬件检测:MMIO 区域大小是否足够 NS16550A?

NS16550A 没有可读的 magic 寄存器,仅验证 MMIO 资源。

Returns
true 如果 mmio_base 非零且 mmio_size 足够

Definition at line 53 of file ns16550a_driver.hpp.

54 {
55 static constexpr size_t kMinRegisterSpace = 8;
56 return node.mmio_base != 0 && node.mmio_size >= kMinRegisterSpace;
57 }
uint64_t mmio_base
第一个 MMIO 区域(需要多 BAR 支持时扩展为数组)
size_t mmio_size

◆ operator=() [1/2]

auto Ns16550aDriver::operator= ( const Ns16550aDriver ) -> Ns16550aDriver &=delete
delete

◆ operator=() [2/2]

auto Ns16550aDriver::operator= ( Ns16550aDriver &&  ) -> Ns16550aDriver &=default
default

◆ Probe()

auto Ns16550aDriver::Probe ( DeviceNode node) -> Expected<void>
inline

初始化 NS16550A UART。

Precondition
node.mmio_base != 0
Postcondition
uart_ 有效;node.type == DeviceType::kChar

Definition at line 65 of file ns16550a_driver.hpp.

65 {
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);
78 klog::Info("Ns16550aDriver: UART at {:#x} bound", node.mmio_base);
79 return {};
80 }
static auto Create(uint64_t dev_addr) -> Expected< Ns16550a >
工厂方法:创建并初始化 NS16550A 驱动
Definition ns16550a.hpp:30
@ kChar
字符设备(串口等)
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 映射该区域。
DeviceType type
错误类型,用于 std::expected
Definition expected.hpp:343
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Remove()

auto Ns16550aDriver::Remove ( DeviceNode node) -> Expected<void>
inline

卸载驱动

Parameters
node设备节点
Returns
Expected<void> 成功返回空值

Definition at line 87 of file ns16550a_driver.hpp.

88 {
89 return {};
90 }
Here is the caller graph for this function:

Member Data Documentation

◆ kMatchTable

constexpr MatchEntry Ns16550aDriver::kMatchTable[]
staticconstexprprivate
Initial value:
= {
{BusType::kPlatform, "ns16550a"},
{BusType::kPlatform, "ns16550"},
}

Definition at line 109 of file ns16550a_driver.hpp.

109 {
110 {BusType::kPlatform, "ns16550a"},
111 {BusType::kPlatform, "ns16550"},
112 };

◆ uart_

Ns16550aType Ns16550aDriver::uart_ {}
private

Definition at line 114 of file ns16550a_driver.hpp.

114{};

The documentation for this class was generated from the following file: