[libcamera-devel] [PATCH v2 3/7] libcamera: camera_sensor: Discover VCMs through ancillary links

Daniel Scally djrscally at gmail.com
Fri Dec 3 23:42:26 CET 2021


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().

Signed-off-by: Daniel Scally <djrscally at gmail.com>
---
Changes in v2:

	- Moved this functionality to CameraSensor::init() instead of the
	pipeline's ::configure() (Laurent)

 include/libcamera/internal/camera_sensor.h |  1 +
 src/libcamera/camera_sensor.cpp            | 42 ++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index 788c2fa3..d329c512 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -76,6 +76,7 @@ private:
 	void initTestPatternModes(
 		const std::map<int32_t, int32_t> &testPatternModeMap);
 	int initProperties();
+	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 4c142a58..e1d4d424 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -161,6 +161,10 @@ int CameraSensor::init()
 	if (ret)
 		return ret;
 
+	ret = discoverAncillaryDevices();
+	if (ret)
+		return ret;
+
 	return 0;
 }
 
@@ -423,6 +427,44 @@ 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)
+					<< "Error during CameraLens init";
+				return ret;
+			}
+			break;
+		case MEDIA_ENT_F_FLASH:
+			LOG(CameraSensor, Warning)
+				<< "Flash devices not yet supported";
+			break;
+		default:
+			LOG(CameraSensor, Warning)
+				<< "Unsupported ancillary entity function";
+		}
+	}
+
+	return 0;
+}
+
 /**
  * \fn CameraSensor::model()
  * \brief Retrieve the sensor model name
-- 
2.25.1



More information about the libcamera-devel mailing list