SimpleKernel 1.17.0
Loading...
Searching...
No Matches
pl011_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 "pl011/pl011.hpp"
14
15namespace pl011 {
17} // namespace pl011
18
25 public:
27
29
34 [[nodiscard]] static auto GetEntry() -> const DriverEntry& {
35 static const DriverEntry entry{
36 .name = "pl011",
37 .match_table = etl::span<const MatchEntry>(kMatchTable),
38 .match = etl::delegate<bool(
39 DeviceNode&)>::create<&Pl011Driver::MatchStatic>(),
40 .probe = etl::delegate<Expected<void>(DeviceNode&)>::create<
42 etl::singleton<Pl011Driver>::instance()),
43 .remove = etl::delegate<Expected<void>(DeviceNode&)>::create<
45 etl::singleton<Pl011Driver>::instance()),
46 };
47 return entry;
48 }
49
57 [[nodiscard]] static auto MatchStatic(DeviceNode& node) -> bool {
58 static constexpr size_t kMinRegisterSpace = 0x48;
59 return node.mmio_base != 0 && node.mmio_size >= kMinRegisterSpace;
60 }
61
68 [[nodiscard]] auto Probe(DeviceNode& node) -> Expected<void> {
69 auto ctx = mmio_helper::Prepare(node, 0x1000);
70 if (!ctx) {
71 return std::unexpected(ctx.error());
72 }
73
74 uart_ = Pl011Type(ctx->base);
75 node.type = DeviceType::kChar;
76 klog::Info("Pl011Driver: UART at {:#x} bound", node.mmio_base);
77 return {};
78 }
79
85 [[nodiscard]] auto Remove([[maybe_unused]] DeviceNode& node)
87 return {};
88 }
89
94 [[nodiscard]] auto GetDevice() -> Pl011Type* { return &uart_; }
95
98 Pl011Driver() = default;
99 Pl011Driver(const Pl011Driver&) = delete;
101 auto operator=(const Pl011Driver&) -> Pl011Driver& = delete;
102 auto operator=(Pl011Driver&&) -> Pl011Driver& = default;
103 ~Pl011Driver() = default;
105
106 private:
107 static constexpr MatchEntry kMatchTable[] = {
108 {BusType::kPlatform, "arm,pl011"},
109 };
110
112};
113
114using Pl011DriverSingleton = etl::singleton<Pl011Driver>;
PL011 UART 驱动
Pl011Type uart_
Pl011Driver()=default
auto operator=(const Pl011Driver &) -> Pl011Driver &=delete
auto operator=(Pl011Driver &&) -> Pl011Driver &=default
auto Probe(DeviceNode &node) -> Expected< void >
初始化 PL011 UART。
auto Remove(DeviceNode &node) -> Expected< void >
卸载驱动
pl011::Pl011 Pl011Type
~Pl011Driver()=default
Pl011Driver(Pl011Driver &&)=default
static constexpr MatchEntry kMatchTable[]
static auto MatchStatic(DeviceNode &node) -> bool
硬件检测:MMIO 区域大小是否足够 PL011?
Pl011Driver(const Pl011Driver &)=delete
static auto GetEntry() -> const DriverEntry &
返回用于注册的 DriverEntry
auto GetDevice() -> Pl011Type *
获取 PL011 设备实例
PL011 串口驱动
Definition pl011.hpp:22
@ 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< Pl011Driver > Pl011DriverSingleton
单个设备的硬件资源描述。
类型擦除的驱动条目 — 每个已注册驱动对应一条。
const char * name
驱动静态匹配表中的一条记录