[libcamera-devel] [PATCH v2 1/4] libcamera: Move IPA sensor controls validation to CameraSensor

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Nov 23 15:40:19 CET 2022


Hi Jacopo,

Thank you for the patch.

On Wed, Nov 23, 2022 at 02:43:43PM +0100, Jacopo Mondi via libcamera-devel wrote:
> The CameraSensor class validates that the sensor driver in use supports
> the controls required for IPA modules to work correctly.
> 
> For in-tree IPA modules, whose pipeline handlers already use
> CameraSensor there's no need to validate such controls again.
> 
> Remove controls validation from the IPU3 and RkISP1 IPA modules and rely
> on CameraSensor doing that at initialization time.
> 
> The list of mandatory controls is expanded to add V4L2_CID_ANALOGUE_GAIN
> without which IPA modules cannot function.
> 
> The new requirement only applies to RAW sensors, platforms like UVC and
> Simple are not impacted by this change.
> 
> While at it, expand the sensor driver requirements documentation to
> include V4L2_ANALOGUE_GAIN in the list of mandatory controls a sensor
> driver has to support.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> ---
>  Documentation/sensor_driver_requirements.rst |  7 +++++
>  src/ipa/ipu3/ipu3.cpp                        | 29 --------------------
>  src/ipa/rkisp1/rkisp1.cpp                    | 12 +-------
>  src/libcamera/camera_sensor.cpp              |  1 +
>  4 files changed, 9 insertions(+), 40 deletions(-)
> 
> diff --git a/Documentation/sensor_driver_requirements.rst b/Documentation/sensor_driver_requirements.rst
> index b0854be3328a..3abc8f35924a 100644
> --- a/Documentation/sensor_driver_requirements.rst
> +++ b/Documentation/sensor_driver_requirements.rst
> @@ -24,16 +24,23 @@ The sensor driver is assumed to be fully compliant with the V4L2 specification.
>  
>  For RAW sensors, the sensor driver shall support the following V4L2 controls:
>  
> +* `V4L2_CID_ANALOGUE_GAIN`_
>  * `V4L2_CID_EXPOSURE`_
>  * `V4L2_CID_HBLANK`_
>  * `V4L2_CID_PIXEL_RATE`_
>  * `V4L2_CID_VBLANK`_
>  
> +.. _V4L2_CID_ANALOGUE_GAIN: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-source.html
>  .. _V4L2_CID_EXPOSURE: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/control.html
>  .. _V4L2_CID_HBLANK: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-source.html
>  .. _V4L2_CID_PIXEL_RATE: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-process.html
>  .. _V4L2_CID_VBLANK: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-source.html
>  
> +The ``ANALOGUE_GAIN`` control units are sensor-specific. libcamera requires
> +a sensor-specific CameraSensorHelper implementation to translate between the
> +sensor specific ``gain code`` and the analogue ``gain value`` expressed as an
> +absolute number as defined by ``controls::AnalogueGain``.
> +
>  While V4L2 doesn't specify a unit for the ``EXPOSURE`` control, libcamera
>  requires it to be expressed as a number of image lines. Camera sensor drivers
>  that do not comply with this requirement will need to be adapted or will produce
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index a9a2b49ca95b..08ee6eb30cc5 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -171,8 +171,6 @@ private:
>  			    ControlInfoMap *ipaControls);
>  	void updateSessionConfiguration(const ControlInfoMap &sensorControls);
>  
> -	bool validateSensorControls();
> -
>  	void setControls(unsigned int frame);
>  	void calculateBdsGrid(const Size &bdsOutputSize);
>  
> @@ -292,28 +290,6 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,
>  	*ipaControls = ControlInfoMap(std::move(controls), controls::controls);
>  }
>  
> -/**
> - * \brief Validate that the sensor controls mandatory for the IPA exists
> - */
> -bool IPAIPU3::validateSensorControls()
> -{
> -	static const uint32_t ctrls[] = {
> -		V4L2_CID_ANALOGUE_GAIN,
> -		V4L2_CID_EXPOSURE,
> -		V4L2_CID_VBLANK,
> -	};
> -
> -	for (auto c : ctrls) {
> -		if (sensorCtrls_.find(c) == sensorCtrls_.end()) {
> -			LOG(IPAIPU3, Error) << "Unable to find sensor control "
> -					    << utils::hex(c);
> -			return false;
> -		}
> -	}
> -
> -	return true;
> -}
> -
>  /**
>   * \brief Initialize the IPA module and its controls
>   *
> @@ -512,11 +488,6 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo,
>  
>  	calculateBdsGrid(configInfo.bdsOutputSize);
>  
> -	if (!validateSensorControls()) {
> -		LOG(IPAIPU3, Error) << "Sensor control validation failed.";
> -		return -EINVAL;
> -	}
> -
>  	/* Update the camera controls using the new sensor settings. */
>  	updateControls(sensorInfo_, sensorCtrls_, ipaControls);
>  
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index fcb9dacccc3c..d237758f7bf0 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -216,20 +216,10 @@ int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info,
>  	ctrls_ = entityControls.at(0);
>  
>  	const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE);
> -	if (itExp == ctrls_.end()) {
> -		LOG(IPARkISP1, Error) << "Can't find exposure control";
> -		return -EINVAL;
> -	}
> -
> -	const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN);
> -	if (itGain == ctrls_.end()) {
> -		LOG(IPARkISP1, Error) << "Can't find gain control";
> -		return -EINVAL;
> -	}
> -
>  	int32_t minExposure = itExp->second.min().get<int32_t>();
>  	int32_t maxExposure = itExp->second.max().get<int32_t>();
>  
> +	const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN);
>  	int32_t minGain = itGain->second.min().get<int32_t>();
>  	int32_t maxGain = itGain->second.max().get<int32_t>();
>  
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index 572a313a8f99..ea373458a164 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -301,6 +301,7 @@ int CameraSensor::validateSensorDriver()
>  	 * required by the CameraSensor class.
>  	 */
>  	static constexpr uint32_t mandatoryControls[] = {
> +		V4L2_CID_ANALOGUE_GAIN,
>  		V4L2_CID_EXPOSURE,
>  		V4L2_CID_HBLANK,
>  		V4L2_CID_PIXEL_RATE,

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list