From patchwork Wed Jul 7 09:48:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 12850 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 6D27BC3226 for ; Wed, 7 Jul 2021 09:48:25 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2483068539; Wed, 7 Jul 2021 11:48:25 +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="obSaFO+G"; dkim-atps=neutral Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2038168516 for ; Wed, 7 Jul 2021 11:48:22 +0200 (CEST) Received: by mail-wm1-x335.google.com with SMTP id n33so1419262wms.1 for ; Wed, 07 Jul 2021 02:48:22 -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=obSaFO+GsG/MZuEPQjlXN32iuOEEN9lzgWZNhbLoMImHwUP6kth1HWUSBnmvrQUydH WAKVMnWLbJ2MGDWImNy422KWCiD13+xzRiLrVJZPSlApNuvDO/+Fy17WPOMU/jAY+UW6 Dgc+MrttrTml8nwaZqKOV1n2PIC80VwIuv+MVuLAMPqfdD/BiOvGmsUFn5wIIJdcZLoz 00lgpl3VUOO4DhFLJbJJ6H8MnAIEgfxq5TBagyOOx+QtzhW5XiSfcjZdWRqZKWjwQOCc wjaccpBhCQ3abRZGMHcW7Uc7DHpo8MAbJkgc3cOhVT6+zs7Z1KTRtUOAcUPwH4L5GMKf eABA== 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=KNTwBOlQebkCVbwyGrXI721RjlYZ01vrC5teI3d4wOLH2/K166ZUNtoY5z/1H40YfE yxgfSMNCvzeZ/nksrAaMHfhbCaRGZoe6BZqImLAGujwD6u7csbAm9XFhk5IPrbm0EBiM OKmy3lEyFL3ux8h8HED/yYl2nrnCPxdZRDyiNEJboYuNZZ+rNvfuQTttks6fv4ijPoQ+ uJNtW67Yi2wGhzSSIctPSN06IOcKhjKyXnSyrG2+0PYFDVxmW+0hwmGHgQM10TqjuTp0 wgUJa8udopK54BekiE0c34OcXDrfRbMlW7d0fRNo3615peMNMav79WqG0Vbjz8GmRfve 7q9A== X-Gm-Message-State: AOAM532q4XW+L/oLa8mk1kd+Qw2usHVHWP5HleTqBVRiJQyBtduQZ25p /wQeWyAX/04gDQmPEJF+IfDak10JaBi7Bg== X-Google-Smtp-Source: ABdhPJzfpdo0thMBQtixTa0tZ5puuRXhcfnJAw2MImvusbXNqeVFNTHacOwMfvp4+r053DYtOqPfcw== X-Received: by 2002:a05:600c:1c8f:: with SMTP id k15mr25895370wms.91.1625651301716; Wed, 07 Jul 2021 02:48:21 -0700 (PDT) Received: from naush-laptop.pitowers.org ([2a00:1098:3142:14:f800:302e:bf7e:a06b]) by smtp.gmail.com with ESMTPSA id r16sm23377836wrx.63.2021.07.07.02.48.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jul 2021 02:48:21 -0700 (PDT) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Wed, 7 Jul 2021 10:48:13 +0100 Message-Id: <20210707094815.1500917-7-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210707094815.1500917-1-naush@raspberrypi.com> References: <20210707094815.1500917-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 6/8] 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;