[v4,1/2] libipa: camera_sensor_helper: Add imx471
diff mbox series

Message ID CALr1FG-kFkSwsXtwCegRtHcCcD1Q+-483g_FFAVWabpa1fD49Q@mail.gmail.com
State New
Headers show
Series
  • Add imx471 soft-ISP sensor support
Related show

Commit Message

John Cronin July 31, 2026, 3:15 p.m. UTC
Add CameraSensorHelper for Sony IMX471 (SONY471A), used on Lenovo
ThinkPad X9 / X1 Carbon Gen14 and related IPU7 platforms.

The kernel imx471 driver writes V4L2_CID_ANALOGUE_GAIN codes 0..800
directly to register 0x0204.

Analogue gain model (measured on ThinkPad X9-15 Gen 1, Fedora 44,
kernel 7.1.5): fixed-exposure raw Bayer means track

  G = 1024 / (1024 - code)

within ~1.5% over codes 0..800 (best-fit k≈1023 for G=k/(k-code)).
Code 800 implies ~4.57x; that is the driver's V4L2 max under this
model, not a full-scale datasheet claim. Other IMX helpers using the
same formula expose higher max codes (e.g. imx355 960 → ~16x).

Black level measured ~64 DN at 10-bit on min exposure/gain raw frames
(mean ≈ 64.1, p50 = 64) → 4096 at 16-bit.

Soft-ISP loads without "Failed to create camera sensor helper for
imx471".

Signed-off-by: John Cronin <john.cronin@opcenter.com>
---
 src/ipa/libipa/camera_sensor_helper.cpp | 29 +++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

 public:

Comments

Jacopo Mondi July 31, 2026, 3:42 p.m. UTC | #1
Hi John

On Fri, Jul 31, 2026 at 08:15:47AM -0700, John Cronin wrote:
> Add CameraSensorHelper for Sony IMX471 (SONY471A), used on Lenovo
> ThinkPad X9 / X1 Carbon Gen14 and related IPU7 platforms.
>
> The kernel imx471 driver writes V4L2_CID_ANALOGUE_GAIN codes 0..800
> directly to register 0x0204.
>
> Analogue gain model (measured on ThinkPad X9-15 Gen 1, Fedora 44,
> kernel 7.1.5): fixed-exposure raw Bayer means track
>
>   G = 1024 / (1024 - code)
>
> within ~1.5% over codes 0..800 (best-fit k≈1023 for G=k/(k-code)).
> Code 800 implies ~4.57x; that is the driver's V4L2 max under this
> model, not a full-scale datasheet claim. Other IMX helpers using the
> same formula expose higher max codes (e.g. imx355 960 → ~16x).
>
> Black level measured ~64 DN at 10-bit on min exposure/gain raw frames
> (mean ≈ 64.1, p50 = 64) → 4096 at 16-bit.
>
> Soft-ISP loads without "Failed to create camera sensor helper for
> imx471".
>
> Signed-off-by: John Cronin <john.cronin@opcenter.com>
> ---
>  src/ipa/libipa/camera_sensor_helper.cpp | 29 +++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
>
> diff --git a/src/ipa/libipa/camera_sensor_helper.cpp
> b/src/ipa/libipa/camera_sensor_helper.cpp
> index cc16e25..31d8169 100644
> --- a/src/ipa/libipa/camera_sensor_helper.cpp
> +++ b/src/ipa/libipa/camera_sensor_helper.cpp
> @@ -644,6 +644,35 @@ class CameraSensorHelperImx462 : public
> CameraSensorHelperImx290
>  };
>  REGISTER_CAMERA_SENSOR_HELPER("imx462", CameraSensorHelperImx462)
>
> +class CameraSensorHelperImx471 : public CameraSensorHelper
> +{
> +public:
> +	CameraSensorHelperImx471()
> +	{
> +		/*
> +		 * Sony IMX471 (IPU7 platforms: ThinkPad X9 / X1 Carbon Gen14,
> +		 * ACPI SONY471A).
> +		 *
> +		 * Kernel imx471 writes V4L2_CID_ANALOGUE_GAIN directly to
> +		 * register 0x0204 with range 0..800 (IMX471_ANA_GAIN_MIN/MAX).
> +		 *
> +		 * Analogue gain model (measured on ThinkPad X9-15 Gen 1):
> +		 *   G = 1024 / (1024 - code)
> +		 * Fixed exposure raw Bayer means (black-subtracted) track this
> +		 * model within ~1.5% over codes 0..800 (best-fit k≈1023 for
> +		 * G=k/(k-code)). Code 800 → ~4.57x is the driver max, not a
> +		 * datasheet "full range" claim; other IMX helpers with the same
> +		 * formula use higher max codes (e.g. imx355 code 960 → ~16x).
> +		 *
> +		 * Black level: measured ~64 DN at 10-bit on min exposure/gain
> +		 * raw frames (mean≈64.1, p50=64) → 4096 at 16-bit.
> +		 */

This kind of repeats the commit message content, and I think it's
better placed there.

With your permission, I'll drop the comment when applying the patch!

Thanks
  j

> +		blackLevel_ = 4096;
> +		gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 };
> +	}
> +};
> +REGISTER_CAMERA_SENSOR_HELPER("imx471", CameraSensorHelperImx471)
> +
>  class CameraSensorHelperImx477 : public CameraSensorHelper
>  {
>  public:
> --
> 2.55.0

Patch
diff mbox series

diff --git a/src/ipa/libipa/camera_sensor_helper.cpp
b/src/ipa/libipa/camera_sensor_helper.cpp
index cc16e25..31d8169 100644
--- a/src/ipa/libipa/camera_sensor_helper.cpp
+++ b/src/ipa/libipa/camera_sensor_helper.cpp
@@ -644,6 +644,35 @@  class CameraSensorHelperImx462 : public
CameraSensorHelperImx290
 };
 REGISTER_CAMERA_SENSOR_HELPER("imx462", CameraSensorHelperImx462)

+class CameraSensorHelperImx471 : public CameraSensorHelper
+{
+public:
+	CameraSensorHelperImx471()
+	{
+		/*
+		 * Sony IMX471 (IPU7 platforms: ThinkPad X9 / X1 Carbon Gen14,
+		 * ACPI SONY471A).
+		 *
+		 * Kernel imx471 writes V4L2_CID_ANALOGUE_GAIN directly to
+		 * register 0x0204 with range 0..800 (IMX471_ANA_GAIN_MIN/MAX).
+		 *
+		 * Analogue gain model (measured on ThinkPad X9-15 Gen 1):
+		 *   G = 1024 / (1024 - code)
+		 * Fixed exposure raw Bayer means (black-subtracted) track this
+		 * model within ~1.5% over codes 0..800 (best-fit k≈1023 for
+		 * G=k/(k-code)). Code 800 → ~4.57x is the driver max, not a
+		 * datasheet "full range" claim; other IMX helpers with the same
+		 * formula use higher max codes (e.g. imx355 code 960 → ~16x).
+		 *
+		 * Black level: measured ~64 DN at 10-bit on min exposure/gain
+		 * raw frames (mean≈64.1, p50=64) → 4096 at 16-bit.
+		 */
+		blackLevel_ = 4096;
+		gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 };
+	}
+};
+REGISTER_CAMERA_SENSOR_HELPER("imx471", CameraSensorHelperImx471)
+
 class CameraSensorHelperImx477 : public CameraSensorHelper
 {