| 31 | */ |
| 32 | template <Bus B> |
| 33 | auto RegisterBus(B& bus) -> Expected<void> { |
| 34 | LockGuard guard(lock_); |
| 35 | |
| 36 | if (device_count_ >= kMaxDevices) { |
| 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) { |
| 50 | devices_[device_count_ + i].dev_id = next_dev_id_++; |
| 51 | if (!name_index_.full()) { |
| 52 | name_index_.insert( |
| 53 | {devices_[device_count_ + i].name, device_count_ + i}); |
| 54 | } |
| 55 | } |
| 56 | device_count_ += count; |
| 57 | |
| 58 | klog::Info("DeviceManager: bus '{}' enumerated {} device(s)", B::GetName(), |
| 59 | count); |
| 60 | return {}; |
| 61 | } |
| 62 | |
| 63 | /** |
| 64 | * @brief 匹配已注册的驱动程序并探测所有未绑定的设备。 |