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

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

Commit Message

François Roux Oct. 9, 2026, 8:25 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.

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 the other OmniVision sensors in this file.  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)".

Signed-off-by: François Roux <info@humanlearning.ch>
---
Changes in v2:
- Take the black level from the BLC target the driver programs
  (0x4002/0x4003), as suggested by Barnabás, and keep the dark-frame
  measurement only as confirmation (target 0x40 -> 0x80 moves the
  pedestal by exactly 64 LSB).
- AGC does run without the helper, just poorly: reword the commit
  message accordingly.
- Rebased on master: the helper now sits between ov01a10 and ov08d10.

The same values were posted earlier by Martin Neiva de Carvalho as patch
1/5 of "softisp: Five fixes found on a camera with no hardware ISP".
 src/ipa/libipa/camera_sensor_helper.cpp | 12 ++++++++++++
 1 file changed, 12 insertions(+)


base-commit: 8103c3f29fba61dbd1d3bbf1a099280c5f3217e3

Patch
diff mbox series

diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp
index 359040e..72f974e 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: