From patchwork Wed Jul 29 14:41:37 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: John Cronin X-Patchwork-Id: 27520 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 EE5B0C3264 for ; Wed, 29 Jul 2026 14:41:42 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4E66667FB1; Wed, 29 Jul 2026 16:41:41 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=stromback-com.20251104.gappssmtp.com header.i=@stromback-com.20251104.gappssmtp.com header.b="JQAygkIp"; dkim-atps=neutral Received: from mail-yw1-x1132.google.com (mail-yw1-x1132.google.com [IPv6:2607:f8b0:4864:20::1132]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3E82067FA9 for ; Wed, 29 Jul 2026 16:41:39 +0200 (CEST) Received: by mail-yw1-x1132.google.com with SMTP id 00721157ae682-81e86df8987so15802237b3.3 for ; Wed, 29 Jul 2026 07:41:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1785336098; cv=none; d=google.com; s=arc-20260327; b=WlFG14Gf+L84JLqM4NFbLcSG9lFdxD/p6y1aNuHuqa5DGIZPi6A/UzIn+KNmK1Bv4K G7RGQiZnsvBspPn1w50DT11PVqp7G3h5r0ZYhAlVzeg3MfE1UCM11DtdF+nAxJHfdcHi desrAxlALtWSxnQPJub7suUVCPG2tqItsAXbtM7+sFy9t1F+/D3V3Ww6MRF9LOr1lOQi jey9b0MebhBkZp1zvEPERwoQ11LATF9PSyUEYwSeKDlj9itBJ5sT7sV3i8v/YNG4K687 uRvdBFPA5m+7r+3LhlhR89xCmYWea/fyCMnnP3daOz8hbIznturQWbiVU1L6Rm4IfYw2 1NLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature; bh=0qchJ7hl2sq9H3+e+u2TkEOXVmXbvixmz0pZNbM+7jI=; fh=8fmqAynsXLJdjJ4QlnoP1T39WQbBLOq6I+TqiUNWVms=; b=p6g48CCizsHCI9dS0kdhyi7NSIbaRefkY8ZmFOH5kvph0bun07Ca8pye9Kcx5RZ/rF QmDnKIo7sAAgxIsUqWSrhhnB7HlVeyM4VBCxj+kMb+hLMJ94cBSafXPit3geEoK1xYGl N59W8TMLNQG5qRusxubySV9sCmLAfGY6rJLDja+g/TTVaHM6jnlP03INtE50IMltBIF0 8840+XhUmoPJrlAs7YpqDebT9AfooFFFqJxQCd5/geB91Soy2zeiDB59ITGz4FPHxO3W PfFT8H7sl12WBy+YcbEG1UR5+RoivuZGUL10htUYZI50am3MJ3VslmuAHVZd6I16Hm8q CVkw==; darn=lists.libcamera.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stromback-com.20251104.gappssmtp.com; s=20251104; t=1785336098; x=1785940898; darn=lists.libcamera.org; h=content-transfer-encoding:content-type:cc:to:subject:message-id :date:from:references:in-reply-to:mime-version:from:to:cc:subject :date:message-id:reply-to:content-type; bh=0qchJ7hl2sq9H3+e+u2TkEOXVmXbvixmz0pZNbM+7jI=; b=JQAygkIpmX6tRX/5rIHf2h4VTT1y2zh11hnwuD4pRHeJbmKk8HF67KdI7fFYfNxXAU Ouyi8zFWC4rtb9HbRpzBkVsLCakLaJ4hII/tpyFYku9SfBqnhT9zJFSJDmnf76ij6+zk c31TK8Efc+VMZVx1qeFnhjwiKdVGjNKHaCmmTthk0qkQv7a2bHI9YxqiuHWdDzbUwzOL l9aktk6RGauXD9Xo58a1AG7itphjf8cewwYzstuFc4vzBA2qfgQ01ObpDIABcNy1y73t M6+4Gd0CdOu4SdJK+dVFj0FIly+bPgYVlG75dkLNvCzBnttYVftJ+Lf8R1/5M6J46W7C +dtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785336098; x=1785940898; h=content-transfer-encoding:content-type:cc:to:subject:message-id :date:from:references:in-reply-to:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=0qchJ7hl2sq9H3+e+u2TkEOXVmXbvixmz0pZNbM+7jI=; b=VklxM7wR+SkWaIMgjKVO8W20cSZC7qM78acO5JbkQV0HbkDSVJPyPAGOWnH0lgwsrN aqCuU0ti0+36CJAuYLezswjAzAX6o14CM/jOcCcW/NwmBIdAJzgI0rZEzo5ufPJRYz2g F7bZMbi2wYSn1gPsudDTnUVdAdGzw9QliVlqX9nrMzSgaAzODRUINs2vd0u1oCZg9Ysg iJTGP88v/VBbvHFBEvEEm6L4bjW6cYKK9Z4eSaL5JpAROaCZI9dPTzG/FRCvQzoDZAW4 qTnwSrSlcEBYnBcpjyxji1hVN0g3j+Z2BvMoJaVhVTflDsrPwi5FO5ceDoNrBpMBzL6V uSmw== X-Gm-Message-State: AOJu0YxSZ0Sj0MK5p3cNNys3TJPKq3kWiXnVwrFrW0UdoAInOa0V+tve i57/KMsw6VY3QWAOyWeHbHWYe9IEPDKW3iV5bZ6o043tkVdO4aQTerxQWOCWIdshr69mOK8ckSr RgzTNlrHRYPS+uDk4gIS4eRaKqIOLGaCqRn2+rMo59xCjy4Oi4OKXeCs= X-Gm-Gg: AR+sD10yjY58xxr91co2EPcGxz5FhvoHEpYU2DB6EnkNT29qlsrHMrJvw7MVRsR2sPz NzQrQCJqXogsadR7QDAGhHeI9hogKjl75DXby014TNMIfvOnCnQHmQJ3WuGqksUMsO57bv/zVKA wm0uXG+BZlyPyGawhQxF25G99gBnhQxkC1ElsaMnVOOsoFfs4qIlaQ/Yfehqb/Y6PuS+IYRTivH +doCocT8XImEhrCXwrIS/YwWOn9vWZE0E4PR4SGLRgLCSG3i4kUM5xZ5PvX6ca6EtXYCe3Yn2l+ GZs4CsgfD01uEeJyIhb7wEBHcFlpB5dKf7oIGvegVIJKHTAqsYFevH/3zvPOYBRPtHzzfXSiEbr brllGwg/6OyXJ59z39EklB4sHP/HqNMyLf9mkdXcWvL8k3xNXQ44UzcrRBGXK8rAHIOcPe+KQKC bqPq5vwQBy1pWL3iI6qpOdIzjCvfGvsqRbXRi4S4fI4rYB3E/UskC1frx+XveF6XMczasWC70bP M8RQI9R6rIlktbqI0pNeOB1aC8n3cOMg0eW2xRS6Q== X-Received: by 2002:a05:690c:3389:b0:81e:a3d3:9b0f with SMTP id 00721157ae682-81f991dbb4bmr38772197b3.15.1785336097732; Wed, 29 Jul 2026 07:41:37 -0700 (PDT) Received: from 313336824172 named unknown by gmailapi.google.com with HTTPREST; Wed, 29 Jul 2026 10:41:37 -0400 Received: from 313336824172 named unknown by gmailapi.google.com with HTTPREST; Wed, 29 Jul 2026 10:41:37 -0400 MIME-Version: 1.0 In-Reply-To: <178532114379.1788834.11075609312135567537@ping.linuxembedded.co.uk> References: <178532114379.1788834.11075609312135567537@ping.linuxembedded.co.uk> From: John Cronin Date: Wed, 29 Jul 2026 10:41:37 -0400 X-Gm-Features: AUfX_mzBXLdWeU_cTY6N1RvxL7ZbeirGyg6qL_dVVUlUuni0sA1o1LGBPaaj-bk Message-ID: Subject: [PATCH] libipa: camera_sensor_helper: Add imx471 To: libcamera-devel@lists.libcamera.org Cc: kieran.bingham@ideasonboard.com 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 CameraSensorHelper for Sony IMX471 (SONY471A), used on Lenovo ThinkPad X9-15 and related IPU7 platforms. The kernel imx471 driver programs analogue gain code 0..800 into register 0x0204. Use the common Sony linear model G = 1024/(1024-code) (matching imx355/imx477/imx708) and a 10-bit pedestal of 64 (4096 at 16-bit). Also register static sensor properties so soft-ISP AGC no longer warns about missing delays/properties for this model. Tested on Fedora 44 / ThinkPad X9-15 Gen 1 (kernel 7.1.5, imx471 bound via IPU7 ISYS). Soft-ISP loads without "Failed to create camera sensor helper for imx471"; AGC reports gain range 1.0-4.57x and adjusts exposure under capture. Signed-off-by: John Cronin Tested-by: John Cronin --- src/ipa/libipa/camera_sensor_helper.cpp | 24 +++++++++++++++++++ .../sensor/camera_sensor_properties.cpp | 17 +++++++++++++ 2 files changed, 41 insertions(+) .testPatternModes = {}, diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libcamera/ipa/libipa/camera_sensor_helper.cpp index cc16e25..5fb545a 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -644,6 +644,30 @@ class CameraSensorHelperImx462 : public CameraSensorHelperImx290 }; REGISTER_CAMERA_SENSOR_HELPER("imx462", CameraSensorHelperImx462) +class CameraSensorHelperImx471 : public CameraSensorHelper +{ +public: + CameraSensorHelperImx471() + { + /* + * Sony IMX471 (IPU7 / ThinkPad X9, X1 Carbon Gen14). + * + * Analogue gain is programmed via V4L2_CID_ANALOGUE_GAIN to + * register 0x0204. The kernel driver (imx471) exposes range + * 0..800 and writes the code directly. + * + * Sony linear gain model used by several IMX sensors: + * G = 1024 / (1024 - code) + * so code 0 → 1.0x and code 800 → ~4.57x. + * + * 10-bit optical black pedestal is typically 64 → 4096 at 16-bit. + */ + blackLevel_ = 4096; + gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 }; + } +}; +REGISTER_CAMERA_SENSOR_HELPER("imx471", CameraSensorHelperImx471) + class CameraSensorHelperImx477 : public CameraSensorHelper { public: diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp index fc9e184..7ba55dc 100644 --- a/src/libcamera/sensor/camera_sensor_properties.cpp +++ b/src/libcamera/sensor/camera_sensor_properties.cpp @@ -297,6 +297,23 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen .hblankDelay = 2 }, } }, + { "imx471", { + /* 1/2.3-type; ~1.4 µm pixels (nm). Delays unverified. */ + .unitCellSize = { 1400, 1400 }, + .testPatternModes = { + { controls::draft::TestPatternModeOff, 0 }, + { controls::draft::TestPatternModeSolidColor, 1 }, + { controls::draft::TestPatternModeColorBars, 2 }, + { controls::draft::TestPatternModeColorBarsFadeToGray, 3 }, + { controls::draft::TestPatternModePn9, 4 }, + }, + .sensorDelays = { + .exposureDelay = 2, + .gainDelay = 2, + .vblankDelay = 2, + .hblankDelay = 2 + }, + } }, { "imx477", { .unitCellSize = { 1550, 1550 },