[libcamera-devel] [PATCH v5 4/9] libcamera: camera_sensor: Discover VCMs through ancillary links
Daniel Scally
djrscally at gmail.com
Fri Mar 4 00:49:51 CET 2022
Add a function to check for and initialise any VCMs linked to the
CameraSensor's entity by ancillary links. This should initialise
the lens_ member with the linked entity. Call the new function
during CameraSensor::init().
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Signed-off-by: Daniel Scally <djrscally at gmail.com>
---
Changes in v5:
- Add a break to the default case
Changes in v4:
- Fixed typo (Laurent)
Changes in v3:
- Fixed some style errors
- Replaced the flash case by printing the entity function in the
default case.
include/libcamera/internal/camera_sensor.h | 1 +
src/libcamera/camera_sensor.cpp | 40 ++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index 2fa11567..7fb4eded 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -81,6 +81,7 @@ private:
void initTestPatternModes();
int initProperties();
int applyTestPatternMode(controls::draft::TestPatternModeEnum mode);
+ int discoverAncillaryDevices();
const MediaEntity *entity_;
std::unique_ptr<V4L2Subdevice> subdev_;
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 64f7f12c..8b4406fe 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -172,6 +172,10 @@ int CameraSensor::init()
if (ret)
return ret;
+ ret = discoverAncillaryDevices();
+ if (ret)
+ return ret;
+
return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff);
}
@@ -443,6 +447,42 @@ int CameraSensor::initProperties()
return 0;
}
+/**
+ * \brief Check for and initialise any ancillary devices
+ *
+ * Sensors sometimes have ancillary devices such as a Lens or Flash that could
+ * be linked to their MediaEntity by the kernel. Search for and handle any
+ * such device.
+ *
+ * \todo Handle MEDIA_ENT_F_FLASH too.
+ */
+int CameraSensor::discoverAncillaryDevices()
+{
+ int ret;
+
+ for (MediaEntity *ancillary : entity_->ancillaryEntities()) {
+ switch (ancillary->function()) {
+ case MEDIA_ENT_F_LENS:
+ focusLens_ = std::make_unique<CameraLens>(ancillary);
+ ret = focusLens_->init();
+ if (ret) {
+ LOG(CameraSensor, Error)
+ << "CameraLens initialisation failed";
+ return ret;
+ }
+ break;
+
+ default:
+ LOG(CameraSensor, Warning)
+ << "Unsupported ancillary entity function "
+ << ancillary->function();
+ break;
+ }
+ }
+
+ return 0;
+}
+
/**
* \fn CameraSensor::model()
* \brief Retrieve the sensor model name
--
2.25.1
More information about the libcamera-devel
mailing list