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

设备管理器 — 管理所有设备节点和驱动程序。 More...

#include <device_manager.hpp>

Collaboration diagram for DeviceManager:
Collaboration graph

Public Member Functions

template<Bus B>
auto RegisterBus (B &bus) -> Expected< void >
 注册总线并立即枚举其设备。
 
auto ProbeAll () -> Expected< void >
 匹配已注册的驱动程序并探测所有未绑定的设备。
 
auto FindDevice (const char *name) -> Expected< DeviceNode * >
 根据名称查找设备。
 
auto FindDevicesByType (DeviceType type, DeviceNode **out, size_t max) -> size_t
 按类型枚举设备。
 
auto GetRegistry () -> DriverRegistry &
 访问驱动注册表。
 
构造 / 析构
 DeviceManager ()=default
 
 ~DeviceManager ()=default
 
 DeviceManager (const DeviceManager &)=delete
 
 DeviceManager (DeviceManager &&)=delete
 
auto operator= (const DeviceManager &) -> DeviceManager &=delete
 
auto operator= (DeviceManager &&) -> DeviceManager &=delete
 

Private Attributes

DeviceNode devices_ [kMaxDevices] {}
 
size_t device_count_ {0}
 
uint32_t next_dev_id_ {0}
 
DriverRegistry registry_
 
SpinLock lock_ {"device_manager"}
 
etl::flat_map< const char *, size_t, kMaxDevices, CStrLessname_index_
 

Static Private Attributes

static constexpr size_t kMaxDevices = 64
 

Detailed Description

设备管理器 — 管理所有设备节点和驱动程序。

Precondition
调用任何方法前,内存子系统必须已完成初始化
Postcondition
ProbeAll() 执行完成后,已绑定的设备可供使用

Definition at line 23 of file device_manager.hpp.

Constructor & Destructor Documentation

◆ DeviceManager() [1/3]

DeviceManager::DeviceManager ( )
default

◆ ~DeviceManager()

DeviceManager::~DeviceManager ( )
default

◆ DeviceManager() [2/3]

DeviceManager::DeviceManager ( const DeviceManager )
delete

◆ DeviceManager() [3/3]

DeviceManager::DeviceManager ( DeviceManager &&  )
delete

Member Function Documentation

◆ FindDevice()

auto DeviceManager::FindDevice ( const char *  name) -> Expected<DeviceNode*>

根据名称查找设备。

Note
只读路径 — 枚举完成后 device_count_ 和 devices_ 稳定, 并发调用者可安全使用。
Parameters
name设备名称
Returns
Expected<DeviceNode*> 设备指针,或 kDeviceNotFound

Definition at line 49 of file device_manager.cpp.

49 {
50 assert(name != nullptr && "FindDevice: name must not be null");
51 LockGuard guard(lock_);
52 const auto it = name_index_.find(name);
53 if (it != name_index_.end()) {
54 return &devices_[it->second];
55 }
56 return std::unexpected(Error(ErrorCode::kDeviceNotFound));
57}
etl::flat_map< const char *, size_t, kMaxDevices, CStrLess > name_index_
DeviceNode devices_[kMaxDevices]
RAII 风格的锁守卫模板类
Definition spinlock.hpp:131
错误类型,用于 std::expected
Definition expected.hpp:343

◆ FindDevicesByType()

auto DeviceManager::FindDevicesByType ( DeviceType  type,
DeviceNode **  out,
size_t  max 
) -> size_t

按类型枚举设备。

Parameters
type设备类型
out输出的设备节点指针数组
max最大结果数量
Returns
size_t 找到的匹配设备数量

Definition at line 59 of file device_manager.cpp.

60 {
61 assert((out != nullptr || max == 0) &&
62 "FindDevicesByType: out must not be null when max > 0");
63 LockGuard guard(lock_);
64 size_t found = 0;
65 for (size_t i = 0; i < device_count_ && found < max; ++i) {
66 if (devices_[i].type == type) {
67 out[found++] = &devices_[i];
68 }
69 }
70 return found;
71}

◆ GetRegistry()

auto DeviceManager::GetRegistry ( ) -> DriverRegistry&
inline

访问驱动注册表。

Returns
DriverRegistry& 驱动注册表实例

