summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Scally <djrscally@gmail.com>2022-03-03 23:49:51 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2022-03-15 17:20:59 +0000
commit9c003a532121901390d7a91856a5416ea1ad85f5 (patch)
treec32a1b29e76e30ab016ac3db463e8dd002248c69
parent2cde99032f2495c0d38c38c5e826320d0e9823eb (diff)
libcamera: camera_sensor: Discover VCMs through ancillary links
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@ideasonboard.com> Signed-off-by: Daniel Scally <djrscally@gmail.com> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--include/libcamera/internal/camera_sensor.h1
-rw-r--r--src/libcamera/camera_sensor.cpp40
2 files changed, 41 insertions, 0 deletions
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);
}
@@ -444,6 +448,42 @@ int CameraSensor::initProperties()
}
/**
+ * \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
*