From patchwork Thu Nov 12 14:20:47 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 28882 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id B1FD0C335C for ; Thu, 12 Nov 2026 14:21:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1D77369213; Thu, 12 Nov 2026 15:21:08 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="HpLijvNC"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1067D6A7BA for ; Thu, 12 Nov 2026 15:21:01 +0100 (CET) Received: from [192.168.1.182] (93-46-82-201.ip106.fastwebnet.it [93.46.82.201]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 25715219; Thu, 12 Nov 2026 15:18:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1794493117; bh=JJICIa4VzoNov4MYpGtXZtiJXUx/wfSOZ37PV3h7vho=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HpLijvNCtPNePUyHONjX90QrEiK5g842VVevUNTjqotxB7qll0juHMYEf1320+xQz x1ZakK4Uq9aaNPDFRYJzOm9JP+Ofzlx/llwt/yr2qrcr0rQpBrhorcBqwNkz7RWEav ZaAr605qGeZwjKF1eRNnDcU1Qr6l8SBQdtBEUWhY= From: Jacopo Mondi Date: Thu, 12 Nov 2026 15:20:47 +0100 Subject: [PATCH v2 5/5] libipa: camera_sensor_helper: Add Mira016 MIME-Version: 1.0 Message-Id: <20261112-b4-mira016-v2-5-c96443a745ce@ideasonboard.com> References: <20261112-b4-mira016-v2-0-c96443a745ce@ideasonboard.com> In-Reply-To: <20261112-b4-mira016-v2-0-c96443a745ce@ideasonboard.com> To: Philippe Baetens , libcamera-devel@lists.libcamera.org Cc: Jacopo Mondi X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2727; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=JJICIa4VzoNov4MYpGtXZtiJXUx/wfSOZ37PV3h7vho=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBq9ctKebyKbr6o0ow9uXGmPaaCx1CEEuWDFJ+aC F4288s0AleJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCavXLSgAKCRByNAaPFqFW PI62EACmbQ5jLWVE+RBFypf84AuNzwyQVVec1IiTe7vStem4j5ZEaty4oslUZTEF8faa/UA2d9O qd/nEC5FMf8fVfPiL6OAeKq9J/2oAqeBbVBgc5vuR1I4YHnVUSH5MhpDZLPkym04YlrjW5HQg7d ri96lQO3B5pewGjdxnRJ+sXftPRfsOVTzlpPhTdwL/IRGgDdWG7NvriHXZKKDYxn6/r+pmFOamP vThLMMH7d9qXy5intMNoVNuDh+uvNdFseGOlT9as+7UvIZNgCB0jcX26JgY1mIgq6ucEjD389eQ 6R/4lb4lV1lrVOe2zeCCbGURnez2xBfbZShozVMgAExc1GI10QQ/9kYUrPX6Ahl6bySAKFuWSIq iX8dldPdA0/d4NwBYwEM3znc5z5UfZy/i+U3ZwWCmpRW7j1SOj4zCl3tOHuOEEoZLgmsoBkbug4 YwgWvuxuHAKYt9XtwWdgcwaHf8ijFo74sW+lRuEojY6tXZGFLW9CmNyfbCH/5ZBA2+ss4JfgadE M01xJV4QZQqIATt30P637uYDY3GBUJphm9EZc4UeZz3EfhJA0B2Cv/C8aDLkVZFdFvtid7HTnSD zcpsIjJ802WKCXa/+r7MpdRdOjPs6dxEh0n4RijdLa1E45bPhAr6wom005+bwG/UjQ2apKfzGGI loXrDqKKVVE3aWA== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add a camera sensor helper for the AMS-OSRAM Mira016 sensor. The sensor black level has been measured by averaging the pixel values while covering the lens. The mira016 driver gain interface is index-based. The gain() and gainCode() function use a lookup table that translates the desired gain value to an index on the table (and viceversa). Signed-off-by: Jacopo Mondi --- src/ipa/libipa/camera_sensor_helper.cpp | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index 608937d45ee2..b79d92a7b0f7 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -782,6 +782,64 @@ public: }; REGISTER_CAMERA_SENSOR_HELPER("ov08x40", CameraSensorHelperOv08x40) +class CameraSensorHelperMira016 : public CameraSensorHelper +{ +public: + CameraSensorHelperMira016() + { + blackLevel_ = 2048; + } + + uint32_t gainCode(double gain) const override + { + uint32_t gainCode = 0; + + while (gainCode < maxGainIndex) { + if (gain < gainLut[gainCode + 1]) + break; + + gainCode++; + } + + /* + * The V4L2_CID_ANALOGUE_GAIN control is 1-indexed while the + * lookup table is 0-indexed. Return index + 1 here, the driver + * adjusts it to its 0-indexed table. + */ + return gainCode + 1; + } + + double gain(uint32_t gainCode) const override + { + /* + * The V4L2_CID_ANALOGUE_GAIN control is 1-indexed while the lookup + * table is 0-indexed. + */ + ASSERT(gainCode > 0); + gainCode = std::min(gainCode - 1, maxGainIndex); + + return gainLut[gainCode]; + } + +private: + static constexpr std::array gainLut{ + 1.0, 1.018, 1.056, 1.075, 1.118, 1.14, 1.188, 1.213, 1.267, + 1.295, 1.326, 1.373, 1.425, 1.462, 1.5, 1.541, 1.583, + 1.652, 1.701, 1.727, 1.781, 1.839, 1.9, 1.966, 2.0, + 2.073, 2.151, 2.192, 2.28, 2.327, 2.426, 2.478, 2.533, + 2.651, 2.714, 2.78, 2.886, 2.961, 3.04, 3.167, 3.257, + 3.353, 3.455, 3.563, 3.619, 3.738, 3.864, 4.0, 4.071, + 4.222, 4.302, 4.471, 4.56, 4.75, 4.851, 5.067, 5.182, + 5.302, 5.494, 5.7, 5.846, 6.0, 6.247, 6.423, 6.609, + 6.806, 7.015, 7.238, 7.355, 7.6, 7.862, 8.143, 8.291, + 8.604, 8.769, 9.12, 9.306, 9.702, 9.913, 10.133, 10.605, + 10.857, 11.259, 11.544, 11.844, 12.324, 12.667, 13.029, + 13.412, 13.818, 14.25, 14.71, 14.951, 15.458, 16.0, + }; + static constexpr uint32_t maxGainIndex = gainLut.size() - 1; +}; +REGISTER_CAMERA_SENSOR_HELPER("mira016", CameraSensorHelperMira016) + class CameraSensorHelperMira220 : public CameraSensorHelper { public: