[v1,2/2] ipa: rpi: Adding IMX585 + IMX585-mono support
diff mbox series

Message ID 20240807080344.12780-3-naush@raspberrypi.com
State Rejected
Headers show
Series
  • Raspberrypi: Add support for IMX585
Related show

Commit Message

Naushir Patuck Aug. 7, 2024, 8:03 a.m. UTC
From: will whang <will@willwhang.com>

Add support for the IMX585 sensor - both colour and mono variants.

Signed-off-by: will whang <will@willwhang.com>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
---
 src/ipa/rpi/cam_helper/cam_helper_imx585.cpp  |  75 +++++
 src/ipa/rpi/cam_helper/meson.build            |   1 +
 src/ipa/rpi/vc4/data/imx585.json              | 315 ++++++++++++++++++
 src/ipa/rpi/vc4/data/imx585_mono.json         | 180 ++++++++++
 src/ipa/rpi/vc4/data/meson.build              |   2 +
 .../sensor/camera_sensor_properties.cpp       |   4 +
 6 files changed, 577 insertions(+)
 create mode 100644 src/ipa/rpi/cam_helper/cam_helper_imx585.cpp
 create mode 100644 src/ipa/rpi/vc4/data/imx585.json
 create mode 100644 src/ipa/rpi/vc4/data/imx585_mono.json

Patch
diff mbox series

diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx585.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx585.cpp
new file mode 100644
index 000000000000..8efdb504c75b
--- /dev/null
+++ b/src/ipa/rpi/cam_helper/cam_helper_imx585.cpp
@@ -0,0 +1,75 @@ 
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Copyright (C) 2024, Raspberry Pi Ltd
+ *
+ * cam_helper_Imx585.cpp - camera information for Imx585 sensor
+ */
+
+#include <assert.h>
+#include <cmath>
+
+#include "cam_helper.h"
+
+using namespace RPiController;
+
+class CamHelperImx585 : public CamHelper
+{
+public:
+	CamHelperImx585();
+	uint32_t gainCode(double gain) const override;
+	double gain(uint32_t gainCode) const override;
+	void getDelays(int &exposureDelay, int &gainDelay,
+		       int &vblankDelay, int &hblankDelay) const override;
+	unsigned int hideFramesModeSwitch() const override;
+
+private:
+	/*
+	 * Smallest difference between the frame length and integration time,
+	 * in units of lines.
+	 */
+	static constexpr int frameIntegrationDiff = 4;
+};
+
+/*
+ * Imx585 doesn't output metadata, so we have to use delayed controls which
+ * works by counting frames.
+ */
+
+CamHelperImx585::CamHelperImx585()
+	: CamHelper({}, frameIntegrationDiff)
+{
+}
+
+uint32_t CamHelperImx585::gainCode(double gain) const
+{
+	int code = 66.6667 * log10(gain);
+	return std::max(0, std::min(code, 0xf0));
+}
+
+double CamHelperImx585::gain(uint32_t gainCode) const
+{
+	return pow(10, 0.015 * gainCode);
+}
+
+void CamHelperImx585::getDelays(int &exposureDelay, int &gainDelay,
+				int &vblankDelay, int &hblankDelay) const
+{
+	/* The driver appears to behave as follows: */
+	exposureDelay = 2;
+	gainDelay = 2;
+	vblankDelay = 2;
+	hblankDelay = 2;
+}
+
+unsigned int CamHelperImx585::hideFramesModeSwitch() const
+{
+	/* After a mode switch, we seem to get 1 bad frame. */
+	return 1;
+}
+
+static CamHelper *create()
+{
+	return new CamHelperImx585();
+}
+
+static RegisterCamHelper reg("imx585", &create);
diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build
index 7262505742f3..369669397d46 100644
--- a/src/ipa/rpi/cam_helper/meson.build
+++ b/src/ipa/rpi/cam_helper/meson.build
@@ -8,6 +8,7 @@  rpi_ipa_cam_helper_sources = files([
     'cam_helper_imx296.cpp',
     'cam_helper_imx477.cpp',
     'cam_helper_imx519.cpp',
+    'cam_helper_imx585.cpp',
     'cam_helper_imx708.cpp',
     'cam_helper_ov64a40.cpp',
     'cam_helper_ov9281.cpp',
diff --git a/src/ipa/rpi/vc4/data/imx585.json b/src/ipa/rpi/vc4/data/imx585.json
new file mode 100644
index 000000000000..be101389f699
--- /dev/null
+++ b/src/ipa/rpi/vc4/data/imx585.json
@@ -0,0 +1,315 @@ 
+{
+    "version": 2.0,
+    "target": "bcm2835",
+    "algorithms": [
+        {
+            "rpi.black_level":
+            {
+                "black_level": 3200
+            }
+        },
+        {
+            "rpi.dpc": { }
+        },
+        {
+            "rpi.lux":
+            {
+                "reference_shutter_speed": 6384,
+                "reference_gain": 1.0,
+                "reference_aperture": 1.0,
+                "reference_lux": 935,
+                "reference_Y": 11637
+            }
+        },
+        {
+            "rpi.noise":
+            {
+                "reference_constant": 12,
+                "reference_slope": 3.568
+            }
+        },
+        {
+            "rpi.geq":
+            {
+                "offset": 192,
+                "slope": 0.00812
+            }
+        },
+        {
+            "rpi.sdn": { }
+        },
+        {
+            "rpi.awb":
+            {
+                "priors": [
+                    {
+                        "lux": 0,
+                        "prior":
+                        [
+                            2000, 1.0,
+                            3000, 0.0,
+                            13000, 0.0
+                        ]
+                    },
+                    {
+                        "lux": 800,
+                        "prior":
+                        [
+                            2000, 0.0,
+                            6000, 2.0,
+                            13000, 2.0
+                        ]
+                    },
+                    {
+                        "lux": 1500,
+                        "prior":
+                        [
+                            2000, 0.0,
+                            4000, 1.0,
+                            6000, 6.0,
+                            6500, 7.0,
+                            7000, 1.0,
+                            13000, 1.0
+                        ]
+                    }
+                ],
+                "modes":
+                {
+                    "auto":
+                    {
+                        "lo": 2500,
+                        "hi": 8000
+                    },
+                    "incandescent":
+                    {
+                        "lo": 2500,
+                        "hi": 3000
+                    },
+                    "tungsten":
+                    {
+                        "lo": 3000,
+                        "hi": 3500
+                    },
+                    "fluorescent":
+                    {
+                        "lo": 4000,
+                        "hi": 4700
+                    },
+                    "indoor":
+                    {
+                        "lo": 3000,
+                        "hi": 5000
+                    },
+                    "daylight":
+                    {
+                        "lo": 5500,
+                        "hi": 6500
+                    }
+                },
+                "bayes": 1,
+                "ct_curve":
+                [
+                    2187.0, 1.1114, 0.1026,
+                    2258.0, 1.1063, 0.1147,
+                    5225.0, 0.6631, 0.5507,
+                    5289.0, 0.5769, 0.5731,
+                    6532.0, 0.5259, 0.5801
+                ],
+                "sensitivity_r": 1.0,
+                "sensitivity_b": 1.0,
+                "transverse_pos": 0.13694,
+                "transverse_neg": 0.08426
+            }
+        },
+        {
+            "rpi.agc":
+            {
+                "metering_modes":
+                {
+                    "centre-weighted":
+                    {
+                        "weights":
+                        [
+                            3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0
+                        ]
+                    },
+                    "spot":
+                    {
+                        "weights":
+                        [
+                            2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+                        ]
+                    },
+                    "matrix":
+                    {
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
+                    }
+                },
+                "exposure_modes":
+                {
+                    "normal":
+                    {
+                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
+                        "gain": [ 1.0, 2.0, 4.0, 6.0, 6.0 ]
+                    },
+                    "short":
+                    {
+                        "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                        "gain": [ 1.0, 2.0, 4.0, 6.0, 6.0 ]
+                    }
+                },
+                "constraint_modes":
+                {
+                    "normal": [
+                        {
+                            "bound": "LOWER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.5,
+                                1000, 0.5
+                            ]
+                        }
+                    ],
+                    "highlight": [
+                        {
+                            "bound": "LOWER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.5,
+                                1000, 0.5
+                            ]
+                        },
+                        {
+                            "bound": "UPPER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.8,
+                                1000, 0.8
+                            ]
+                        }
+                    ]
+                },
+                "y_target":
+                [
+                    0, 0.16,
+                    1000, 0.165,
+                    10000, 0.17
+                ]
+            }
+        },
+        {
+            "rpi.alsc":
+            {
+                "omega": 1.3,
+                "n_iter": 100,
+                "luminance_strength": 0.7
+            }
+        },
+        {
+            "rpi.contrast":
+            {
+                "ce_enable": 1,
+                "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
+                ]
+            }
+        },
+        {
+            "rpi.ccm":
+            {
+                "ccms": [
+                    {
+                        "ct": 2187,
+                        "ccm":
+                        [
+                            1.91049, -0.78523, -0.12525,
+                            -0.69541, 1.68995, 0.00546,
+                            -0.47685, 0.89308, 0.58376
+                        ]
+                    },
+                    {
+                        "ct": 2258,
+                        "ccm":
+                        [
+                            1.78809, -0.66968, -0.11841,
+                            -0.67083, 1.69256, -0.02173,
+                            -0.53371, 1.05827, 0.47545
+                        ]
+                    },
+                    {
+                        "ct": 5225,
+                        "ccm":
+                        [
+                            1.41687, -0.26811, -0.14877,
+                            -0.37784, 1.28381, 0.09403,
+                            0.04629, -0.42973, 1.38344
+                        ]
+                    },
+                    {
+                        "ct": 5289,
+                        "ccm":
+                        [
+                            1.42939, -0.40792, -0.02147,
+                            -0.27719, 1.46177, -0.18458,
+                            0.08958, -0.63362, 1.54404
+                        ]
+                    },
+                    {
+                        "ct": 6532,
+                        "ccm":
+                        [
+                            1.46551, -0.24251, -0.22301,
+                            -0.42242, 1.64605, -0.22363,
+                            0.02631, -0.42478, 1.39847
+                        ]
+                    }
+                ]
+            }
+        },
+        {
+            "rpi.sharpen": { }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/imx585_mono.json b/src/ipa/rpi/vc4/data/imx585_mono.json
new file mode 100644
index 000000000000..956b4aeb390d
--- /dev/null
+++ b/src/ipa/rpi/vc4/data/imx585_mono.json
@@ -0,0 +1,180 @@ 
+{
+    "version": 2.0,
+    "target": "bcm2835",
+    "algorithms": [
+        {
+            "rpi.black_level":
+            {
+                "black_level": 3200
+            }
+        },
+        {
+            "rpi.dpc": { }
+        },
+        {
+            "rpi.lux":
+            {
+                "reference_shutter_speed": 6384,
+                "reference_gain": 1.0,
+                "reference_aperture": 1.0,
+                "reference_lux": 935,
+                "reference_Y": 11637
+            }
+        },
+        {
+            "rpi.noise":
+            {
+                "reference_constant": 12,
+                "reference_slope": 3.568
+            }
+        },
+        {
+            "rpi.geq":
+            {
+                "offset": 192,
+                "slope": 0.00812
+            }
+        },
+        {
+            "rpi.sdn": { }
+        },
+        {
+            "rpi.agc":
+            {
+                "metering_modes":
+                {
+                    "centre-weighted":
+                    {
+                        "weights":
+                        [
+                            3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0
+                        ]
+                    },
+                    "spot":
+                    {
+                        "weights":
+                        [
+                            2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+                        ]
+                    },
+                    "matrix":
+                    {
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
+                    }
+                },
+                "exposure_modes":
+                {
+                    "normal":
+                    {
+                        "shutter": [ 100, 10000, 30000, 60000, 120000 ],
+                        "gain": [ 1.0, 2.0, 4.0, 6.0, 6.0 ]
+                    },
+                    "short":
+                    {
+                        "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                        "gain": [ 1.0, 2.0, 4.0, 6.0, 6.0 ]
+                    }
+                },
+                "constraint_modes":
+                {
+                    "normal": [
+                        {
+                            "bound": "LOWER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.5,
+                                1000, 0.5
+                            ]
+                        }
+                    ],
+                    "highlight": [
+                        {
+                            "bound": "LOWER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.5,
+                                1000, 0.5
+                            ]
+                        },
+                        {
+                            "bound": "UPPER",
+                            "q_lo": 0.98,
+                            "q_hi": 1.0,
+                            "y_target":
+                            [
+                                0, 0.8,
+                                1000, 0.8
+                            ]
+                        }
+                    ]
+                },
+                "y_target":
+                [
+                    0, 0.16,
+                    1000, 0.165,
+                    10000, 0.17
+                ]
+            }
+        },
+        {
+            "rpi.alsc":
+            {
+                "omega": 1.3,
+                "n_iter": 100,
+                "luminance_strength": 0.7
+            }
+        },
+        {
+            "rpi.contrast":
+            {
+                "ce_enable": 1,
+                "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
+                ]
+            }
+        },
+        {
+            "rpi.sharpen": { }
+        }
+    ]
+}
diff --git a/src/ipa/rpi/vc4/data/meson.build b/src/ipa/rpi/vc4/data/meson.build
index afbf875a113a..a3198b57c141 100644
--- a/src/ipa/rpi/vc4/data/meson.build
+++ b/src/ipa/rpi/vc4/data/meson.build
@@ -11,6 +11,8 @@  conf_files = files([
     'imx477_noir.json',
     'imx477_scientific.json',
     'imx519.json',
+    'imx585.json',
+    'imx585_mono.json',
     'imx708.json',
     'imx708_noir.json',
     'imx708_wide.json',
diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp
index 4e5217ab51ef..86c8576e319c 100644
--- a/src/libcamera/sensor/camera_sensor_properties.cpp
+++ b/src/libcamera/sensor/camera_sensor_properties.cpp
@@ -148,6 +148,10 @@  const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen
 				 */
 			},
 		} },
+		{ "imx585", {
+			.unitCellSize = { 2900, 2900 },
+			.testPatternModes = {},
+		} },
 		{ "imx708", {
 			.unitCellSize = { 1400, 1400 },
 			.testPatternModes = {