[libcamera-devel] [PATCH] rkisp1: Add support for sensor test pattern control

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Oct 20 01:25:33 CEST 2022


Hi Paul,

Thank you for the patch.

On Tue, Oct 18, 2022 at 05:34:38PM +0900, Paul Elder via libcamera-devel wrote:
> Add support for the TestPatternMode control.
> 
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
>  src/ipa/rkisp1/rkisp1.cpp                |  7 +++++

For IPU3, we implements TPG support in the pipeline handler, without
involving the IPA module (see commit acf8d028edda "libcamera: pipeline:
ipu3: Apply a requested test pattern mode"). Is there a reason to do
differently here ?

>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 38 +++++++++++++++++++++++-
>  2 files changed, 44 insertions(+), 1 deletion(-)
> 
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 3f5c1a58..1aac8884 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -183,6 +183,13 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,
>  
>  	/* Return the controls handled by the IPA. */
>  	ControlInfoMap::Map ctrlMap = rkisp1Controls;
> +
> +	auto tpgInfo = sensorControls.find(V4L2_CID_TEST_PATTERN);
> +	if (tpgInfo != sensorControls.end()) {
> +		ctrlMap.emplace(&controls::draft::TestPatternMode,
> +				ControlInfo(tpgInfo->second.values()));
> +	}
> +
>  	*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);
>  
>  	return 0;
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 455ee2a0..42803266 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -93,6 +93,8 @@ public:
>  	PipelineHandlerRkISP1 *pipe();
>  	int loadIPA(unsigned int hwRevision);
>  
> +	int setSensorTestPattern(const ControlList *controls);
> +
>  	Stream mainPathStream_;
>  	Stream selfPathStream_;
>  	std::unique_ptr<CameraSensor> sensor_;
> @@ -104,6 +106,8 @@ public:
>  	RkISP1MainPath *mainPath_;
>  	RkISP1SelfPath *selfPath_;
>  
> +	controls::draft::TestPatternModeEnum testPatternMode_;
> +
>  	std::unique_ptr<ipa::rkisp1::IPAProxyRkISP1> ipa_;
>  
>  private:
> @@ -357,6 +361,30 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
>  	return 0;
>  }
>  
> +int RkISP1CameraData::setSensorTestPattern(const ControlList *controls)
> +{
> +	if (!controls)
> +		return 0;
> +
> +	const auto &testPattern = controls->get(controls::draft::TestPatternMode);
> +
> +	if (!testPattern)
> +		return 0;
> +
> +	if (testPattern && *testPattern == testPatternMode_)
> +		return 0;
> +
> +	testPatternMode_ = static_cast<controls::draft::TestPatternModeEnum>(*testPattern);
> +
> +	int ret = sensor_->setTestPatternMode(testPatternMode_);
> +	if (ret && !sensor_->testPatternModes().empty())
> +		return ret;
> +
> +	LOG(RkISP1, Debug) << "Set test pattern to " << static_cast<int>(testPatternMode_);
> +
> +	return 0;
> +}
> +
>  void RkISP1CameraData::paramFilled(unsigned int frame)
>  {
>  	PipelineHandlerRkISP1 *pipe = RkISP1CameraData::pipe();
> @@ -820,11 +848,15 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)
>  	return 0;
>  }
>  
> -int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlList *controls)
> +int PipelineHandlerRkISP1::start(Camera *camera, const ControlList *controls)
>  {
>  	RkISP1CameraData *data = cameraData(camera);
>  	int ret;
>  
> +	ret = data->setSensorTestPattern(controls);
> +	if (ret)
> +		return ret;
> +
>  	/* Allocate buffers for internal pipeline usage. */
>  	ret = allocateBuffers(camera);
>  	if (ret)
> @@ -923,6 +955,10 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)
>  {
>  	RkISP1CameraData *data = cameraData(camera);
>  
> +	int ret = data->setSensorTestPattern(&request->controls());
> +	if (ret)
> +		return ret;
> +
>  	RkISP1FrameInfo *info = data->frameInfo_.create(data, request);
>  	if (!info)
>  		return -ENOENT;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list