Show a patch.

GET /api/patches/11499/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 11499,
    "url": "https://patchwork.libcamera.org/api/patches/11499/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/11499/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20210304153120.1904-3-david.plowman@raspberrypi.com>",
    "date": "2021-03-04T15:31:20",
    "name": "[libcamera-devel,2/2] ipa: raspberrypi: Add support for imx290/imx327 sensors",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "6e9bd76ff3cec0a8dc1d29fc52abef616690b283",
    "submitter": {
        "id": 42,
        "url": "https://patchwork.libcamera.org/api/people/42/?format=api",
        "name": "David Plowman",
        "email": "david.plowman@raspberrypi.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/11499/mbox/",
    "series": [
        {
            "id": 1761,
            "url": "https://patchwork.libcamera.org/api/series/1761/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1761",
            "date": "2021-03-04T15:31:18",
            "name": "Raspberry Pi support for new sensors",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/1761/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/11499/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/11499/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3522FBD80C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  4 Mar 2021 15:31:28 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 54BA968AA5;\n\tThu,  4 Mar 2021 16:31:27 +0100 (CET)",
            "from mail-wr1-x433.google.com (mail-wr1-x433.google.com\n\t[IPv6:2a00:1450:4864:20::433])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 44CC068A93\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  4 Mar 2021 16:31:26 +0100 (CET)",
            "by mail-wr1-x433.google.com with SMTP id l12so28108083wry.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 04 Mar 2021 07:31:26 -0800 (PST)",
            "from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72])\n\tby smtp.gmail.com with ESMTPSA id\n\tf7sm20306129wrm.36.2021.03.04.07.31.24\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 04 Mar 2021 07:31:25 -0800 (PST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"dXQfwoP7\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=LTwnC0vyoy3l438IK046DHxRsyFGzWUUtArKSKS0FGo=;\n\tb=dXQfwoP7TUhCl2ifFHN8V6RPTGwXFBzfywLzMNXZeDnKxr/mDtOdmEBGr9cmlngLqi\n\tOYhnQjpYirunkRkr25Zj89y5Q59H8hR2XveEiWhipbjTp8f9s6ghlykDTaxANwMkjbCt\n\tvjOsw8HgjYaVNz9zzY3d4dbSy3NJ5Oi5rrAggQGhKrKQH7SNaOSg09BOpfX95sg8ZgbJ\n\tJ5SrL6ltH1KjEqfJGRrEP9xlEmboAmmuaSK1QQuQrlMVckdr/sAFhKZAEBfywwD4t0pN\n\tr6klw55JxtYcrwGH3363zp/KiSgqnd3xydeOjtr41o2VfjAXA6vOIZxSiYakmoK958N5\n\txhvQ==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=LTwnC0vyoy3l438IK046DHxRsyFGzWUUtArKSKS0FGo=;\n\tb=mjZVoLRSBaxmvn52GuJ2bODOFc50zA4y9ZWTtxf0D/CwWhCMwim1ucdBNpSJF1aXOd\n\t6u9z3oz0qF22hbsGoxgeiE43T5W8pIo3+uGrr8StbZiM0T6YwNKuNTYvTgvF2nbMAdSU\n\tFRGLe/WLoaxCKGSg4nQ/TWWKM22bcJoCIaT7hli1pEtQGsNljGUKHYW2VEsZuE6XYX7s\n\t4efj67r5U0Q2dCniWijr5sj2eY+5rZjhf2dYp7Ia5nsCzeBMUSg91mywsQ70yvrn+O84\n\tQLolyYLRGhHrRvtFEq1vyyCWhjLRonf3RDcnom6gdrp/0V7QhxbKQKAMbHura61wKD/S\n\tjjIw==",
        "X-Gm-Message-State": "AOAM531qVBUQ8IMXDr7QH3D8SRjObvucTtFnlfsFiSmszMuYoWYgB7Yo\n\tDL89gSYj64NqYRuEYmpVMm8n8dfWheCmZw==",
        "X-Google-Smtp-Source": "ABdhPJwcxFQfz2f3S9A/pjMceWVTOnxfHLHLL2c2I+jurO2kXs1IIAVlajPYG6UG3gFm6LE0CndwVQ==",
        "X-Received": "by 2002:a5d:6205:: with SMTP id y5mr4620140wru.238.1614871885580;\n\tThu, 04 Mar 2021 07:31:25 -0800 (PST)",
        "From": "David Plowman <david.plowman@raspberrypi.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Thu,  4 Mar 2021 15:31:20 +0000",
        "Message-Id": "<20210304153120.1904-3-david.plowman@raspberrypi.com>",
        "X-Mailer": "git-send-email 2.20.1",
        "In-Reply-To": "<20210304153120.1904-1-david.plowman@raspberrypi.com>",
        "References": "<20210304153120.1904-1-david.plowman@raspberrypi.com>",
        "MIME-Version": "1.0",
        "Subject": "[libcamera-devel] [PATCH 2/2] ipa: raspberrypi: Add support for\n\timx290/imx327 sensors",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "imx290 and imx327 share the same kernel driver (imx290.c) and are\ntherefore both recognised here as \"imx290\". We add the necessary\nCamHelper for these sensors, as well as a camera tuning file.\n\nThe tuning was done with an Innomaker STARVIS IMX327LQR module. These\nhave no IR cut filter so there is no proper colour tuning. However,\nyou should obtain reasonable results for most modules using this\nsensor. Specific tunings for further modules can always be added\nsubsequently.\n\nTo use this sensor on the Raspberry Pi platform, please add\n\ndtoverlay=imx290,clock-frequency=74250000\n\ninto your /boot/config.txt file.\n\nSigned-off-by: David Plowman <david.plowman@raspberrypi.com>\n---\n src/ipa/raspberrypi/cam_helper_imx290.cpp |  67 +++++++++\n src/ipa/raspberrypi/data/imx290.json      | 165 ++++++++++++++++++++++\n src/ipa/raspberrypi/data/meson.build      |   1 +\n src/ipa/raspberrypi/meson.build           |   1 +\n 4 files changed, 234 insertions(+)\n create mode 100644 src/ipa/raspberrypi/cam_helper_imx290.cpp\n create mode 100644 src/ipa/raspberrypi/data/imx290.json",
    "diff": "diff --git a/src/ipa/raspberrypi/cam_helper_imx290.cpp b/src/ipa/raspberrypi/cam_helper_imx290.cpp\nnew file mode 100644\nindex 00000000..6f412e40\n--- /dev/null\n+++ b/src/ipa/raspberrypi/cam_helper_imx290.cpp\n@@ -0,0 +1,67 @@\n+/* SPDX-License-Identifier: BSD-2-Clause */\n+/*\n+ * Copyright (C) 2021, Raspberry Pi (Trading) Limited\n+ *\n+ * cam_helper_imx290.cpp - camera helper for imx290 sensor\n+ */\n+\n+#include <math.h>\n+\n+#include \"cam_helper.hpp\"\n+\n+using namespace RPiController;\n+\n+class CamHelperImx290 : public CamHelper\n+{\n+public:\n+\tCamHelperImx290();\n+\tuint32_t GainCode(double gain) const override;\n+\tdouble Gain(uint32_t gain_code) const override;\n+\tvoid GetDelays(int &exposure_delay, int &gain_delay,\n+\t\t       int &vblank_delay) const override;\n+\tunsigned int HideFramesModeSwitch() const override;\n+\n+private:\n+\t/*\n+\t * Smallest difference between the frame length and integration time,\n+\t * in units of lines.\n+\t */\n+\tstatic constexpr int frameIntegrationDiff = 2;\n+};\n+\n+CamHelperImx290::CamHelperImx290()\n+\t: CamHelper(nullptr, frameIntegrationDiff)\n+{\n+}\n+\n+uint32_t CamHelperImx290::GainCode(double gain) const\n+{\n+\tint code = 66.6667 * log10(gain);\n+\treturn std::max(0, std::min(code, 0xf0));\n+}\n+\n+double CamHelperImx290::Gain(uint32_t gain_code) const\n+{\n+\treturn pow(10, 0.015 * gain_code);\n+}\n+\n+void CamHelperImx290::GetDelays(int &exposure_delay, int &gain_delay,\n+\t\t\t\tint &vblank_delay) const\n+{\n+\texposure_delay = 2;\n+\tgain_delay = 2;\n+\tvblank_delay = 2;\n+}\n+\n+unsigned int CamHelperImx290::HideFramesModeSwitch() const\n+{\n+\t/* After a mode switch, we seem to get 1 bad frame. */\n+\treturn 1;\n+}\n+\n+static CamHelper *Create()\n+{\n+\treturn new CamHelperImx290();\n+}\n+\n+static RegisterCamHelper reg(\"imx290\", &Create);\ndiff --git a/src/ipa/raspberrypi/data/imx290.json b/src/ipa/raspberrypi/data/imx290.json\nnew file mode 100644\nindex 00000000..6fb92cc4\n--- /dev/null\n+++ b/src/ipa/raspberrypi/data/imx290.json\n@@ -0,0 +1,165 @@\n+{\n+    \"rpi.black_level\":\n+    {\n+        \"black_level\": 3840\n+    },\n+    \"rpi.dpc\":\n+    {\n+    },\n+    \"rpi.lux\":\n+    {\n+        \"reference_shutter_speed\": 6813,\n+        \"reference_gain\": 1.0,\n+        \"reference_aperture\": 1.0,\n+        \"reference_lux\": 890,\n+        \"reference_Y\": 12900\n+    },\n+    \"rpi.noise\":\n+    {\n+        \"reference_constant\": 0,\n+        \"reference_slope\": 2.67\n+    },\n+    \"rpi.geq\":\n+    {\n+        \"offset\": 187,\n+        \"slope\": 0.00842\n+    },\n+    \"rpi.sdn\":\n+    {\n+    },\n+    \"rpi.awb\":\n+    {\n+\t\"bayes\": 0\n+    },\n+    \"rpi.agc\":\n+    {\n+\t\"speed\": 0.2,\n+        \"metering_modes\":\n+        {\n+            \"matrix\":\n+            {\n+                \"weights\":\n+                [\n+                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1\n+                ]\n+            },\n+            \"centre-weighted\":\n+            {\n+                \"weights\":\n+                [\n+                    3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0\n+                ]\n+            },\n+            \"spot\":\n+            {\n+                \"weights\":\n+                [\n+                    2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n+                ]\n+            }\n+        },\n+        \"exposure_modes\":\n+        {\n+            \"normal\":\n+            {\n+                \"shutter\":\n+                [\n+                    10, 30000, 60000\n+                ],\n+                \"gain\":\n+                [\n+                    1.0,  2.0,   8.0\n+                ]\n+            },\n+            \"sport\":\n+            {\n+                \"shutter\":\n+                [\n+                    10, 5000, 10000, 20000, 120000\n+                ],\n+                \"gain\":\n+                [\n+                    1.0, 2.0, 4.0, 6.0, 6.0\n+                ]\n+            }\n+        },\n+        \"constraint_modes\":\n+        {\n+            \"normal\":\n+            [\n+            ],\n+            \"highlight\":\n+            [\n+                {\n+                    \"bound\": \"LOWER\", \"q_lo\": 0.98, \"q_hi\": 1.0, \"y_target\":\n+                    [\n+                        0, 0.5, 1000, 0.5\n+                    ]\n+                },\n+                {\n+                    \"bound\": \"UPPER\", \"q_lo\": 0.98, \"q_hi\": 1.0, \"y_target\":\n+                    [\n+                        0, 0.8, 1000, 0.8\n+                    ]\n+                }\n+            ]\n+        },\n+        \"y_target\":\n+        [\n+            0, 0.16, 1000, 0.16, 10000, 0.16\n+        ]\n+    },\n+    \"rpi.alsc\":\n+    {\n+        \"omega\": 1.3,\n+        \"n_iter\": 100,\n+        \"luminance_strength\": 0.7,\n+        \"luminance_lut\":\n+        [\n+            2.844, 2.349, 2.018, 1.775, 1.599, 1.466, 1.371, 1.321, 1.306, 1.316, 1.357, 1.439, 1.552, 1.705, 1.915, 2.221,\n+            2.576, 2.151, 1.851, 1.639, 1.478, 1.358, 1.272, 1.231, 1.218, 1.226, 1.262, 1.335, 1.438, 1.571, 1.766, 2.067,\n+            2.381, 2.005, 1.739, 1.545, 1.389, 1.278, 1.204, 1.166, 1.153, 1.161, 1.194, 1.263, 1.356, 1.489, 1.671, 1.943,\n+            2.242, 1.899, 1.658, 1.481, 1.329, 1.225, 1.156, 1.113, 1.096, 1.107, 1.143, 1.201, 1.289, 1.423, 1.607, 1.861,\n+            2.152, 1.831, 1.602, 1.436, 1.291, 1.193, 1.121, 1.069, 1.047, 1.062, 1.107, 1.166, 1.249, 1.384, 1.562, 1.801,\n+            2.104, 1.795, 1.572, 1.407, 1.269, 1.174, 1.099, 1.041, 1.008, 1.029, 1.083, 1.146, 1.232, 1.364, 1.547, 1.766,\n+            2.104, 1.796, 1.572, 1.403, 1.264, 1.171, 1.097, 1.036, 1.001, 1.025, 1.077, 1.142, 1.231, 1.363, 1.549, 1.766,\n+            2.148, 1.827, 1.594, 1.413, 1.276, 1.184, 1.114, 1.062, 1.033, 1.049, 1.092, 1.153, 1.242, 1.383, 1.577, 1.795,\n+            2.211, 1.881, 1.636, 1.455, 1.309, 1.214, 1.149, 1.104, 1.081, 1.089, 1.125, 1.184, 1.273, 1.423, 1.622, 1.846,\n+            2.319, 1.958, 1.698, 1.516, 1.362, 1.262, 1.203, 1.156, 1.137, 1.142, 1.171, 1.229, 1.331, 1.484, 1.682, 1.933,\n+            2.459, 2.072, 1.789, 1.594, 1.441, 1.331, 1.261, 1.219, 1.199, 1.205, 1.232, 1.301, 1.414, 1.571, 1.773, 2.052,\n+            2.645, 2.206, 1.928, 1.728, 1.559, 1.451, 1.352, 1.301, 1.282, 1.289, 1.319, 1.395, 1.519, 1.685, 1.904, 2.227\n+        ],\n+        \"sigma\": 0.005,\n+        \"sigma_Cb\": 0.005\n+    },\n+    \"rpi.contrast\":\n+    {\n+        \"ce_enable\": 1,\n+        \"gamma_curve\":\n+        [\n+            0, 0, 1024, 5040, 2048, 9338, 3072, 12356, 4096, 15312, 5120, 18051, 6144, 20790, 7168, 23193,\n+            8192, 25744, 9216, 27942, 10240, 30035, 11264, 32005, 12288, 33975, 13312, 35815, 14336, 37600, 15360, 39168,\n+            16384, 40642, 18432, 43379, 20480, 45749, 22528, 47753, 24576, 49621, 26624, 51253, 28672, 52698, 30720, 53796,\n+            32768, 54876, 36864, 57012, 40960, 58656, 45056, 59954, 49152, 61183, 53248, 62355, 57344, 63419, 61440, 64476,\n+            65535, 65535\n+        ]\n+    },\n+    \"rpi.sharpen\":\n+    {\n+    },\n+    \"rpi.ccm\":\n+    {\n+        \"ccms\":\n+\t[\n+            {\n+\t\t\"ct\": 3900, \"ccm\":\n+\t\t[\n+\t\t    1.54659, -0.17707, -0.36953, -0.51471, 1.72733, -0.21262, 0.06667, -0.92279, 1.85612\n+\t\t]\n+\t    }\n+\t]\n+    },\n+    \"rpi.focus\":\n+    {\n+    }\n+}\ndiff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build\nindex 5236bf1e..509ad58b 100644\n--- a/src/ipa/raspberrypi/data/meson.build\n+++ b/src/ipa/raspberrypi/data/meson.build\n@@ -3,6 +3,7 @@\n conf_files = files([\n     'imx219.json',\n     'imx477.json',\n+    'imx290.json',\n     'ov5647.json',\n     'uncalibrated.json',\n ])\ndiff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build\nindex 59e49686..7e88f8e0 100644\n--- a/src/ipa/raspberrypi/meson.build\n+++ b/src/ipa/raspberrypi/meson.build\n@@ -21,6 +21,7 @@ rpi_ipa_sources = files([\n     'cam_helper_ov5647.cpp',\n     'cam_helper_imx219.cpp',\n     'cam_helper_imx477.cpp',\n+    'cam_helper_imx290.cpp',\n     'controller/controller.cpp',\n     'controller/histogram.cpp',\n     'controller/algorithm.cpp',\n",
    "prefixes": [
        "libcamera-devel",
        "2/2"
    ]
}