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 { From patchwork Fri Jul 31 15:15:35 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: John Cronin X-Patchwork-Id: 27530 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 E09E9BDE4C for ; Fri, 31 Jul 2026 15:15:39 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9CB0867FE3; Fri, 31 Jul 2026 17:15:39 +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="L1E4uWBH"; 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 B6F8867FD6 for ; Fri, 31 Jul 2026 17:15:37 +0200 (CEST) Received: by mail-yw1-x1130.google.com with SMTP id 00721157ae682-81ed2a06b9eso10828607b3.3 for ; Fri, 31 Jul 2026 08:15:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1785510936; cv=none; d=google.com; s=arc-20260327; b=bvz73+IEiBS6QV9j/P9wcMv4qkwIyTiI6X+q4yr5BZbpPO6sEBx+cYEk+87QmgKxhT xAZKPBaRs0wipj2DLT0sW7X7m8RAceiP3jeJPTsxpDI+N+0OTeAMqeAsiZDRytVHsMox iBmSgGK6VzgQNNA4rW9Yp0tE4RWs4bDNvJleB+51XWkl+vgM4wd81RQFgMg5s0sD5p4j Whd3HLunPQB7UYZzSIXUEBuCE7kOPIIWtHI55BYlFH0OANDHlfIbuS87dH7fi1AmVH6H +GcXEw/L9XeAqQbd5hiTXQslw3H3F5VFhWZIsaBR7sau9wzyo7Bhggt7efQP3ZBP2dhD WS8g== 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=Ll0IJqOox4aY4FBw/LoFz6iBk/U4YjIyU86tJZ+EH90=; fh=hN8mNPnxBXjCARLz6VoZGvcnfJs454t5dBv/gP0fGlc=; b=RqNs+dzrPX0RQ044JcKO1RuA7CSKt0v+0qP12JLRlp6jHG/5XugMLCrLPQf3sDHxH9 XjP2nMKMWhOwxEMuRlEhwAKk0b3Zp7QfUu0XeEs/xGV6QPesyZUNv79fn5fWjnPKFJIJ xpa0QgLzcpvzdWIzEA36sTCKhCOqubPwJfQ4b2ggcLpf7T/nR4a5fcPMAzEMK2qRYHgB XWRIuwdts7SHz51YCiuUtZ4/ANUH0W+mUyx/g/QGt/bx2YMWcVkKM7eXMuTPhQSkc0Gp kM9DaoKry0D00JqdJ0MMjtinPrcILV6mVJTvtaK2ReNJW6Dp0PyYxs489IoR33Des5U+ WsRA==; 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=1785510936; x=1786115736; 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=Ll0IJqOox4aY4FBw/LoFz6iBk/U4YjIyU86tJZ+EH90=; b=L1E4uWBHPeFMp8eY9lqoRpah+i6rLzXIWAt/+KOGx61mV/ORw39YlWZfirIIu2mraC Pqc5M+KHL/jDR/ZUi+5LredrqU7Od0uqYuy5izoDZJ0fHywrAGKAZbJlTb8O1eICbBjP Rl79MGW45OhemFCM39bSO9dLbEYHmaCdfXMXAqwLwVZUYj/xgLKUBRBEmfs29j8eBVzs LFDZO8mjWQztglHaC30NIkNV+k/BEP4r/YJOUvPmgnuoLDYYcMhIWKwM9DmLmLre5gkA Tdoi6pMk2Ueug8Oc2228XSwLIKBR3UCyFpHiWrfkJZk6pF7KDsbbjVLMZImCySwmmw+I d/4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785510936; x=1786115736; 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=Ll0IJqOox4aY4FBw/LoFz6iBk/U4YjIyU86tJZ+EH90=; b=VWYxCeTI2nBQXbmF16ah37i5W6AcbZTB4gG7lsU3xY2rHfl2QfEFW+/y+Ywkzzq57h TWJ8bmuoLRrwW5TvPRj4uWyyceoxCfRLrBf060wJq8ajl6LD/tBArQkrA3KYcyBROAj6 5ak/ljx3w0VsuA3rXOKmX4UlA6cwFEDnmI9AYpyQS5UzQMY4JlWo0FE0rmLoX75lF46j KLPJQ1lm5motjQATp91VTtHctkwtwxFilTprlMPGkULplMq+0Zz+bHfkb8Fb54X2/fXD IyEy4juS2i7dyVShXv0oIUyrt8Sy1qiccVrhP6zJWUIL4FNpa7IIRBERdEUKJVoIaU6n 3WXQ== X-Gm-Message-State: AOJu0YwXzGtQ60TQENQBNwgLSubtwFNJsowEE5/h1gJ/XxGXawL+pcs6 r+eDqkmPRatVh4bE4lUPZEXtJ9GK9NNa9KLd7C/EE3InPvDtladidIP90JHQxeQSrh9S3clvQtR RH7rC78zYNqRmveHwbD9JbTAjKR8LsjuSx1zyYO/4l1Ofn7QaseVmGNE= X-Gm-Gg: AR+sD10inEPZchRN6olUgy6XC6NgXfqfkHAnTFq8n109DYWBidwMhTU/pRSsPZKUA4A syfmuiBhzu0qoAW42LB+wdMF64Cb3wagztIAU9YVRXtHhSp45k9KaQUxqpRBfiPXi353PMn6q9T CZj4CYR+5rNoE9nUxY6iETLuh6r5fYBk2Qvay2zlciiXd1IIDWAa3D9HrNTM638xQyKzsSjSmvT JYbVjMLtm/Il7QbtXnzs0+fdp+4WiHf01w5xHnoB4WDWnwX3uhT2atlk/4pLL1gNj3xHXXnAv8Y SB0AoICn24ZnYwxPCGh5LdhDsaEiX9cCNsxYdXaOswRfj7ZDIVKSm7EgP+Tm6ufpN5nabNYgc/X D9JhrWWD8NHxaGb/tyZmw93kx2h8npwQ2MTtn1lrltTYa/n9iuOsbmDsn3aCT9f+flHjHkoEeyH w4CMRd7NIdrTVi5m7YhIiqiBnMU1TMLlXFSox2zzTIxqW8S4hmHExjoXavIkUEkHHv8w3CU5xHu 4FqigVH2z/yFN9XpazD6CsNud5EZ57H4ppXpM+jpA== X-Received: by 2002:a05:690c:968a:b0:81d:bc5:4624 with SMTP id 00721157ae682-81fd4b8c8ebmr2416537b3.25.1785510936555; Fri, 31 Jul 2026 08:15:36 -0700 (PDT) Received: from 313336824172 named unknown by gmailapi.google.com with HTTPREST; Fri, 31 Jul 2026 08:15:35 -0700 Received: from 313336824172 named unknown by gmailapi.google.com with HTTPREST; Fri, 31 Jul 2026 08:15:35 -0700 MIME-Version: 1.0 In-Reply-To: References: From: John Cronin Date: Fri, 31 Jul 2026 08:15:35 -0700 X-Gm-Features: AUfX_mx0isvVVZu00auv1sNFBXCOoPrRvAfGZPWGT5v3aV4--440F3Y91wcQ2PA Message-ID: Subject: [PATCH v4 2/2] libcamera: camera_sensor_properties: 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" Register static properties for Sony IMX471 so soft-ISP no longer warns about missing sensor properties. Unit cell size is ~1.4 µm (kernel active array 4656x3496). Test pattern modes match imx471_test_pattern_menu[] in drivers/media/i2c/imx471.c. Sensor control delays are left empty so libcamera uses its defaults until measured. Signed-off-by: John Cronin Reviewed-by: Jacopo Mondi --- src/libcamera/sensor/camera_sensor_properties.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) .testPatternModes = {}, diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp index fc9e184..4823462 100644 --- a/src/libcamera/sensor/camera_sensor_properties.cpp +++ b/src/libcamera/sensor/camera_sensor_properties.cpp @@ -297,6 +297,20 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen .hblankDelay = 2 }, } }, + { "imx471", { + /* ~1.4 µm pixels (nm); active array 4656x3496 in kernel. */ + .unitCellSize = { 1400, 1400 }, + /* Matches imx471_test_pattern_menu[] in drivers/media/i2c/imx471.c */ + .testPatternModes = { + { controls::draft::TestPatternModeOff, 0 }, + { controls::draft::TestPatternModeSolidColor, 1 }, + { controls::draft::TestPatternModeColorBars, 2 }, + { controls::draft::TestPatternModeColorBarsFadeToGray, 3 }, + { controls::draft::TestPatternModePn9, 4 }, + }, + /* Control delays not measured; use libcamera defaults. */ + .sensorDelays = { }, + } }, { "imx477", { .unitCellSize = { 1550, 1550 },