[v2] libipa: camera_sensor_helper: Add imx471
diff mbox series

Message ID CALr1FG_KCY4FY0mkt==uD87VjKqRRWDec=vjgmf7wigurYZJYQ@mail.gmail.com
State New
Headers show
Series
  • [v2] libipa: camera_sensor_helper: Add imx471
Related show

Commit Message

John Cronin July 29, 2026, 2:43 p.m. UTC
Add CameraSensorHelper for Sony IMX471 (SONY471A), used on Lenovo
ThinkPad X9-15 and related IPU7 platforms.

The kernel imx471 driver programs analogue gain code 0..800 into
register 0x0204. Use the common Sony linear model G = 1024/(1024-code)
(matching imx355/imx477/imx708) and a 10-bit pedestal of 64 (4096 at
16-bit).

Also register static sensor properties so soft-ISP AGC no longer warns
about missing delays/properties for this model.

Tested on Fedora 44 / ThinkPad X9-15 Gen 1 (kernel 7.1.5, imx471 bound
via IPU7 ISYS). Soft-ISP loads without "Failed to create camera sensor
helper for imx471"; AGC reports gain range 1.0-4.57x and adjusts
exposure under capture.

Signed-off-by: John Cronin <john.cronin@opcenter.com>
Tested-by: John Cronin <john.cronin@opcenter.com>
---
Changes in v2:
- Fix mangled diff --git b/ path from the previous mail (copy error in
MUA send).
  ---/+++ paths and hunk contents were already correct; pure
apply-ready form now.

 src/ipa/libipa/camera_sensor_helper.cpp       | 24 +++++++++++++++++++
 .../sensor/camera_sensor_properties.cpp       | 17 +++++++++++++
 2 files changed, 41 insertions(+)

 			.testPatternModes = {},

Comments

John Cronin July 29, 2026, 2:58 p.m. UTC | #1
Hi,

For context on the Fedora / IPU7 side, users on Lenovo ThinkPad X9 / Lunar
Lake (SONY471A) are hitting the same soft-ISP gaps this patch addresses
(missing CameraSensorHelper, no static properties, dark/greenish images
under uncalibrated.yaml). See for example:

  https://bugzilla.redhat.com/show_bug.cgi?id=2454119

(comment 11 logs "Failed to create camera sensor helper for imx471" and
the sensor-properties warnings on Fedora 44 + libcamera 0.7.1.)

Happy to adjust the helper if review wants different black level, delays,
or gain-model notes.

Thanks,
John Cronin

Patch
diff mbox series

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

+class CameraSensorHelperImx471 : public CameraSensorHelper
+{
+public:
+	CameraSensorHelperImx471()
+	{
+		/*
+		 * Sony IMX471 (IPU7 / ThinkPad X9, X1 Carbon Gen14).
+		 *
+		 * Analogue gain is programmed via V4L2_CID_ANALOGUE_GAIN to
+		 * register 0x0204. The kernel driver (imx471) exposes range
+		 * 0..800 and writes the code directly.
+		 *
+		 * Sony linear gain model used by several IMX sensors:
+		 *   G = 1024 / (1024 - code)
+		 * so code 0 → 1.0x and code 800 → ~4.57x.
+		 *
+		 * 10-bit optical black pedestal is typically 64 → 4096 at 16-bit.
+		 */
+		blackLevel_ = 4096;
+		gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 };
+	}
+};
+REGISTER_CAMERA_SENSOR_HELPER("imx471", CameraSensorHelperImx471)
+
 class CameraSensorHelperImx477 : public CameraSensorHelper
 {
 public:
diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp
b/src/libcamera/sensor/camera_sensor_properties.cpp
index fc9e184..7ba55dc 100644
--- a/src/libcamera/sensor/camera_sensor_properties.cpp
+++ b/src/libcamera/sensor/camera_sensor_properties.cpp
@@ -297,6 +297,23 @@  const CameraSensorProperties
*CameraSensorProperties::get(const std::string &sen
 				.hblankDelay = 2
 			},
 		} },
+		{ "imx471", {
+			/* 1/2.3-type; ~1.4 µm pixels (nm). Delays unverified. */
+			.unitCellSize = { 1400, 1400 },
+			.testPatternModes = {
+				{ controls::draft::TestPatternModeOff, 0 },
+				{ controls::draft::TestPatternModeSolidColor, 1 },
+				{ controls::draft::TestPatternModeColorBars, 2 },
+				{ controls::draft::TestPatternModeColorBarsFadeToGray, 3 },
+				{ controls::draft::TestPatternModePn9, 4 },
+			},
+			.sensorDelays = {
+				.exposureDelay = 2,
+				.gainDelay = 2,
+				.vblankDelay = 2,
+				.hblankDelay = 2
+			},
+		} },
 		{ "imx477", {
 			.unitCellSize = { 1550, 1550 },