[libcamera-devel,v2,4/4] ipu3: ipa: Allow IPA to apply controls to the lens device
diff mbox series

Message ID 20211029115917.2467936-4-hanlinchen@chromium.org
State Superseded
Headers show
Series
  • [libcamera-devel,v2,1/4] ipa: ipu3: Extend ipu3 ipa interface for sensor and lens controls
Related show

Commit Message

Hanlin Chen Oct. 29, 2021, 11:59 a.m. UTC
Allow IPA to apply controls to the lens device.

Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>
---
 meson.build                          |  6 ++++++
 src/libcamera/pipeline/ipu3/cio2.cpp | 30 ++++++++++++++++++++++++++++
 src/libcamera/pipeline/ipu3/cio2.h   |  3 +++
 src/libcamera/pipeline/ipu3/ipu3.cpp |  9 +++++++--
 4 files changed, 46 insertions(+), 2 deletions(-)

Comments

Jean-Michel Hautbois Nov. 4, 2021, 11:54 a.m. UTC | #1
Hi Han-Lin,

On 29/10/2021 13:59, Han-Lin Chen wrote:
> Allow IPA to apply controls to the lens device.
> 
> Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>
> ---
>   meson.build                          |  6 ++++++
>   src/libcamera/pipeline/ipu3/cio2.cpp | 30 ++++++++++++++++++++++++++++
>   src/libcamera/pipeline/ipu3/cio2.h   |  3 +++
>   src/libcamera/pipeline/ipu3/ipu3.cpp |  9 +++++++--
>   4 files changed, 46 insertions(+), 2 deletions(-)
> 
> diff --git a/meson.build b/meson.build
> index 7892a9e3..2a4b68a2 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -108,6 +108,12 @@ if cc.has_argument('-Wno-c99-designator')
>       ]
>   endif
>   
> +if get_option('android_platform') == 'cros'
> +    common_arguments += [
> +        '-DOS_CHROMEOS',
> +    ]
> +endif
> +
>   c_arguments += common_arguments
>   cpp_arguments += common_arguments
>   
> diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
> index 59dda56b..143e2a95 100644
> --- a/src/libcamera/pipeline/ipu3/cio2.cpp
> +++ b/src/libcamera/pipeline/ipu3/cio2.cpp
> @@ -16,6 +16,7 @@
>   #include <libcamera/geometry.h>
>   #include <libcamera/stream.h>
>   
> +#include "libcamera/internal/camera_lens.h"
>   #include "libcamera/internal/camera_sensor.h"
>   #include "libcamera/internal/framebuffer.h"
>   #include "libcamera/internal/media_device.h"
> @@ -159,6 +160,35 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index)
>   		return -EINVAL;
>   	}
>   
> +#if defined(OS_CHROMEOS)

What is the status about Kieran's comment for the media graph in v1 ?
I still suggest to split lens controls in a separate patch series as the 
sensor controls could probably be merged before... ?

