Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp2306577rwl; Thu, 6 Apr 2023 08:27:44 -0700 (PDT) X-Google-Smtp-Source: AKy350bjaV3D78qSYmBM2MGOwLdU8ovdCBkFnoL5+jKmNdEDOHfs+BceELkxH5Qq/bIlQtrD34eA X-Received: by 2002:a17:903:2283:b0:1a1:ad5e:bdbb with SMTP id b3-20020a170903228300b001a1ad5ebdbbmr11929137plh.36.1680794864581; Thu, 06 Apr 2023 08:27:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680794864; cv=none; d=google.com; s=arc-20160816; b=Bm4vEWVETx8gOp2F56dYsQWQqR3ub5orw7QtJeK0t8hItT9jh8YBgswFWpDZ27Ri1c JiHfzZZ4LcwCbQD4iufuFpfvjVFHQxyr73O7xR9CcOUCN7NXnAhahYEzt3zaFMLUytHG w+rm+VfKMO6mkvrKLVSN8IL7dJpFLzHjCnrbLnFFaP7ZYRSTwD2K3bncnlbYH42RTEUK nyWeVowTOCaCKf778aAGkCJgZBAjMb7sE4o7aQkaSgsZzxe/gcDxZskZ9OfOGzu1w9zw Zvk7HbGJBexBMaTs+ZAedKVwd8t1vuoHv+d4mTvxLEn/n+mYYALyDEeXlHd6ybedD5f+ +1MA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=Dg6TNa2vuEo6vYvQjhHJtmhbqHNEPTWF/K/ZgZoahhs=; b=tee46VGfo/s+Y9GXJNghuA8Rv7s2SAMxFbNea8Tmk/Cz04e11lXS2M0QLAMUllzFHZ W3dWCOkjKDTRWbRNOHhWRntYSviNMF6GJrzAPwchZA6rh5XSH/vBJ7qG7TVeutWg8qMP 6AZg8BWgDwrZoQv6YGMg13xBlOu44LtjBwHNWPdNTxr+2pJGfYbflZW0nC95yB0clID4 ir6XnkEianH2fOsGWATdLhbzTkCy8rjeW0iy4zWx5UiLhTVUwvnAB2B59KQ4W/l+1clC /HnohB1COrFaBBlljSYC3IG4R3LxaIsVS/vG/0bSdrMxp7KXF3+L63lW6ZLgi2pnj68X V2CA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@raspberrypi.com header.s=google header.b=NJAZS8c1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=raspberrypi.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z12-20020a170902708c00b001a0644d1e7esi1874700plk.101.2023.04.06.08.27.32; Thu, 06 Apr 2023 08:27:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@raspberrypi.com header.s=google header.b=NJAZS8c1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=raspberrypi.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239704AbjDFPRI (ORCPT + 99 others); Thu, 6 Apr 2023 11:17:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44778 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238411AbjDFPRH (ORCPT ); Thu, 6 Apr 2023 11:17:07 -0400 Received: from mail-ua1-x92c.google.com (mail-ua1-x92c.google.com [IPv6:2607:f8b0:4864:20::92c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3E3198685 for ; Thu, 6 Apr 2023 08:16:59 -0700 (PDT) Received: by mail-ua1-x92c.google.com with SMTP id i3so437521uag.12 for ; Thu, 06 Apr 2023 08:16:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1680794218; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Dg6TNa2vuEo6vYvQjhHJtmhbqHNEPTWF/K/ZgZoahhs=; b=NJAZS8c1olUUiKSGDc7+qwuZjEfCd4rrJH9E3ERCLLmiydyXhFp0FPr3JMQg0o3K9x mal9+G031qFGrc3FBkIOGnIg7nlgznYx/D5MW5aKxwinwZFD+KrtcNwskvZ9d4ZeXQTS sOUYYRBJwfHceUqm8nnvnWj3HIoIMES9d3w/FZBtKAVFjZIdHZjVPlr7QDLLj9FUiAMV qIuOy85QXFEnu/RQcYju5uYonoQmXig4/uXXmUwystgCgs5fNF9EAVsouK+EiScfWpGC sAMdiyUtR8IIk6IUxJLzYBzFDqXaiH39vuZM850RqRT1ukoOGxri6Exlp/saR5wtRc+g waEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680794218; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Dg6TNa2vuEo6vYvQjhHJtmhbqHNEPTWF/K/ZgZoahhs=; b=kTfvnExgXPQOE0plfuqq5r4RGHes+uqPShse+KE0dUFAdR6EEWWj3YcRBJ6qb7Ss+s UWhNvvVJbMCeYHt6F2rQKMbYpL2ySVi0uYZ+Yi/b3RBXewixB2Z2wSusRkQjmdiKxtN1 pLhxWTyotj8n68b6dXlGI0rFM0alBTO4fa/BxoYOje4GhAOvVokHBksOXmlUuCvAUdJH RSD1gLy8AFeRdID3ZeA5azgRRE8yrbv66DyRH6eDG++NXVWIj6tlXXWNMjr0VNTGFRH5 PrdAdNSPULWyA4brw2/L0DywzH99+fHGWvciHV4xdfe38KP6XDaaeUK6ZiVQ0AGvwQU5 ObiA== X-Gm-Message-State: AAQBX9cxwDAisIIZr9x5CJbas6Mc2+AUrJjcNZrGhMefCnbGOFXI+1sd Me2wx8DMjTxyh65PgYNb5icjxFm9eoibjgtrnM6uLg== X-Received: by 2002:a1f:b688:0:b0:43c:5f0e:2399 with SMTP id g130-20020a1fb688000000b0043c5f0e2399mr7039754vkf.1.1680794218209; Thu, 06 Apr 2023 08:16:58 -0700 (PDT) MIME-Version: 1.0 References: <20230406-feature-controls-lens-v1-0-543189a680de@wolfvision.net> <20230406-feature-controls-lens-v1-1-543189a680de@wolfvision.net> In-Reply-To: <20230406-feature-controls-lens-v1-1-543189a680de@wolfvision.net> From: Dave Stevenson Date: Thu, 6 Apr 2023 16:16:42 +0100 Message-ID: Subject: Re: [libcamera-devel] [PATCH RFC 1/4] media: v4l2-ctrls: add lens group status controls for zoom and focus To: michael.riesch@wolfvision.net Cc: Mauro Carvalho Chehab , Michael Riesch via B4 Relay , linux-kernel@vger.kernel.org, Matthias Fend , libcamera-devel@lists.libcamera.org, Sakari Ailus , linux-media@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Michael Thanks for the patch. I've got a personal interest here as I'd love to be able to control a couple of CCTV lenses that I have. Those have standard motors with potentiometers for position feedback, not stepper motors, but otherwise have the same limitations of slow movement. On Thu, 6 Apr 2023 at 15:31, Michael Riesch via B4 Relay via libcamera-devel wrote: > > From: Michael Riesch > > Add the controls V4L2_CID_FOCUS_STATUS and V4L2_CID_ZOOM_STATUS that report > the status of the zoom lens group and the focus lens group, respectively. > The returned data structure contains the current position of the lens group > as well as movement indication flags. > > Signed-off-by: Michael Riesch > --- > .../userspace-api/media/v4l/ext-ctrls-camera.rst | 48 ++++++++++++++++++++++ > drivers/media/v4l2-core/v4l2-ctrls-core.c | 9 ++++ > drivers/media/v4l2-core/v4l2-ctrls-defs.c | 7 ++++ > include/media/v4l2-ctrls.h | 2 + > include/uapi/linux/v4l2-controls.h | 13 ++++++ > include/uapi/linux/videodev2.h | 2 + > 6 files changed, 81 insertions(+) > > diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst > index daa4f40869f8..3a270bc63f1a 100644 > --- a/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst > +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst > @@ -149,6 +149,30 @@ enum v4l2_exposure_metering - > to the camera, negative values towards infinity. This is a > write-only control. > > +``V4L2_CID_FOCUS_STATUS (struct)`` > + The current status of the focus lens group. This is a read-only control. > + The returned data structure contains the current position and movement > + indication flags. The unit of the current position is undefined. Positive > + values move the focus closer to the camera, negative values towards > + infinity. The possible flags are described in the table below. The units are undefined, but positive and negative mean something with respect to some unspecified focal distance represented by 0. That seems a little odd. I was going to suggest that it seems to make sense to follow the same units as V4L2_CID_FOCUS_ABSOLUTE, but on reading that description in [1] it's the same text. I suspect there was a little too much copy/paste from V4L2_CID_FOCUS_RELATIVE, or the intent was that increasing the value brings the focus closer, and decreasing moves it towards infinity. If we did specify that it was the same units as V4L2_CID_FOCUS_ABSOLUTE, then what would that mean for use with V4L2_CID_FOCUS_RELATIVE? Then again the only user of _RELATIVE appears to be ov5693 with atomisp and that just maps it onto _ABSOLUTE, so potentially it's redundant and could be deprecated. [1] https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-camera.html > + > +.. tabularcolumns:: |p{6.8cm}|p{10.7cm}| > + > +.. flat-table:: > + :header-rows: 0 > + :stub-columns: 0 > + > + * - ``V4L2_LENS_STATUS_IDLE`` > + - Focus lens group is at rest. > + * - ``V4L2_LENS_STATUS_BUSY`` > + - Focus lens group is moving. > + * - ``V4L2_LENS_STATUS_REACHED`` > + - Focus lens group has reached its target position. > + * - ``V4L2_LENS_STATUS_FAILED`` > + - Focus lens group has failed to reach its target position. The driver > + will not transition from this state until another action is performed > + by an application. When would the lens state transition from V4L2_LENS_STATUS_REACHED to V4L2_LENS_STATUS_IDLE? If it's reached the position then it is at rest, and being at rest is the definition of V4L2_LENS_STATUS_IDLE. Likewise the lens always has a target position based on the control value, so it's always at V4L2_LENS_STATUS_REACHED when it's not moving. Is there a need to have 2 states? If the position is the same units as V4L2_CID_FOCUS_ABSOLUTE, then do you leave the determination of state to the application? > ``V4L2_CID_FOCUS_AUTO (boolean)`` > Enables continuous automatic focus adjustments. The effect of manual > focus adjustments while this feature is enabled is undefined, > @@ -239,6 +263,30 @@ enum v4l2_auto_focus_range - > movement. A negative value moves the zoom lens group towards the > wide-angle direction. The zoom speed unit is driver-specific. > > +``V4L2_CID_ZOOM_STATUS (struct)`` > + The current status of the zoom lens group. This is a read-only control. > + The returned data structure contains the current position and movement > + indication flags. The unit of the current position is driver-specific and > + its value should be a positive integer. The possible flags are described > + in the table below. > + > +.. tabularcolumns:: |p{6.8cm}|p{10.7cm}| > + > +.. flat-table:: > + :header-rows: 0 > + :stub-columns: 0 > + > + * - ``V4L2_LENS_STATUS_IDLE`` > + - Zoom lens group is at rest. > + * - ``V4L2_LENS_STATUS_BUSY`` > + - Zoom lens group is moving. > + * - ``V4L2_LENS_STATUS_REACHED`` > + - Zoom lens group has reached its target position. > + * - ``V4L2_LENS_STATUS_FAILED`` > + - Zoom lens group has failed to reach its target position. The driver will > + not transition from this state until another action is performed by an > + application. > + > ``V4L2_CID_IRIS_ABSOLUTE (integer)`` > This control sets the camera's aperture to the specified value. The > unit is undefined. Larger values open the iris wider, smaller values > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c > index 29169170880a..f6ad30f311c5 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c > @@ -350,6 +350,9 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl) > case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS: > pr_cont("HEVC_DECODE_PARAMS"); > break; > + case V4L2_CTRL_TYPE_LENS_STATUS: > + pr_cont("LENS_STATUS"); > + break; > default: > pr_cont("unknown type %d", ctrl->type); > break; > @@ -918,6 +921,9 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, > return -EINVAL; > break; > > + case V4L2_CTRL_TYPE_LENS_STATUS: > + break; > + > default: > return -EINVAL; > } > @@ -1605,6 +1611,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, > case V4L2_CTRL_TYPE_AREA: > elem_size = sizeof(struct v4l2_area); > break; > + case V4L2_CTRL_TYPE_LENS_STATUS: > + elem_size = sizeof(struct v4l2_ctrl_lens_status); > + break; > default: > if (type < V4L2_CTRL_COMPOUND_TYPES) > elem_size = sizeof(s32); > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c > index 564fedee2c88..9b26a3aa9e9c 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c > @@ -1044,6 +1044,8 @@ const char *v4l2_ctrl_get_name(u32 id) > case V4L2_CID_CAMERA_ORIENTATION: return "Camera Orientation"; > case V4L2_CID_CAMERA_SENSOR_ROTATION: return "Camera Sensor Rotation"; > case V4L2_CID_HDR_SENSOR_MODE: return "HDR Sensor Mode"; > + case V4L2_CID_FOCUS_STATUS: return "Focus, Status"; > + case V4L2_CID_ZOOM_STATUS: return "Zoom, Status"; Is there a need for the comma in the text strings? Cheers Dave > > /* FM Radio Modulator controls */ > /* Keep the order of the 'case's the same as in v4l2-controls.h! */ > @@ -1593,6 +1595,11 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, > *flags |= V4L2_CTRL_FLAG_WRITE_ONLY | > V4L2_CTRL_FLAG_EXECUTE_ON_WRITE; > break; > + case V4L2_CID_FOCUS_STATUS: > + case V4L2_CID_ZOOM_STATUS: > + *type = V4L2_CTRL_TYPE_LENS_STATUS; > + *flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_VOLATILE; > + break; > case V4L2_CID_FLASH_STROBE_STATUS: > case V4L2_CID_AUTO_FOCUS_STATUS: > case V4L2_CID_FLASH_READY: > diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h > index e59d9a234631..f7273ffc20c9 100644 > --- a/include/media/v4l2-ctrls.h > +++ b/include/media/v4l2-ctrls.h > @@ -52,6 +52,7 @@ struct video_device; > * @p_hdr10_cll: Pointer to an HDR10 Content Light Level structure. > * @p_hdr10_mastering: Pointer to an HDR10 Mastering Display structure. > * @p_area: Pointer to an area. > + * @p_lens_status: Pointer to a lens status structure. > * @p: Pointer to a compound value. > * @p_const: Pointer to a constant compound value. > */ > @@ -81,6 +82,7 @@ union v4l2_ctrl_ptr { > struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll; > struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering; > struct v4l2_area *p_area; > + struct v4l2_ctrl_lens_status *p_lens_status; > void *p; > const void *p_const; > }; > diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h > index 5e80daa4ffe0..8b037467ba9a 100644 > --- a/include/uapi/linux/v4l2-controls.h > +++ b/include/uapi/linux/v4l2-controls.h > @@ -993,6 +993,19 @@ enum v4l2_auto_focus_range { > > #define V4L2_CID_HDR_SENSOR_MODE (V4L2_CID_CAMERA_CLASS_BASE+36) > > +struct v4l2_ctrl_lens_status { > + __u32 flags; > + __s32 current_position; > +}; > + > +#define V4L2_LENS_STATUS_IDLE (0 << 0) > +#define V4L2_LENS_STATUS_BUSY (1 << 0) > +#define V4L2_LENS_STATUS_REACHED (1 << 1) > +#define V4L2_LENS_STATUS_FAILED (1 << 2) > + > +#define V4L2_CID_FOCUS_STATUS (V4L2_CID_CAMERA_CLASS_BASE + 37) > +#define V4L2_CID_ZOOM_STATUS (V4L2_CID_CAMERA_CLASS_BASE + 38) > + > /* FM Modulator class control IDs */ > > #define V4L2_CID_FM_TX_CLASS_BASE (V4L2_CTRL_CLASS_FM_TX | 0x900) > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h > index 17a9b975177a..256c21c68720 100644 > --- a/include/uapi/linux/videodev2.h > +++ b/include/uapi/linux/videodev2.h > @@ -1888,6 +1888,8 @@ enum v4l2_ctrl_type { > V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS = 0x0272, > V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX = 0x0273, > V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS = 0x0274, > + > + V4L2_CTRL_TYPE_LENS_STATUS = 0x0300, > }; > > /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ > > -- > 2.30.2 >