From patchwork Thu Jul 1 11:34:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 12757 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 12F8BC3220 for ; Thu, 1 Jul 2021 11:34:52 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C253D684FA; Thu, 1 Jul 2021 13:34:51 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="Q9RMvj6J"; dkim-atps=neutral Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 79B3E684D7 for ; Thu, 1 Jul 2021 13:34:48 +0200 (CEST) Received: by mail-wr1-x435.google.com with SMTP id p8so7814556wrr.1 for ; Thu, 01 Jul 2021 04:34:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/YpVJmsa5egcjdYPoaMhnVTpbUvYaQTLQzwcDmDF1BE=; b=Q9RMvj6JZTKIdCEh5OcMrpW+3Cgsn04MbUMFSWUwLeJMShacMc0ihO/eyI/LVeGcmd 4NGt6azVUApbNHOVZE71hEQOPv6pMfvsHf8gmBRi+nDS0MLGmlhsbehh9uw6HhVdIhrh IlOgrRob/NbCPW3E+2wrC9zdUDmWIid7Cuvep53iJd/443PSRoRPE6W23PLo8bdqu47D xqfnI0qHR1JTPcHRNMnPJMuTUbRe/stFy0QUSB1yPG/lRA5AO2SsYoph1KloSllXbQmH qwmeUy3xabKST/luqH9KRAJm6GoOg+ykPxaA2UZjPenlJnd1ZKCGZkc493Aocd7GaTfn UOzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/YpVJmsa5egcjdYPoaMhnVTpbUvYaQTLQzwcDmDF1BE=; b=kA7nsEuKj+dNOdhWRDXleDeJIE4y3bUmSRAz+PLG4pz3NdYBMwZAS5IIUB1P4Hf7Ia MjMOnvuaxkNuiB7JZ56V1mmvoT/9Iw3Vl8Zfb1zH6j6qL3uJ1eTZ98Jff7k6UMG2VtGH N7Tkw+KxD/rc+0oSQmRqYDhSPIl7udKkTbZFIU9aUIwRi392DtY9jWxUxNNKl72rgw3x oQdj0+jZp7uMQrNt1IItPy5XdEEvyFUPDDtsM1/ZPiKmS3ziC/0XAKXZ5+rHl4fqj64y RJwSI+v98M8oAFlbSxHZCfmGD38B9PdFUSFNHP8nVZpdZus5WRmO+Nw4rwsgHQO27aHV yngg== X-Gm-Message-State: AOAM531GrHmI+cQjkxWTuRHhOyYFktieswN7U5A3CDRmjzZqtQaNsQ7G q6RMgPqN5/T58N8M32kW10+iHQE+bmjsRA== X-Google-Smtp-Source: ABdhPJxDD8nmRHN8drwdkmamR9lWyS5iN2L2uk65pY0e8vFZhZ1vHgU2sLBZtgB00r1OidvQW6i7Dg== X-Received: by 2002:adf:8b9c:: with SMTP id o28mr6969395wra.33.1625139288032; Thu, 01 Jul 2021 04:34:48 -0700 (PDT) Received: from naush-laptop.patuck.local ([88.97.76.4]) by smtp.gmail.com with ESMTPSA id f6sm8076495wrs.13.2021.07.01.04.34.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Jul 2021 04:34:47 -0700 (PDT) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Thu, 1 Jul 2021 12:34:40 +0100 Message-Id: <20210701113442.111718-3-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210701113442.111718-1-naush@raspberrypi.com> References: <20210701113442.111718-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/4] pipeline: raspberrypi: Use priority write for vblank when writing sensor ctrls 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" When directly writing controls to the sensor device, ensure that VBLANK is written ahead of and before the EXPOSURE control. This is the same priority write mechanism used in DelayedControls. Signed-off-by: Naushir Patuck Reviewed-by: David Plowman --- .../pipeline/raspberrypi/raspberrypi.cpp | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 082eb1ee1c23..53a30cff1864 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -154,6 +154,7 @@ public: void embeddedComplete(uint32_t bufferId); void setIspControls(const ControlList &controls); void setDelayedControls(const ControlList &controls); + void setSensorControls(ControlList &controls); /* bufferComplete signal handlers. */ void unicamBufferDequeue(FrameBuffer *buffer); @@ -828,7 +829,7 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls) /* Apply any gain/exposure settings that the IPA may have passed back. */ if (!startConfig.controls.empty()) - data->unicam_[Unicam::Image].dev()->setControls(&startConfig.controls); + data->setSensorControls(startConfig.controls); /* Configure the number of dropped frames required on startup. */ data->dropFrameCount_ = startConfig.dropFrameCount; @@ -1294,22 +1295,20 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config) return -EPIPE; } - if (!controls.empty()) - unicam_[Unicam::Image].dev()->setControls(&controls); - /* * Configure the H/V flip controls based on the combination of * the sensor and user transform. */ if (supportsFlips_) { - ControlList ctrls(unicam_[Unicam::Image].dev()->controls()); - ctrls.set(V4L2_CID_HFLIP, - static_cast(!!(rpiConfig->combinedTransform_ & Transform::HFlip))); - ctrls.set(V4L2_CID_VFLIP, - static_cast(!!(rpiConfig->combinedTransform_ & Transform::VFlip))); - unicam_[Unicam::Image].dev()->setControls(&ctrls); + controls.set(V4L2_CID_HFLIP, + static_cast(!!(rpiConfig->combinedTransform_ & Transform::HFlip))); + controls.set(V4L2_CID_VFLIP, + static_cast(!!(rpiConfig->combinedTransform_ & Transform::VFlip))); } + if (!controls.empty()) + setSensorControls(controls); + return 0; } @@ -1379,6 +1378,24 @@ void RPiCameraData::setDelayedControls(const ControlList &controls) handleState(); } +void RPiCameraData::setSensorControls(ControlList &controls) +{ + /* + * We need to ensure that if both VBLANK and EXPOSURE are present, the + * former must be written ahead of, and separately from EXPOSURE to avoid + * V4L2 rejecting the latter. This is identical to what DelayedControls + * does with the priority write flag. + */ + if (controls.contains(V4L2_CID_EXPOSURE) && controls.contains(V4L2_CID_VBLANK)) { + ControlList vblank_ctrl; + + vblank_ctrl.set(V4L2_CID_VBLANK, controls.get(V4L2_CID_VBLANK)); + unicam_[Unicam::Image].dev()->setControls(&vblank_ctrl); + } + + unicam_[Unicam::Image].dev()->setControls(&controls); +} + void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer) { RPi::Stream *stream = nullptr;