7#include <etl/delegate.h>
8#include <etl/flat_map.h>
10#include <etl/vector.h>
20#include "kstd_cstring"
50 auto operator()(
const char* a,
const char* b)
const ->
bool {
51 return kstd::strcmp(a, b) < 0;
76 for (
const auto& me : entry.match_table) {
95 const char* p = node.compatible;
96 const char*
end = node.compatible + node.compatible_len;
101 if (entry.match(
const_cast<DeviceNode&
>(node))) {
105 p += kstd::strlen(p) + 1;
126 etl::flat_map<const char*, size_t, kMaxCompatEntries, CStrLess>
compat_map_;
151 node.mmio_base != 0 &&
152 "mmio_helper::Prepare: node has no MMIO base; driver matched wrong node");
154 size_t size = node.mmio_size > 0 ? node.mmio_size : default_size;
156 VirtualMemorySingleton::instance().MapMMIO(node.mmio_base, size);
157 if (!map_result.has_value()) {
158 return std::unexpected(map_result.error());
驱动注册表 — 以 ETL vector 存储 DriverEntry,并附带 flat_map 兼容索引。
DriverRegistry(const DriverRegistry &)=delete
DriverRegistry(DriverRegistry &&)=delete
auto FindDriver(const DeviceNode &node) -> const DriverEntry *
查找 match_table 中含有 node.compatible 字符串的第一个驱动 (flat_map 查找,O(Cn · log T))。
auto Register(const DriverEntry &entry) -> Expected< void >
注册一个驱动条目。
static constexpr size_t kMaxDrivers
etl::flat_map< const char *, size_t, kMaxCompatEntries, CStrLess > compat_map_
~DriverRegistry()=default
auto operator=(DriverRegistry &&) -> DriverRegistry &=delete
static constexpr size_t kMaxCompatEntries
所有驱动 MatchEntry 行数上限(32 个驱动 × 约 3 条 compatible 字符串)
auto operator=(const DriverRegistry &) -> DriverRegistry &=delete
etl::vector< DriverEntry, kMaxDrivers > drivers_
BusType
总线类型标识 — 为将来扩展 PCI/ACPI 总线预留的扩展点
std::expected< T, Error > Expected
std::expected 别名模板
auto Prepare(const DeviceNode &node, size_t default_size) -> Expected< ProbeContext >
从节点提取 MMIO base/size 并通过 VirtualMemory 映射该区域。
flat_map 中 const char* 键的比较器(使用 kstd::strcmp)。
auto operator()(const char *a, const char *b) const -> bool
etl::delegate< Expected< void >(DeviceNode &)> probe
驱动初始化
etl::delegate< bool(DeviceNode &)> match
硬件检测
etl::span< const MatchEntry > match_table
etl::delegate< Expected< void >(DeviceNode &)> remove
驱动卸载