[libcamera-devel] [PATCH 2/5] libcamera: camera_sensor: Initialize controls

Jacopo Mondi jacopo at jmondi.org
Wed Dec 23 19:45:13 CET 2020


Initialize the ControlInfoMap of sensor available controls by
reporting the sensor exposure time range.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 include/libcamera/internal/camera_sensor.h |  2 ++
 src/libcamera/camera_sensor.cpp            | 42 +++++++++++++++++++++-
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index aee10aa6e3c7..0357b2a630f7 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -71,6 +71,7 @@ private:
 	int generateId();
 	int validateSensorDriver();
 	int initProperties();
+	int initControls();
 
 	const MediaEntity *entity_;
 	std::unique_ptr<V4L2Subdevice> subdev_;
@@ -85,6 +86,7 @@ private:
 	std::vector<Size> sizes_;
 
 	ControlList properties_;
+	ControlInfoMap controls_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 3a65ac3de5bc..609f948c56a6 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -15,6 +15,7 @@
 #include <regex>
 #include <string.h>
 
+#include <libcamera/control_ids.h>
 #include <libcamera/property_ids.h>
 
 #include "libcamera/internal/bayer_format.h"
@@ -215,7 +216,7 @@ int CameraSensor::init()
 	if (ret)
 		return ret;
 
-	return 0;
+	return initControls();
 }
 
 int CameraSensor::validateSensorDriver()
@@ -229,6 +230,7 @@ int CameraSensor::validateSensorDriver()
 	const std::vector<uint32_t> mandatoryControls{
 		V4L2_CID_PIXEL_RATE,
 		V4L2_CID_HBLANK,
+		V4L2_CID_EXPOSURE,
 	};
 
 	ControlList ctrls = subdev_->getControls(mandatoryControls);
@@ -430,6 +432,44 @@ int CameraSensor::initProperties()
 	return 0;
 }
 
+int CameraSensor::initControls()
+{
+	const ControlInfoMap &v4l2Controls = subdev_->controls();
+
+	/* Exposure time limits expressed in micro-seconds. */
+
+	/* Calculate the line length in pixels. */
+	ControlList ctrls = subdev_->getControls({ V4L2_CID_HBLANK });
+	int32_t hblank = ctrls.get(V4L2_CID_HBLANK).get<int32_t>();
+	V4L2SubdeviceFormat format{};
+	int ret = subdev_->getFormat(pad_, &format);
+	if (ret)
+		return ret;
+	int32_t ppl = format.size.width + hblank;
+
+	const ControlInfo &v4l2ExposureInfo = v4l2Controls.find(V4L2_CID_EXPOSURE)->second;
+	int32_t minExposurePixels = v4l2ExposureInfo.min().get<int32_t>() * ppl;
+	int32_t maxExposurePixels = v4l2ExposureInfo.max().get<int32_t>() * ppl;
+	int32_t defExposurePixels = v4l2ExposureInfo.max().get<int32_t>() * ppl;
+
+	/* Get the pixel rate (in useconds) and calculate the exposure timings. */
+	const ControlInfo &pixelRateInfo = v4l2Controls.find(V4L2_CID_PIXEL_RATE)->second;
+	float minPixelRate = pixelRateInfo.min().get<int64_t>() / 1e6f;
+	float maxPixelRate = pixelRateInfo.max().get<int64_t>() / 1e6f;
+	float defPixelRate = pixelRateInfo.def().get<int64_t>() / 1e6f;
+
+	int32_t minExposure = static_cast<int32_t>(minExposurePixels / maxPixelRate);
+	int32_t maxExposure = static_cast<int32_t>(maxExposurePixels / minPixelRate);
+	int32_t defExposure = static_cast<int32_t>(defExposurePixels / defPixelRate);
+
+	ControlInfoMap::Map map;
+	map[&controls::ExposureTime] = ControlInfo(minExposure, maxExposure,
+						   defExposure);
+	controls_ = std::move(map);
+
+	return 0;
+}
+
 /**
  * \fn CameraSensor::model()
  * \brief Retrieve the sensor model name
-- 
2.29.2



More information about the libcamera-devel mailing list