> +	/*
> +	 * \todo Read the lens model from the sensor itself or from a device database.
> +	 * For now use default values taken from ChromeOS.
> +	 */
> +	static std::unordered_map<std::string, std::string> sensorLens = {
> +		{ "ov13858", "dw9714" },
> +		{ "imx258", "dw9807" },
> +		{ "imx355", "ak7375" }
> +	};
> +
> +	auto it = sensorLens.find(sensor_->model());
> +	if (it != sensorLens.end()) {
> +		const std::vector<MediaEntity *> &entities = media->entities();
> +		for (auto ent: entities) {
> +			if (ent->function() == MEDIA_ENT_F_LENS) {
> +				lens_ = std::make_unique<CameraLens>(ent);
> +				ret = lens_->init();
> +				if (!ret && lens_->model() == it->second) {
> +					break;
> +				}
> +				lens_.reset();
> +			}
> +			if (!lens_)
> +				LOG(IPU3, Warning) << "Lens device " << it->second << " not found";
> +		}
> +	}
> +#endif
> +
>   	/*
>   	 * \todo Define when to open and close video device nodes, as they
>   	 * might impact on power consumption.
> diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h
> index ba8f0052..635566c8 100644
> --- a/src/libcamera/pipeline/ipu3/cio2.h
> +++ b/src/libcamera/pipeline/ipu3/cio2.h
> @@ -18,6 +18,7 @@
>   
>   namespace libcamera {
>   
> +class CameraLens;
>   class CameraSensor;
>   class FrameBuffer;
>   class MediaDevice;
> @@ -52,6 +53,7 @@ public:
>   	int stop();
>   
>   	CameraSensor *sensor() { return sensor_.get(); }
> +	CameraLens *lens() { return lens_.get(); }
>   	const CameraSensor *sensor() const { return sensor_.get(); }
>   
>   	FrameBuffer *queueBuffer(Request *request, FrameBuffer *rawBuffer);
> @@ -67,6 +69,7 @@ private:
>   	void cio2BufferReady(FrameBuffer *buffer);
>   
>   	std::unique_ptr<CameraSensor> sensor_;
> +	std::unique_ptr<CameraLens> lens_;
>   	std::unique_ptr<V4L2Subdevice> csi2_;
>   	std::unique_ptr<V4L2VideoDevice> output_;
>   
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 6a7f5b9a..6c44957f 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -24,6 +24,7 @@
>   #include <libcamera/stream.h>
>   
>   #include "libcamera/internal/camera.h"
> +#include "libcamera/internal/camera_lens.h"
>   #include "libcamera/internal/camera_sensor.h"
>   #include "libcamera/internal/delayed_controls.h"
>   #include "libcamera/internal/device_enumerator.h"
> @@ -1250,8 +1251,12 @@ void IPU3CameraData::queueFrameAction(unsigned int id,
>   {
>   	switch (action.op) {
>   	case ipa::ipu3::ActionSetSensorControls: {
> -		const ControlList &controls = action.sensorControls;
> -		delayedCtrls_->push(controls);
> +		const ControlList &sensorControls = action.sensorControls;
> +		delayedCtrls_->push(sensorControls);
> +		if (cio2_.lens()) {
> +			ControlList lensControls = action.lensControls;
> +			cio2_.lens()->setControls(&lensControls);
> +		}
>   		break;
>   	}
>   	case ipa::ipu3::ActionParamFilled: {
>

Patch
diff mbox series

diff --git a/meson.build b/meson.build
index 7892a9e3..2a4b68a2 100644
--- a/meson.build
+++ b/meson.build
@@ -108,6 +108,12 @@  if cc.has_argument('-Wno-c99-designator')
     ]
 endif
 
+if get_option('android_platform') == 'cros'
+    common_arguments += [
+        '-DOS_CHROMEOS',
+    ]
+endif
+
 c_arguments += common_arguments
 cpp_arguments += common_arguments
 
diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
index 59dda56b..143e2a95 100644
--- a/src/libcamera/pipeline/ipu3/cio2.cpp
+++ b/src/libcamera/pipeline/ipu3/cio2.cpp
@@ -16,6 +16,7 @@ 
 #include <libcamera/geometry.h>
 #include <libcamera/stream.h>
 
+#include "libcamera/internal/camera_lens.h"
 #include "libcamera/internal/camera_sensor.h"
 #include "libcamera/internal/framebuffer.h"
 #include "libcamera/internal/media_device.h"
@@ -159,6 +160,35 @@  int CIO2Device::init(const MediaDevice *media, unsigned int index)
 		return -EINVAL;
 	}
 
+#if defined(OS_CHROMEOS)
+	/*
+	 * \todo Read the lens model from the sensor itself or from a device database.
+	 * For now use default values taken from ChromeOS.
+	 */
+	static std::unordered_map<std::string, std::string> sensorLens = {
+		{ "ov13858", "dw9714" },
+		{ "imx258", "dw9807" },
+		{ "imx355", "ak7375" }
+	};
+
+	auto it = sensorLens.find(sensor_->model());
+	if (it != sensorLens.end()) {
+		const std::vector<MediaEntity *> &entities = media->entities();
+		for (auto ent: entities) {
+			if (ent->function() == MEDIA_ENT_F_LENS) {
+				lens_ = std::make_unique<CameraLens>(ent);
+				ret = lens_->init();
+				if (!ret && lens_->model() == it->second) {
+					break;
+				}
+				lens_.reset();
+			}
+			if (!lens_)
+				LOG(IPU3, Warning) << "Lens device " << it->second << " not found";
+		}
+	}
+#endif
+
 	/*
 	 * \todo Define when to open and close video device nodes, as they
 	 * might impact on power consumption.
diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h
index ba8f0052..635566c8 100644
--- a/src/libcamera/pipeline/ipu3/cio2.h
+++ b/src/libcamera/pipeline/ipu3/cio2.h
@@ -18,6 +18,7 @@ 
 
 namespace libcamera {
 
+class CameraLens;
 class CameraSensor;
 class FrameBuffer;
 class MediaDevice;
@@ -52,6 +53,7 @@  public:
 	int stop();
 
 	CameraSensor *sensor() { return sensor_.get(); }
+	CameraLens *lens() { return lens_.get(); }
 	const CameraSensor *sensor() const { return sensor_.get(); }
 
 	FrameBuffer *queueBuffer(Request *request, FrameBuffer *rawBuffer);
@@ -67,6 +69,7 @@  private:
 	void cio2BufferReady(FrameBuffer *buffer);
 
 	std::unique_ptr<CameraSensor> sensor_;
+	std::unique_ptr<CameraLens> lens_;
 	std::unique_ptr<V4L2Subdevice> csi2_;
 	std::unique_ptr<V4L2VideoDevice> output_;
 
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 6a7f5b9a..6c44957f 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -24,6 +24,7 @@ 
 #include <libcamera/stream.h>
 
 #include "libcamera/internal/camera.h"
+#include "libcamera/internal/camera_lens.h"
 #include "libcamera/internal/camera_sensor.h"
 #include "libcamera/internal/delayed_controls.h"
 #include "libcamera/internal/device_enumerator.h"
@@ -1250,8 +1251,12 @@  void IPU3CameraData::queueFrameAction(unsigned int id,
 {
 	switch (action.op) {
 	case ipa::ipu3::ActionSetSensorControls: {
-		const ControlList &controls = action.sensorControls;
-		delayedCtrls_->push(controls);
+		const ControlList &sensorControls = action.sensorControls;
+		delayedCtrls_->push(sensorControls);
+		if (cio2_.lens()) {
+			ControlList lensControls = action.lensControls;
+			cio2_.lens()->setControls(&lensControls);
+		}
 		break;
 	}
 	case ipa::ipu3::ActionParamFilled: {