summaryrefslogtreecommitdiff
path: root/src/libcamera/camera_sensor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcamera/camera_sensor.cpp')
-rw-r--r--src/libcamera/camera_sensor.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 350f49ac..79b2bc40 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -13,10 +13,12 @@
#include <limits.h>
#include <math.h>
#include <regex>
+#include <string.h>
#include <libcamera/property_ids.h>
#include "libcamera/internal/formats.h"
+#include "libcamera/internal/sysfs.h"
#include "libcamera/internal/utils.h"
/**
@@ -204,6 +206,11 @@ int CameraSensor::init()
if (ret < 0)
return ret;
+ /* Generate a unique ID for the sensor. */
+ ret = generateId();
+ if (ret)
+ return ret;
+
/* Retrieve and store the camera sensor properties. */
const ControlInfoMap &controls = subdev_->controls();
int32_t propertyValue;
@@ -541,4 +548,28 @@ std::string CameraSensor::logPrefix() const
return "'" + entity_->name() + "'";
}
+int CameraSensor::generateId()
+{
+ const std::string devPath = subdev_->devicePath();
+
+ /* Try to get ID from firmware description. */
+ id_ = sysfs::firmwareNodePath(devPath);
+ if (!id_.empty())
+ return 0;
+
+ /*
+ * Virtual sensors not described in firmware
+ *
+ * Verify it's a platform device and construct ID from the deive path
+ * and model of sensor.
+ */
+ if (devPath.find("/sys/devices/platform/", 0) == 0) {
+ id_ = devPath.substr(strlen("/sys/devices/")) + " " + model();
+ return 0;
+ }
+
+ LOG(CameraSensor, Error) << "Can't generate sensor ID";
+ return -EINVAL;
+}
+
} /* namespace libcamera */