[v3] ipa: libipa: camera_sensor_helper: add ov02c10
diff mbox series

Message ID 20261102100533.30106-1-info@humanlearning.ch
State New
Headers show
Series
  • [v3] ipa: libipa: camera_sensor_helper: add ov02c10
Related show

Commit Message

François Roux Nov. 2, 2026, 10:05 a.m. UTC
Without an entry for ov02c10, the software ISP used by the simple
pipeline handler has no gain model or black level for this sensor and
logs:

  IPASoft: Failed to create camera sensor helper for ov02c10

AGC then still runs, but on raw analogue-gain register values instead
of a linear gain, which makes it converge poorly.

The kernel driver (drivers/media/i2c/ov02c10.c) advertises analogue-gain
register values in the range 0x10..0xf8 with a default of 0x10, and
writes them to the 16-bit register at 0x3508 as (val << 4).  That
register is graded in 1/256 steps, so both the control range and the
register encoding agree on 1/16 steps: the default of 0x10 is unity gain
and the maximum of 0xf8 is 15.5x.  Without a datasheet, this was checked
by measurement on a second machine (Lenovo Yoga Slim 7x, X1E80100): at a
fixed exposure, the signal above the pedestal follows code / 16 to
within 1.5% from 0x18 to 0xf8 (1.49 at 0x18, 4.03 at 0x40, 8.11 at 0x80,
15.32 at 0xf8).

The sensor outputs 10-bit Bayer data (MEDIA_BUS_FMT_SGRBG10_1X10).  The
driver programs a black level target of 0x40 in the BLC registers
0x4002/0x4003, which scales to 4096 at the 16-bit width expected by
blackLevel(), as for ov01a10, ov08d10, ov2740 and ov5675, which use
the same 0x40 target at 10 bits.  A
dark-frame measurement matches it: the mean pedestal is 64.2 LSB, and
changing the target to 0x80 while streaming moves it to 128.2 LSB on all
four colour channels from the next frame.

Tested on the front camera of a Microsoft Surface Pro 12 (Qualcomm
X1P42100) driven by the qcom CAMSS pipeline.  Before the change the IPA
reported "Exposure 4-2320, gain 16-248 (1)"; after it reports
"Exposure 4-2320, gain 1-15.5 (0.145)".

Acked-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Tested-by: Birk Skyum <birk.skyum@pm.me>
Tested-by: Christian Cortner <ccortner@gmail.com>
Signed-off-by: François Roux <info@humanlearning.ch>
---
 src/ipa/libipa/camera_sensor_helper.cpp | 12 ++++++++++++
 1 file changed, 12 insertions(+)


base-commit: df8e348d64b4932a0676256ed24f0da3ee9438bc

Patch
diff mbox series

diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp
index 359040ec..72f974ee 100644
--- a/src/ipa/libipa/camera_sensor_helper.cpp
+++ b/src/ipa/libipa/camera_sensor_helper.cpp
@@ -713,6 +713,18 @@  public:
 };
 REGISTER_CAMERA_SENSOR_HELPER("ov01a10", CameraSensorHelperOv01a10)
 
+class CameraSensorHelperOv02c10 : public CameraSensorHelper
+{
+public:
+	CameraSensorHelperOv02c10()
+	{
+		/* From Linux kernel driver: 0x40 at 10bits. */
+		blackLevel_ = 4096;
+		gain_ = AnalogueGainLinear{ 1, 0, 0, 16 };
+	}
+};
+REGISTER_CAMERA_SENSOR_HELPER("ov02c10", CameraSensorHelperOv02c10)
+
 class CameraSensorHelperOv08d10 : public CameraSensorHelper
 {
 public: