From patchwork Thu Jun 18 14:56:41 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 26993 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 1B287BF415 for ; Thu, 18 Jun 2026 14:56:59 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C36EA62C6B; Thu, 18 Jun 2026 16:56:58 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="tj2mus3N"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2318F6298D for ; Thu, 18 Jun 2026 16:56:57 +0200 (CEST) Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c68:bcf2:9325:a9bd:32b:e71]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C5F82227; Thu, 18 Jun 2026 16:56:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781794582; bh=54tnhZabEA5hui/QrWs39oc889l5SE3FOnniCNHKkLk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tj2mus3NipqV/1ERtp5Y8dryj67nXWqNBQx4BcX+eNJkwwthyqqaZDYm/RH3hmqIu 5n8exxlRi1J/Xglb2HuYnPNRlnKrjWcb/z0zuaEmSVfevsupV7WygnruVHMZmIDtNr JjMap6RLpBiMexMoEun3Bj5ZcxocwbOHEXTQHDBs= From: Jai Luthra Date: Thu, 18 Jun 2026 20:26:41 +0530 Subject: [PATCH v2 1/2] libcamera: libipa: camera_sensor: Add Sony IMX678 properties MIME-Version: 1.0 Message-Id: <20260618-imx678-v2-1-a288102744c3@ideasonboard.com> References: <20260618-imx678-v2-0-a288102744c3@ideasonboard.com> In-Reply-To: <20260618-imx678-v2-0-a288102744c3@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Kieran Bingham , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2061; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=54tnhZabEA5hui/QrWs39oc889l5SE3FOnniCNHKkLk=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBqNAct4mMHbeTCvdx/g7qWXbDGW8nEBqyO0bbZh v4bXA15AxGJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCajQHLQAKCRBD3pH5JJpx RdaBD/4rW0347iJlJgJIOHX7SwMblX9CXxd/wekVphCYznmTKf5nx2Vs44E2gGay+AA3ZTTK3Uc h+tTkRoMST/1rM1MgSwGKVyV0rKiX12xiA325lvtTD3ed17qEffAtr+N+SNxvV9X0dYOSCh1E62 c1c28MSJ0V80TJgEXEnL19zHOXFnRldN7roZ5HJ9UpBhuyC/AbPT1pNPY/oeWcyyk4VR318yhtY fdaD1KWp764WZSOK/85wu/cw03qfRmR3+svUYwJMQa37xo4rlY/rMOR0IM1VYbIx3BXjcVWjBuw tO9L78WVxglCqJNT/aWQv2bv7/ghLFSV8nhVAdl5WP6czpznGOE74AP9GuzGJRnlBwkOInjZpIM I6/J33jt4lBwQWQhBntI942sRG80m9HoPLrGRMiSHzWNm55I4qk1011jnBf4YuobT5pDVLABJ6D NNrq/1wkdJxiEucDi7+mpIR45Plc2GanS6hnGYDdgaWm8sYlCuI3I40XWq894TnI+9r918V+KoE YDvoPDC0CMCQ5mtZm6neL/efG6PtWDykNUWx7LnAb8gLmVmeH6wnvCW0r6uODPBG1BBMGEay4je +XgijeuWiqmHNcQbfeCdpC3Dwx7KWcxHncEXq7iEq8u0sKO8hiJb6XNDhI1eNpzdYhOKwR9oLS4 lsjs5EdXM+ZDN9w== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 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 Sony IMX678 properties, along with the black level and gain model through a libipa camera sensor helper. The test patterns are intentionally left empty, as they are similar to IMX335/IMX283 and don't map very well to libcamera's enum values. Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- src/ipa/libipa/camera_sensor_helper.cpp | 12 ++++++++++++ src/libcamera/sensor/camera_sensor_properties.cpp | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index 3028197e1..9ab7a52f2 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -642,6 +642,18 @@ public: }; REGISTER_CAMERA_SENSOR_HELPER("imx477", CameraSensorHelperImx477) +class CameraSensorHelperImx678 : public CameraSensorHelper +{ +public: + CameraSensorHelperImx678() + { + /* From datasheet: 0x32 at 10bits. */ + blackLevel_ = 3200; + gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; + } +}; +REGISTER_CAMERA_SENSOR_HELPER("imx678", CameraSensorHelperImx678) + class CameraSensorHelperImx708 : public CameraSensorHelper { public: diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp index b217363d8..28043150e 100644 --- a/src/libcamera/sensor/camera_sensor_properties.cpp +++ b/src/libcamera/sensor/camera_sensor_properties.cpp @@ -309,6 +309,16 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen .hblankDelay = 3 }, } }, + { "imx678", { + .unitCellSize = { 2000, 2000 }, + .testPatternModes = {}, + .sensorDelays = { + .exposureDelay = 2, + .gainDelay = 2, + .vblankDelay = 2, + .hblankDelay = 2 + }, + } }, { "imx708", { .unitCellSize = { 1400, 1400 }, .testPatternModes = { From patchwork Thu Jun 18 14:56:42 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 26994 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 B9C66BF415 for ; Thu, 18 Jun 2026 14:57:03 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6CAD362C75; Thu, 18 Jun 2026 16:57:03 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="u12XxJP+"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8A53C6298D for ; Thu, 18 Jun 2026 16:57:02 +0200 (CEST) Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c68:bcf2:9325:a9bd:32b:e71]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 28A2F227; Thu, 18 Jun 2026 16:56:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781794587; bh=JsfOTL+qasRiJK4+dljFvLPGJ7p09j/bY124CnG8Qak=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=u12XxJP+4MYjjrmnFGpWu3DyT95qvghfrHvM8eeFwh5RR0nJemg4V7/0SLG25HdtZ qOey7yuZuQTrGSvn3tu8VbM5O2wQGOTYgmsgDITKJ+CVkUEIba3JkQMb2eVcVpMzZO 0Gp1VMxyX+4VCMKnvA/n3O5mWqi06twA75lMlS8w= From: Jai Luthra Date: Thu, 18 Jun 2026 20:26:42 +0530 Subject: [PATCH v2 2/2] ipa: rpi: Add cam_helper for Sony IMX678 MIME-Version: 1.0 Message-Id: <20260618-imx678-v2-2-a288102744c3@ideasonboard.com> References: <20260618-imx678-v2-0-a288102744c3@ideasonboard.com> In-Reply-To: <20260618-imx678-v2-0-a288102744c3@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Kieran Bingham , Laurent Pinchart , Jai Luthra , will whang X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2991; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=CdH63icFtGaqAETY5q9PMVVZ6spYsQD6tH1ENx12DDs=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBqNAcuBmKgk5+zLdWQR0cNo1eGIIQOvbwso8snO OkPpzHOb3qJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCajQHLgAKCRBD3pH5JJpx RcCjEACMJ2xN8WdgtwGXu0OZm189q+RhjlVOVk2hbxchXW9nyL4McvSpubcJ7MgHqhlgQUXsNXN NFw7XNbLYINZsHh1gQvixFdSpkmjP3OILL9d4FkZS/sa6Uo2JJX1gmJLOx5+Wg3FeW95TuS97Ry GHZuEc1hcscxN2TiEs89anQpJ/gDitd8vD3GK5rqrDYcnEgYs+VkqNT5eu0NcFK8mcIIBT8awXF Aw3OPOMmOpSQJ/mBTfcYaf4+SMySfMTspCSowwp3/ltsPPATiQ0B3gLhRyOIxybYoLmsxRMCV3S qB2DGrq/we76Qq3+5ZJ7ygYMg8ZxQjsfUbWmLFl+r8cYIF5k0HW4rGEahe1n4EsiWHzo8L89EOK 0uy4cKzuvw6hHiLxmQAcKyjA9VtaC06qHMbPGETcI3s/5/kl9kPGz9vSsp8GpQPjIzLyLniwuly zCHiKvlP8goAkuEkHT3pFG4MESBwYvuM2fE9P7EaD8kvAXMu1Nmk3oeloqv41raYRNp8nqiI59q u8cRNiEsBImoYKgRwR/6TX3wYz1YfZIji4OIqwfwgETX1a/K/XdNQooRcCJKmZ+RaR4NMZ/3S/H idRgPs14jeW4Ji6MxW1W3Bsvgsj3fx9/yIXkB7tkcNrF0i0SHCJslGIz6zImbTmMo5dZbMeSYi3 LQTbnTXEcQx/Tcg== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 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" From: will whang This adds a basic cam helper for Sony IMX678, modelling the gain curve and the sensor limits for the maximum exposure time. Link: https://github.com/will127534/libcamera/commit/619459e7c70306ba18476 Signed-off-by: will whang Co-developed-by: Jai Luthra Signed-off-by: Jai Luthra Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- Changes in v2: - Drop hideFramesStartup() and hideFramesModeSwitch() - Use std::pow() instead of pow() - Drop unnecessary includes, and include and for std::pow and std::min/max - Reword comment for embedded data, as the sensor supports it but the driver currently does not - Cleanup more issues with whitespace - Add a Co-developed-by tag now that it's not a complete copy-paste - Update commit message --- src/ipa/rpi/cam_helper/cam_helper_imx678.cpp | 56 ++++++++++++++++++++++++++++ src/ipa/rpi/cam_helper/meson.build | 1 + 2 files changed, 57 insertions(+) diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx678.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx678.cpp new file mode 100644 index 000000000..916433bf6 --- /dev/null +++ b/src/ipa/rpi/cam_helper/cam_helper_imx678.cpp @@ -0,0 +1,56 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2026, Will Whang + * + * cam_helper_imx678.cpp - camera information for Sony IMX678 sensor + */ + +#include +#include + +#include "cam_helper.h" + +using namespace RPiController; + +class CamHelperImx678 : public CamHelper +{ +public: + CamHelperImx678(); + uint32_t gainCode(double gain) const override; + double gain(uint32_t gainCode) const override; + +private: + /* + * Smallest difference between the frame length and integration time, + * in units of lines. + */ + static constexpr int frameIntegrationDiff = 4; +}; + +/* + * IMX678 driver currently doesn't expose a metadata stream, so we have to use + * the "unicam parser" which works by counting frames. + */ + +CamHelperImx678::CamHelperImx678() + : CamHelper({}, frameIntegrationDiff) +{ +} + +uint32_t CamHelperImx678::gainCode(double gain) const +{ + int code = 66.6667 * log10(gain); + return std::max(0, std::min(code, 0xf0)); +} + +double CamHelperImx678::gain(uint32_t gainCode) const +{ + return std::pow(10, 0.015 * gainCode); +} + +static CamHelper *create() +{ + return new CamHelperImx678(); +} + +static RegisterCamHelper reg("imx678", &create); diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build index 87b6a3600..eabd55dce 100644 --- a/src/ipa/rpi/cam_helper/meson.build +++ b/src/ipa/rpi/cam_helper/meson.build @@ -10,6 +10,7 @@ rpi_ipa_cam_helper_sources = files([ 'cam_helper_imx415.cpp', 'cam_helper_imx477.cpp', 'cam_helper_imx519.cpp', + 'cam_helper_imx678.cpp', 'cam_helper_imx708.cpp', 'cam_helper_ov64a40.cpp', 'cam_helper_ov7251.cpp',