From patchwork Sun Jan 31 18:17:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 11075 X-Patchwork-Delegate: laurent.pinchart@ideasonboard.com 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 52BADBD808 for ; Sun, 31 Jan 2021 18:17:52 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7E298683D9; Sun, 31 Jan 2021 19:17:51 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="G+4r1oL1"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 968D5683D0 for ; Sun, 31 Jan 2021 19:17:47 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 38F9C8A0 for ; Sun, 31 Jan 2021 19:17:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1612117067; bh=dcJwG2XpfNR/G2aAvoQAU0d4wh+95hkGxA1ahstmEqw=; h=From:To:Subject:Date:In-Reply-To:References:From; b=G+4r1oL1gaRk7g5PwUj7pvYkLXOh/GBDymHH9bTCFb9fvObTcL2RtS5ffT0dnKjqk wnVoBnvBywFDFbOk671CVLFHn1hW/c7kqkyJ0AJLcLdQAuMTirU0+MqLNCxaCYoGYN x/NECPL7UAL41jgs+PUUPNt14GYxdsOH/42tcGNg= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sun, 31 Jan 2021 20:17:22 +0200 Message-Id: <20210131181722.5410-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20210131181722.5410-1-laurent.pinchart@ideasonboard.com> References: <20210131181722.5410-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/3] libcamera: camera_sensor: Check control availability from idmap 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" The presence of mandatory and optional controls is checked in CameraSensor::validateSensorDriver() by trying to retrieve them. This cases an error message to be printed in the V4L2Device class if an optional control isn't present, while this isn't an error. To fix this, use the control idmap reported by the V4L2Device to check for control availability. The function can now print the whole list of missing controls, making debugging easier. Signed-off-by: Laurent Pinchart Reviewed-by: Jacopo Mondi --- src/libcamera/camera_sensor.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index 10713d3a0c29..85813befbf58 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -250,14 +250,18 @@ int CameraSensor::validateSensorDriver() * Optional controls are used to register optional sensor properties. If * not present, some values will be defaulted. */ - const std::vector optionalControls{ + static constexpr uint32_t optionalControls[] = { V4L2_CID_CAMERA_ORIENTATION, V4L2_CID_CAMERA_SENSOR_ROTATION, }; - ControlList ctrls = subdev_->getControls(optionalControls); - if (ctrls.empty()) - LOG(CameraSensor, Debug) << "Optional V4L2 controls not supported"; + const ControlIdMap &controls = subdev_->controls().idmap(); + for (uint32_t ctrl : optionalControls) { + if (!controls.count(ctrl)) + LOG(CameraSensor, Debug) + << "Optional V4L2 control " << utils::hex(ctrl) + << " not supported"; + } /* * Make sure the required selection targets are supported. @@ -312,21 +316,28 @@ int CameraSensor::validateSensorDriver() * For raw sensors, make sure the sensor driver supports the controls * required by the CameraSensor class. */ - const std::vector mandatoryControls{ + static constexpr uint32_t mandatoryControls[] = { V4L2_CID_EXPOSURE, V4L2_CID_HBLANK, V4L2_CID_PIXEL_RATE, }; - ctrls = subdev_->getControls(mandatoryControls); - if (ctrls.empty()) { - LOG(CameraSensor, Error) - << "Mandatory V4L2 controls not available"; + err = 0; + for (uint32_t ctrl : mandatoryControls) { + if (!controls.count(ctrl)) { + LOG(CameraSensor, Error) + << "Mandatory V4L2 control " << utils::hex(ctrl) + << " not available"; + err = -EINVAL; + } + } + + if (err) { LOG(CameraSensor, Error) << "The sensor kernel driver needs to be fixed"; LOG(CameraSensor, Error) << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information"; - return -EINVAL; + return err; } return 0;