[libcamera-devel] [PATCH 3/3] libcamera: ipa: raspberrypi: Add support for ov9281 sensor

David Plowman david.plowman at raspberrypi.com
Tue Jun 15 12:51:39 CEST 2021


The necessary tuning file and CamHelper is added for the ov9281 sensor
(which the driver names as the "mov9281").

The ov9281 is a 1280x800 monochrome global shutter sensor. To enable
it, please add

dtoverlay=ov9281

to the /boot/config.txt file and reboot the Pi.

Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
---
 src/ipa/raspberrypi/cam_helper_mov9281.cpp | 108 +++++++++++++++++++++
 src/ipa/raspberrypi/data/meson.build       |   1 +
 src/ipa/raspberrypi/data/mov9281.json      |  92 ++++++++++++++++++
 src/ipa/raspberrypi/meson.build            |   1 +
 4 files changed, 202 insertions(+)
 create mode 100644 src/ipa/raspberrypi/cam_helper_mov9281.cpp
 create mode 100644 src/ipa/raspberrypi/data/mov9281.json

diff --git a/src/ipa/raspberrypi/cam_helper_mov9281.cpp b/src/ipa/raspberrypi/cam_helper_mov9281.cpp
new file mode 100644
index 00000000..5645c73a
--- /dev/null
+++ b/src/ipa/raspberrypi/cam_helper_mov9281.cpp
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Copyright (C) 2019, Raspberry Pi (Trading) Limited
+ *
+ * cam_helper_mov9281.cpp - camera information for ov9281 sensor
+ */
+
+#include <assert.h>
+
+#include "cam_helper.hpp"
+
+using namespace RPiController;
+
+class CamHelperOv9281 : public CamHelper
+{
+public:
+	CamHelperOv9281();
+	uint32_t GainCode(double gain) const override;
+	double Gain(uint32_t gain_code) const override;
+	void GetDelays(int &exposure_delay, int &gain_delay,
+		       int &vblank_delay) const override;
+	unsigned int HideFramesStartup() const override;
+	unsigned int HideFramesModeSwitch() const override;
+	unsigned int MistrustFramesStartup() const override;
+	unsigned int MistrustFramesModeSwitch() const override;
+
+private:
+	/*
+	 * Smallest difference between the frame length and integration time,
+	 * in units of lines.
+	 */
+	static constexpr int frameIntegrationDiff = 4;
+};
+
+/*
+ * OV9281 doesn't output metadata, so we have to use the "unicam parser" which
+ * works by counting frames.
+ */
+
+CamHelperOv9281::CamHelperOv9281()
+	: CamHelper(nullptr, frameIntegrationDiff)
+{
+}
+
+uint32_t CamHelperOv9281::GainCode(double gain) const
+{
+	return static_cast<uint32_t>(gain * 16.0);
+}
+
+double CamHelperOv9281::Gain(uint32_t gain_code) const
+{
+	return static_cast<double>(gain_code) / 16.0;
+}
+
+void CamHelperOv9281::GetDelays(int &exposure_delay, int &gain_delay,
+				int &vblank_delay) const
+{
+	/*
+	 * We run this sensor in a mode where the gain delay is bumped up to
+	 * 2. It seems to be the only way to make the delays "predictable".
+	 */
+	exposure_delay = 2;
+	gain_delay = 2;
+	vblank_delay = 2;
+}
+
+unsigned int CamHelperOv9281::HideFramesStartup() const
+{
+	/*
+	 * On startup, we get a couple of under-exposed frames which
+	 * we don't want shown.
+	 */
+	return 2;
+}
+
+unsigned int CamHelperOv9281::HideFramesModeSwitch() const
+{
+	/*
+	 * After a mode switch, we get a couple of under-exposed frames which
+	 * we don't want shown.
+	 */
+	return 2;
+}
+
+unsigned int CamHelperOv9281::MistrustFramesStartup() const
+{
+	/*
+	 * First couple of frames are under-exposed and are no good for control
+	 * algos.
+	 */
+	return 2;
+}
+
+unsigned int CamHelperOv9281::MistrustFramesModeSwitch() const
+{
+	/*
+	 * First couple of frames are under-exposed even after a simple
+	 * mode switch, and are no good for control algos.
+	 */
+	return 2;
+}
+
+static CamHelper *Create()
+{
+	return new CamHelperOv9281();
+}
+
+static RegisterCamHelper reg("mov9281", &Create);
diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build
index 92ad3272..f8baab6d 100644
--- a/src/ipa/raspberrypi/data/meson.build
+++ b/src/ipa/raspberrypi/data/meson.build
@@ -4,6 +4,7 @@ conf_files = files([
     'imx219.json',
     'imx290.json',
     'imx477.json',
+    'mov9281.json',
     'ov5647.json',
     'se327m12.json',
     'uncalibrated.json',
diff --git a/src/ipa/raspberrypi/data/mov9281.json b/src/ipa/raspberrypi/data/mov9281.json
new file mode 100644
index 00000000..ecd262be
--- /dev/null
+++ b/src/ipa/raspberrypi/data/mov9281.json
@@ -0,0 +1,92 @@
+{
+    "rpi.black_level":
+    {
+        "black_level": 4096
+    },
+    "rpi.lux":
+    {
+        "reference_shutter_speed": 2000,
+        "reference_gain": 1.0,
+        "reference_aperture": 1.0,
+        "reference_lux": 800,
+        "reference_Y": 20000
+    },
+    "rpi.noise":
+    {
+        "reference_constant": 0,
+        "reference_slope": 2.5
+    },
+    "rpi.sdn":
+    {
+    },
+    "rpi.agc":
+    {
+        "metering_modes":
+        {
+            "centre-weighted": {
+                "weights": [4, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0]
+            }
+        },
+        "exposure_modes":
+        {
+            "normal":
+            {
+                "shutter": [ 100, 15000, 30000, 60000, 120000 ],
+                "gain":    [ 1.0, 2.0,   3.0,   4.0,   6.0    ]
+            }
+        },
+        "constraint_modes":
+        {
+            "normal":
+            [
+                { "bound": "LOWER", "q_lo": 0.98, "q_hi": 1.0, "y_target": [ 0, 0.4, 1000, 0.4 ] }
+            ]
+        },
+        "y_target": [ 0, 0.16, 1000, 0.165, 10000, 0.17 ]
+    },
+    "rpi.alsc":
+    {
+        "n_iter": 0,
+        "luminance_strength": 1.0,
+        "corner_strength": 1.5
+    },
+    "rpi.contrast":
+    {
+        "ce_enable": 0,
+        "gamma_curve": [
+            0,     0,
+            1024,  5040,
+            2048,  9338,
+            3072,  12356,
+            4096,  15312,
+            5120,  18051,
+            6144,  20790,
+            7168,  23193,
+            8192,  25744,
+            9216,  27942,
+            10240, 30035,
+            11264, 32005,
+            12288, 33975,
+            13312, 35815,
+            14336, 37600,
+            15360, 39168,
+            16384, 40642,
+            18432, 43379,
+            20480, 45749,
+            22528, 47753,
+            24576, 49621,
+            26624, 51253,
+            28672, 52698,
+            30720, 53796,
+            32768, 54876,
+            36864, 57012,
+            40960, 58656,
+            45056, 59954,
+            49152, 61183,
+            53248, 62355,
+            57344, 63419,
+            61440, 64476,
+            65535, 65535
+        ]
+    }
+}
diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
index d1397a32..e384c7ce 100644
--- a/src/ipa/raspberrypi/meson.build
+++ b/src/ipa/raspberrypi/meson.build
@@ -22,6 +22,7 @@ rpi_ipa_sources = files([
     'cam_helper_imx219.cpp',
     'cam_helper_imx290.cpp',
     'cam_helper_imx477.cpp',
+    'cam_helper_mov9281.cpp',
     'controller/controller.cpp',
     'controller/histogram.cpp',
     'controller/algorithm.cpp',
-- 
2.20.1



More information about the libcamera-devel mailing list