From 7b8094d6fc9798ea2944e6a01220e23e717c2bc4 Mon Sep 17 00:00:00 2001
From: Stefan Klug <stefan.klug@ideasonboard.com>
Date: Fri, 12 Jul 2024 16:32:02 +0200
Subject: ipa: rkisp1: awb: Clamp gains to machine limits

When the color gains are set manually it is possible to specify a
gain that wrapped the hardware limits. It would also be possible to
further tune the floating point limits, but that is an error prone
approach. So the limits are imposed on the integers, just before writing
to the hardware. This noticeably reduces some oscillations in the awb
regulation.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 src/ipa/rkisp1/algorithms/awb.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

(limited to 'src/ipa/rkisp1/algorithms')

diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index a01fe5d9..1a5d4776 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -120,10 +120,14 @@ void Awb::prepare(IPAContext &context, const uint32_t frame,
 		frameContext.awb.gains.blue = context.activeState.awb.gains.automatic.blue;
 	}
 
-	params->others.awb_gain_config.gain_green_b = 256 * frameContext.awb.gains.green;
-	params->others.awb_gain_config.gain_blue = 256 * frameContext.awb.gains.blue;
-	params->others.awb_gain_config.gain_red = 256 * frameContext.awb.gains.red;
-	params->others.awb_gain_config.gain_green_r = 256 * frameContext.awb.gains.green;
+	params->others.awb_gain_config.gain_green_b =
+		std::clamp<int>(256 * frameContext.awb.gains.green, 0, 0x3ff);
+	params->others.awb_gain_config.gain_blue =
+		std::clamp<int>(256 * frameContext.awb.gains.blue, 0, 0x3ff);
+	params->others.awb_gain_config.gain_red =
+		std::clamp<int>(256 * frameContext.awb.gains.red, 0, 0x3ff);
+	params->others.awb_gain_config.gain_green_r =
+		std::clamp<int>(256 * frameContext.awb.gains.green, 0, 0x3ff);
 
 	/* Update the gains. */
 	params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_AWB_GAIN;
-- 
cgit v1.2.1