[libcamera-devel,v3,6/6,HACK] ipu3: Set and get a few sensor controls

Message ID 20190613112046.25260-7-jacopo@jmondi.org
State Superseded
Headers show
Series
  • Add support for V4L2 Controls
Related show

Commit Message

Jacopo Mondi June 13, 2019, 11:20 a.m. UTC
Not to merge patch to demonstrate how to set controls on the image
sensor device.

Not-Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 49 ++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index d13bdfcce54e..a803fa9d8dde 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -688,6 +688,55 @@  int PipelineHandlerIPU3::start(Camera *camera)
 	ImgUDevice *imgu = data->imgu_;
 	int ret;
 
+	/* --- Get control values --- */
+	V4L2Controls controls;
+	controls.add(V4L2_CID_EXPOSURE);
+	controls.add(V4L2_CID_ANALOGUE_GAIN);
+	ret = cio2->sensor_->getControls(&controls);
+	if (ret) {
+		LOG(Error) << "Failed to get control values";
+		return -EINVAL;
+	}
+
+	for (const V4L2Control &ctrl : controls) {
+		unsigned int id = ctrl.id();
+		V4L2ControlInfo *info = cio2->sensor_->getControlInfo(id);
+		if (!info)
+			continue;
+
+		int val = controls.get(id);
+		LOG(Error) << "Control : " << id << " - name : " << info->name()
+			   << " - value: " << val;
+	}
+
+	/* --- Set control values --- */
+	controls.set(V4L2_CID_EXPOSURE, 2046);
+	controls.set(V4L2_CID_ANALOGUE_GAIN, 1024);
+
+	ret = cio2->sensor_->setControls(&controls);
+	if (ret) {
+		LOG(IPU3, Error) << "Failed to set controls";
+		return ret;
+	}
+
+	/* --- Get control values back again and verify they have changed --- */
+	ret = cio2->sensor_->getControls(&controls);
+	if (ret) {
+		LOG(Error) << "Failed to get control values";
+		return -EINVAL;
+	}
+
+	for (const V4L2Control &ctrl : controls) {
+		unsigned int id = ctrl.id();
+		V4L2ControlInfo *info = cio2->sensor_->getControlInfo(id);
+		if (!info)
+			continue;
+
+		int val = controls.get(id);
+		LOG(Error) << "Control : " << id << " - name : " << info->name()
+			   << " - value: " << val;
+	}
+
 	/*
 	 * Start the ImgU video devices, buffers will be queued to the
 	 * ImgU output and viewfinder when requests will be queued.