From patchwork Fri Jul 31 15:15:47 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: John Cronin X-Patchwork-Id: 27531 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 0A45BBDE4C for ; Fri, 31 Jul 2026 15:15:53 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id AB20067FDD; Fri, 31 Jul 2026 17:15:52 +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="wYE9Pnnt"; dkim-atps=neutral Received: from mail-yw1-x1130.google.com (mail-yw1-x1130.google.com [IPv6:2607:f8b0:4864:20::1130]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1A9EA67FD6 for ; Fri, 31 Jul 2026 17:15:51 +0200 (CEST) Received: by mail-yw1-x1130.google.com with SMTP id 00721157ae682-81f36179dd5so15372457b3.2 for ; Fri, 31 Jul 2026 08:15:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1785510950; cv=none; d=google.com; s=arc-20260327; b=P8kLz1MEgSfaq7PRY6vVNit2G3olOvHMrBiAPNNMFHhay6PBqr9hplsRGsC0UFbn/B hXvhVqbQACPY1eDtHa3WW7xlTMOFqzmWUyEZY+2tuNWlAG0s3AlUU16oiGxISFM5pLX2 bSMh8l5uP4eE6PjFEm+qjqZij2iSvA3n3sGUnjbMMEBzUKui8CUL9dssxAyUKu5NxjGZ Q5mnZmXmq3zoBkcBktWCTkJXwll4yU9UfEJ01QdKOEna+aVIhjR5jLQyMCtJLqJ3Rk9C 2Szu/3EpAgPrMuJu/rndUFzc0C3NOeAyaUK5ImhelCzCjqIZ5XI302hPrKZyOq2/ozfO Ak9A== 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=P3yoEcdeGmBg/V29K56JuO8/m29KqWa6+sXw4ueDDXA=; fh=hN8mNPnxBXjCARLz6VoZGvcnfJs454t5dBv/gP0fGlc=; b=WfxbCFJZUm+ZAY2zerkYCSLa2c+avJ4JnNpek8sYlZJpkeGVLwnVpfyesmrxFaQigy 6ssYLllMRuWIrgHGfNhRQCaLx73lub9tt9BG2GM8JKcn3scL58xEEd07nyYFISSdEbqB 3HscKVtII0/a+KD/Kmi94qEfpB8Ez762YbAmOdGDm0KLl94bYW8v9HQ+MEI9hyv33VZR ZlGNM59tfzGuzyW2VrxJQFz6KGxhTq8PPCROeB16tNYEJ6KMdj4AFiaC3T7N9WyQ9jWg SDuOEP+irtpRTo10BLvKJkbOjjFUBQxvDWjpb2UWhbt2eTK1O1NnjNou2ddSzAazLpU0 7SaQ==; 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=1785510950; x=1786115750; 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=P3yoEcdeGmBg/V29K56JuO8/m29KqWa6+sXw4ueDDXA=; b=wYE9PnntvxughsMH2MLDE6XR/jGfu+PA2p9l7BON7PSJi0p4/KOa0LSCESWz1IkCON Yh2uKxZIAQ5P8VOlLb1xO7sgyD7i3TVRSzz8HDBR8ZyFY0cY/jBjpoHDMqYxeoRuoXl/ hzeG4rfIU29slZa01J+Z+2aPnoL1ck4eSTW8qcMsLff5D7hg7vJ31jmWI3Jk1L1osBXt 7SXsxS/YpxBgPlLNJiQSB8dHo4S8+QXRAqCt9lmASzMsA7CTP+iQGkGXBZNgd0+QiAl3 1lcjUA786CXrROCbuO0T9CmkmUVJPRbRaQ6XHTzLUOsn6L5j1zo/4wqFV7LRLqpzpKtJ +v7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785510950; x=1786115750; 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=P3yoEcdeGmBg/V29K56JuO8/m29KqWa6+sXw4ueDDXA=; b=PiY8xe3cWiiPQl+iM/C08OPNopbhB3PoGKNR+leqMBm5Jckib2UWr288R5XTuww0q8 bFfFuQE5yW2/xT/i5fmcXawN2b6fHkwqpYneIew3PcjyLK2McFvzaI79DXP3wz2VyetT jLtakNLqIgmnq9xsj091e0sljeUJxQHH/EGZNWNe58aXem2jxX17hwCKiIKg1C5eX7hY GWwapSoUKBWdBg6V6OYQRIvGS770Duv27Gt5jdFEpREU0/mU7zCoIGof7pIMzMDSPQ+M DJJY8ooTaiL5IZS5vAaMnOhJuUcwEBuZ05jdzXdVoMAxA7tKOFaOB4bZN8SSOjewW5Ty nJ2w== X-Gm-Message-State: AOJu0YwuBrmIlGeN7lFdrhGIUhrbB1PsDnceO+3nzqouuWxYdZr4Llm/ pJSHhSAHvQIfVkJ8E02d2dpZ7SEweW1CRRKwLpgeHiSdLpdmzhxvqaGiJCEERQm6f3ngO1fvShE 9HUaAFqLanxVNZvlIiJ7NFzqf2JpFo9f5Ra2ddIO0cNS+j2pU11ik1OY= X-Gm-Gg: AR+sD13/tLlSSh7z2ELGpKGBVmN946KJri12xvorZ+cRJd7ofXHcZLMXFhWc9YQNLMm GcLJuMdFnBP4v4rn5VCxj/yF+iS9fN1GuSoFRBAqyipkXGTnDKv7h57Ns+9+mAE0KK6drobmWAi IjiuJpxCDwgTn5furDOD73k4Awzzm8AS/m94oKhm/iIY5N3xFLd4VXnOC2B7SXvYOdq2jFzD9s+ 6/kMLpX+RdYscyfyRWxWpHB+wSsfKyav+JgPQbHfrq7HIViwGlExrkD3pTcPYBzICH/MQU5K0tY l/2nKI/81Wej2RX7kYYUMfB6JCw0ZZAzvXquElSCrOJNSjevbu/fHb0JhZ9DLNnEvvcPUngJeBx +cydgnkabkyIAduAVvDMN6eXmRy8OBef0Rf/XnMmjpXz2NMWpOUraKup1Cm3wPWAudp/73/UlDv tIp1Fn/zxvZGId9zQxAOToLGwG7kykfjKA1TvVCyKTDZgO6ohfGp8ZEnX+r7prNffnq//aWq88N XtRO+FVH2dWHNmoNYAkscrknFv2G0YPCSRkt0H1aw== X-Received: by 2002:a05:690c:6885:b0:7cf:d242:d94a with SMTP id 00721157ae682-81fd4bd0126mr2343417b3.25.1785510948447; Fri, 31 Jul 2026 08:15:48 -0700 (PDT) Received: from 313336824172 named unknown by gmailapi.google.com with HTTPREST; Fri, 31 Jul 2026 08:15:47 -0700 Received: from 313336824172 named unknown by gmailapi.google.com with HTTPREST; Fri, 31 Jul 2026 08:15:47 -0700 MIME-Version: 1.0 In-Reply-To: References: From: John Cronin Date: Fri, 31 Jul 2026 08:15:47 -0700 X-Gm-Features: AUfX_myy8V3kTbfcsSXXJc7tOtRjpnk8XlCAiltpCn7ShWWYZ5ZmwdaiO-tMRy0 Message-ID: Subject: [PATCH v4 1/2] libipa: camera_sensor_helper: Add imx471 To: libcamera-devel@lists.libcamera.org Cc: jacopo.mondi@ideasonboard.com, 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 / X1 Carbon Gen14 and related IPU7 platforms. The kernel imx471 driver writes V4L2_CID_ANALOGUE_GAIN codes 0..800 directly to register 0x0204. Analogue gain model (measured on ThinkPad X9-15 Gen 1, Fedora 44, kernel 7.1.5): fixed-exposure raw Bayer means track G = 1024 / (1024 - code) within ~1.5% over codes 0..800 (best-fit k≈1023 for G=k/(k-code)). Code 800 implies ~4.57x; that is the driver's V4L2 max under this model, not a full-scale datasheet claim. Other IMX helpers using the same formula expose higher max codes (e.g. imx355 960 → ~16x). Black level measured ~64 DN at 10-bit on min exposure/gain raw frames (mean ≈ 64.1, p50 = 64) → 4096 at 16-bit. Soft-ISP loads without "Failed to create camera sensor helper for imx471". Signed-off-by: John Cronin --- src/ipa/libipa/camera_sensor_helper.cpp | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) public: diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index cc16e25..31d8169 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -644,6 +644,35 @@ class CameraSensorHelperImx462 : public CameraSensorHelperImx290 }; REGISTER_CAMERA_SENSOR_HELPER("imx462", CameraSensorHelperImx462) +class CameraSensorHelperImx471 : public CameraSensorHelper +{ +public: + CameraSensorHelperImx471() + { + /* + * Sony IMX471 (IPU7 platforms: ThinkPad X9 / X1 Carbon Gen14, + * ACPI SONY471A). + * + * Kernel imx471 writes V4L2_CID_ANALOGUE_GAIN directly to + * register 0x0204 with range 0..800 (IMX471_ANA_GAIN_MIN/MAX). + * + * Analogue gain model (measured on ThinkPad X9-15 Gen 1): + * G = 1024 / (1024 - code) + * Fixed exposure raw Bayer means (black-subtracted) track this + * model within ~1.5% over codes 0..800 (best-fit k≈1023 for + * G=k/(k-code)). Code 800 → ~4.57x is the driver max, not a + * datasheet "full range" claim; other IMX helpers with the same + * formula use higher max codes (e.g. imx355 code 960 → ~16x). + * + * Black level: measured ~64 DN at 10-bit on min exposure/gain + * raw frames (mean≈64.1, p50=64) → 4096 at 16-bit. + */ + blackLevel_ = 4096; + gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 }; + } +}; +REGISTER_CAMERA_SENSOR_HELPER("imx471", CameraSensorHelperImx471) + class CameraSensorHelperImx477 : public CameraSensorHelper {