From patchwork Wed Nov 11 16:48:55 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 28865 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 5B072C335C for ; Wed, 11 Nov 2026 16:49:20 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0E5176A7B8; Wed, 11 Nov 2026 17:49:16 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="T/MWWdI0"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 73B7F69134 for ; Wed, 11 Nov 2026 17:49:10 +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 3846E802; Wed, 11 Nov 2026 17:46:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1794415607; bh=EmJODuew+54jc5MI4acv0MRI6dXPXtBUcnFA1Qetwv8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=T/MWWdI0T3ck/tpVNX8RMlfTY4VgS+qgccAgkUHWNdJIaTtQB2v2Tk6Yvk0TxqcpM O95CA5O6P5BHaukJAJsENAkJMcdVw5/aMSnxFPPqpRK/GqgURoa3wYCArPmRq4ce/p yx5DAhdwxBejc/Mj/nBONoJG57ENloz0CRE/PtoU= From: Jacopo Mondi Date: Wed, 11 Nov 2026 17:48:55 +0100 Subject: [PATCH 5/5] libipa: camera_sensor_helper: Add Mira016 MIME-Version: 1.0 Message-Id: <20261111-b4-mira016-v1-5-340bdb923426@ideasonboard.com> References: <20261111-b4-mira016-v1-0-340bdb923426@ideasonboard.com> In-Reply-To: <20261111-b4-mira016-v1-0-340bdb923426@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=2592; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=EmJODuew+54jc5MI4acv0MRI6dXPXtBUcnFA1Qetwv8=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBq9JyEtNqd070XZZG78LYH7p4fILeExu25EJe18 nFZadzFySCJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCavSchAAKCRByNAaPFqFW PAepEAC9YdnrPiK29awLOTxZCoM4ezftunOy5MqxatvAHMvjqyudlcVhW4nKJ1+G+by7zX8NKga +TJQGUDE4x30+0+VRvbGqL69F1nYTXXHJQACTvLXUQWxw56YZ0q/zsr3BTO1dnedUNGAKVcABCD 6p+5EvMZd9jvwLGl1fplAsry7ylaLFn5hBl2oQKthi8jwtHQh+qih9tpGPjyd71N132zRoAtCas XZiuN/dp7+o0k6cIdc/t961zIerCL2LVv6a5XQUGp+t7WiaY6prA0MTfJvJXvsvbocs9c6O1cBV S+jRFqkq+GiILw/Ba2/4AbCMXt7sfOIZMDp9Wehc9X472AxJU8uLZXTPSVYFVH0TMU8aiXLAYMm w1q0y0k0+6sb7cBP3s+/YC0lIBCyHX2gI8PvLyhw1UwW503qWw/iArKRtSBm/2Z1gM5Y+HZ7njI w6YTyC81v3O2xj+14hnUBjiTNkdqOBoyjr+4xxn7ZBEl4IY4lnvDccA3CM5K9yt86nnTi/15aYL HIUYWXwUU/Pmp/xwKc4KxVjF5prcLJ25zwguwdarL3adaGDOyMdw1d26Ama223+S0bicZShV35h oAMSI+Ow4LxoUP90K3nWNqbfzfnTZMJK077bjf9tlAJ0nI1pCzwXJVxPrPJ9BFqH5tAcOoh0o2L 6nNInp5v4JcqPgw== 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 | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index 359040ec7418..972173f22def 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -736,6 +736,59 @@ 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 < sizeLut - 1) { + 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 + { + if (gainCode >= sizeLut) + gainCode = sizeLut - 1; + + return static_cast(gainLut[gainCode]); + } + +private: + static constexpr float gainLut[] = { + 1, 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, 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, + 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, 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, + }; + uint32_t sizeLut = sizeof(gainLut) / sizeof(gainLut[0]); +}; +REGISTER_CAMERA_SENSOR_HELPER("mira016", CameraSensorHelperMira016) + class CameraSensorHelperMira220 : public CameraSensorHelper { public: