| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <optional> |
| #include <utility> |
| #include <vector> |
| |
| #include <base/containers/span.h> |
| #include <base/logging.h> |
| #include <base/notreached.h> |
| #include <base/values.h> |
| |
| #include "cros-camera/device_config.h" |
| #include "runtime_probe/functions/mipi_camera.h" |
| |
| namespace runtime_probe { |
| |
| std::optional<std::vector<cros::PlatformCameraInfo>> |
| MipiCameraFunction::GetPlatformCameraInfo() const { |
| auto device_config = cros::DeviceConfig::Create(); |
| if (!device_config.has_value()) { |
| LOG(ERROR) << "Failed to get camera device config."; |
| return std::nullopt; |
| } |
| |
| auto camera_info = device_config->GetPlatformCameraInfo(); |
| return std::vector<cros::PlatformCameraInfo>(camera_info.begin(), |
| camera_info.end()); |
| } |
| |
| MipiCameraFunction::DataType MipiCameraFunction::EvalImpl() const { |
| MipiCameraFunction::DataType results; |
| |
| auto cameras = GetPlatformCameraInfo(); |
| if (!cameras) { |
| LOG(ERROR) << "Failed to get MIPI camera list."; |
| return results; |
| } |
| |
| for (const auto& camera : *cameras) { |
| base::Value::Dict node; |
| if (camera.eeprom) { |
| node.Set("mipi_sysfs_name", camera.sysfs_name); |
| node.Set("mipi_module_id", camera.module_id()); |
| node.Set("mipi_sensor_id", camera.sensor_id()); |
| node.Set("path", camera.eeprom->nvmem_path.value()); |
| } else if (camera.v4l2_sensor) { |
| node.Set("mipi_name", camera.v4l2_sensor->name); |
| node.Set("mipi_vendor", camera.v4l2_sensor->vendor_id); |
| node.Set("path", camera.v4l2_sensor->subdev_path.value()); |
| } else { |
| NOTREACHED() << "Unknown source of camera info."; |
| } |
| node.Set("bus_type", "mipi"); |
| results.Append(std::move(node)); |
| } |
| |
| return results; |
| } |
| |
| } // namespace runtime_probe |