From patchwork Fri Mar 24 14:29:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Semkowicz X-Patchwork-Id: 18452 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 06385C32A0 for ; Fri, 24 Mar 2023 14:29:38 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9563162750; Fri, 24 Mar 2023 15:29:38 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1679668178; bh=ep3Vg6jIAMY8T9rW1GuAOePig6yWoEtEUB3rcWDKES0=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=BQw+gCbwBzRFc8JU3nkHhe2jTyZR5BtzJhaUBSGAxIq/gx/GcsSzCNYZybqs9YRJM 3mRKZpxmROT3hltOPkfubmWL2DIsOtNQMCxVIE1g7m0zqHLIlsP/500eUhoBenkvLX qB69XipdsvKNkhPdJdIzls5Cvp82cP9SSBibfZRIuMenx7bZiX4s/nNL12aGAED0Fo HkgKiMRU2dGLiqjTzIr9kO2i3DlJ78BRvr0VCESZYVkvRYjmS+Fm5LkFo/SX7bkQzf VS9yV19TgBv3sEKwwEDrcgPZRVotelEQtNwifLBRWQ9fwDGOUYdnuNQC58VAorMhlN FANOPeA1WQ+/Q== Received: from mail-lj1-x231.google.com (mail-lj1-x231.google.com [IPv6:2a00:1450:4864:20::231]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A41F36270E for ; Fri, 24 Mar 2023 15:29:29 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=thaumatec-com.20210112.gappssmtp.com header.i=@thaumatec-com.20210112.gappssmtp.com header.b="tj91w3S6"; dkim-atps=neutral Received: by mail-lj1-x231.google.com with SMTP id q14so1895965ljm.11 for ; Fri, 24 Mar 2023 07:29:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=thaumatec-com.20210112.gappssmtp.com; s=20210112; t=1679668169; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=pCKH6OcTTdDeYB8O+3cUHp8U7UiJ/Ef5VKZA4e1pH+Y=; b=tj91w3S6LTlldMfy41yvl7qEFVmSvmqNu9s4gkheCqVQ8aZRGTDlKfkZd3NOtUQiqZ NRHz+T7Vqp5jjakAaeXnGclHMxjBMT5+An5hGo+wMm4wiiYsfDIR16WJprA00PM+gus7 l+dMbj5W9ODUDa4J4q3lJB0bgocuiplEir8xGDbBpEljVvoHxyTRCKnXZtaTs0Wxn10i Bzwe+nSmxOF+HuwxGTWBQfJMpY4GVG+2CMTSyLSB+exYgPouc+8h8gOIVjY3a1KJvmKS WiidWRQcxCK0e6eNjdCVb18CoRByJxzEcvXcJwWAT5kQcLrPYP3p0tm+9HJ308N0AMlX rdYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679668169; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pCKH6OcTTdDeYB8O+3cUHp8U7UiJ/Ef5VKZA4e1pH+Y=; b=0yDd3vLs5KF8+80ODEIRviKyZ2/Y9KnMbET0KTxyryptOlF1joU9pKbKJmLhCWg4sM xvN4MnQeT57JOT2bvsVAswjF+hidHz0Bb43XUOJcuWx4XfyQ+VrOiZo8QImERJDrP+ii +0SZbrDBEKqxpPKGsnhdvF3qHZltHArfXuMtKSakKw5qdj7OPKciNwNP1mqy9NJcIbzI /EsplLdIIDOj6fc4eqXtVVoK/YTyBWbu5uVGCKpAAImD4uAatzYvJtVIihwxIXXoReOm tYn21P1oJ8zmWsa///M3GncaXY2vMNpZ/WkYvHUr1Z7krXjEP2xilbDHACxVnVLo8kuI hnHg== X-Gm-Message-State: AAQBX9ekaq+opjPeCaSf+UH0A4Vx3RRpZDGeN16bcjlM6B9cw4TIgV7N xMVEJkib8qEyZ5FzCNSpyvBRR1VzOjz1Ry3xtOs= X-Google-Smtp-Source: AKy350blIjx8nlvcw1L4pw2tawbyH0/N45S+taDTjhb98KTrFzxmnzFTL3Nn1iHqq/2QOiSoupZ0hw== X-Received: by 2002:a2e:9402:0:b0:29a:6325:6412 with SMTP id i2-20020a2e9402000000b0029a63256412mr886962ljh.47.1679668168940; Fri, 24 Mar 2023 07:29:28 -0700 (PDT) Received: from localhost.localdomain ([91.90.166.178]) by smtp.gmail.com with ESMTPSA id j21-20020a2e8515000000b002a10b2ea089sm981714lji.16.2023.03.24.07.29.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Mar 2023 07:29:28 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Fri, 24 Mar 2023 15:29:07 +0100 Message-Id: <20230324142908.64224-10-dse@thaumatec.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230324142908.64224-1-dse@thaumatec.com> References: <20230324142908.64224-1-dse@thaumatec.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v5 09/10] rkisp1: Control camera lens position from IPA 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: , X-Patchwork-Original-From: Daniel Semkowicz via libcamera-devel From: Daniel Semkowicz Reply-To: Daniel Semkowicz Cc: jacopo.mondi@ideasonboard.com Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Allow control of lens position from the IPA, by setting corresponding af fields in the IPAFrameContext structure. Controls are then passed to the pipeline handler, which sets the lens position in CameraLens. Signed-off-by: Daniel Semkowicz Reviewed-by: Jacopo Mondi --- include/libcamera/ipa/rkisp1.mojom | 1 + src/ipa/rkisp1/rkisp1.cpp | 8 ++++++++ src/libcamera/pipeline/rkisp1/rkisp1.cpp | 13 +++++++++++++ 3 files changed, 22 insertions(+) diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom index bf6e9141..c3ed87aa 100644 --- a/include/libcamera/ipa/rkisp1.mojom +++ b/include/libcamera/ipa/rkisp1.mojom @@ -39,5 +39,6 @@ interface IPARkISP1Interface { interface IPARkISP1EventInterface { paramsBufferReady(uint32 frame); setSensorControls(uint32 frame, libcamera.ControlList sensorControls); + setLensControls(libcamera.ControlList lensControls); metadataReady(uint32 frame, libcamera.ControlList metadata); }; diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp index 4b30844f..4aef2e30 100644 --- a/src/ipa/rkisp1/rkisp1.cpp +++ b/src/ipa/rkisp1/rkisp1.cpp @@ -469,6 +469,14 @@ void IPARkISP1::setControls(unsigned int frame) ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast(gain)); setSensorControls.emit(frame, ctrls); + + if (lensControls_ && context_.activeState.af.applyLensCtrls) { + context_.activeState.af.applyLensCtrls = false; + ControlList lensCtrls(*lensControls_); + lensCtrls.set(V4L2_CID_FOCUS_ABSOLUTE, + context_.activeState.af.lensPosition); + setLensControls.emit(lensCtrls); + } } } /* namespace ipa::rkisp1 */ diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 83fb6287..b6eef541 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -114,6 +114,7 @@ private: void paramFilled(unsigned int frame); void setSensorControls(unsigned int frame, const ControlList &sensorControls); + void setLensControls(const ControlList &lensControls); void metadataReady(unsigned int frame, const ControlList &metadata); }; @@ -340,6 +341,8 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision) return -ENOENT; ipa_->setSensorControls.connect(this, &RkISP1CameraData::setSensorControls); + if (sensor_->focusLens()) + ipa_->setLensControls.connect(this, &RkISP1CameraData::setLensControls); ipa_->paramsBufferReady.connect(this, &RkISP1CameraData::paramFilled); ipa_->metadataReady.connect(this, &RkISP1CameraData::metadataReady); @@ -403,6 +406,16 @@ void RkISP1CameraData::setSensorControls([[maybe_unused]] unsigned int frame, delayedCtrls_->push(sensorControls); } +void RkISP1CameraData::setLensControls(const ControlList &lensControls) +{ + CameraLens *focusLens = sensor_->focusLens(); + + for (auto const &[id, value] : lensControls) { + if (id == V4L2_CID_FOCUS_ABSOLUTE) + focusLens->setFocusPosition(value.get()); + } +} + void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata) { RkISP1FrameInfo *info = frameInfo_.find(frame);