Definition at line 96 of file device_manager.hpp.

96{ return registry_; }
DriverRegistry registry_

◆ operator=() [1/2]

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

◆ operator=() [2/2]

auto DeviceManager::operator= ( DeviceManager &&  ) -> DeviceManager &=delete
delete

◆ ProbeAll()

auto DeviceManager::ProbeAll ( ) -> Expected<void>

匹配已注册的驱动程序并探测所有未绑定的设备。

Returns
Expected<void> 成功返回 void,失败返回错误

Definition at line 11 of file device_manager.cpp.

11 {
12 LockGuard guard(lock_);
13
14 size_t probed = 0;
15 size_t no_driver_count = 0;
16 for (size_t i = 0; i < device_count_; ++i) {
17 auto& node = devices_[i];
18
19 const auto* drv = registry_.FindDriver(node);
20 if (drv == nullptr) {
21 ++no_driver_count;
22 continue;
23 }
24
25 if (!drv->match(node)) {
26 continue;
27 }
28
29 if (node.bound) {
30 continue;
31 }
32 node.bound = true;
33
34 drv->probe(node).or_else([&](auto&& err) {
35 klog::Err("DeviceManager: probe '{}' failed: {}", node.name,
36 err.message());
37 node.bound = false;
38 return Expected<void>{};
39 });
40
41 ++probed;
42 }
43
44 klog::Info("DeviceManager: probed {} device(s), {} skipped (no driver)",
45 probed, no_driver_count);
46 return {};
47}
auto FindDriver(const DeviceNode &node) -> const DriverEntry *
查找 match_table 中含有 node.compatible 字符串的第一个驱动 (flat_map 查找,O(Cn · log T))。
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
Here is the call graph for this function:

◆ RegisterBus()

template<Bus B>
auto DeviceManager::RegisterBus ( B &  bus) -> Expected<void>
inline

注册总线并立即枚举其设备。

Template Parameters
B总线类型(必须满足 Bus 概念约束)
Parameters
bus总线实例
Returns
Expected<void> 成功返回 void,失败返回错误

Definition at line 33 of file device_manager.hpp.

33 {
34 LockGuard guard(lock_);
35
37 return std::unexpected(Error(ErrorCode::kOutOfMemory));
38 }
39
40 size_t remaining = kMaxDevices - device_count_;
41 auto result = bus.Enumerate(devices_ + device_count_, remaining);
42 if (!result.has_value()) {
43 klog::Err("DeviceManager: bus '{}' enumeration failed: {}", B::GetName(),
44 result.error().message());
45 return std::unexpected(result.error());
46 }
47
48 size_t count = result.value();
49 for (size_t i = 0; i < count; ++i) {
51 if (!name_index_.full()) {
52 name_index_.insert(
54 }
55 }
56 device_count_ += count;
57
58 klog::Info("DeviceManager: bus '{}' enumerated {} device(s)", B::GetName(),
59 count);
60 return {};
61 }
static constexpr size_t kMaxDevices
uint32_t dev_id
由 DeviceManager 分配的全局设备 ID
char name[32]
可读的设备名称(来自 FDT 节点名)
Here is the call graph for this function:

Member Data Documentation

◆ device_count_

size_t DeviceManager::device_count_ {0}
private

Definition at line 111 of file device_manager.hpp.

111{0};

◆ devices_

DeviceNode DeviceManager::devices_[kMaxDevices] {}
private

Definition at line 110 of file device_manager.hpp.

110{};

◆ kMaxDevices

constexpr size_t DeviceManager::kMaxDevices = 64
staticconstexprprivate

Definition at line 109 of file device_manager.hpp.

◆ lock_

SpinLock DeviceManager::lock_ {"device_manager"}
private

Definition at line 114 of file device_manager.hpp.

114{"device_manager"};

◆ name_index_

etl::flat_map<const char*, size_t, kMaxDevices, CStrLess> DeviceManager::name_index_
private

Definition at line 115 of file device_manager.hpp.

◆ next_dev_id_

uint32_t DeviceManager::next_dev_id_ {0}
private

Definition at line 112 of file device_manager.hpp.

112{0};

◆ registry_

DriverRegistry DeviceManager::registry_
private

Definition at line 113 of file device_manager.hpp.


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