From: Michael Jordan <jordan.mymail@gmail.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Hans de Goede <hansg@kernel.org>,
Ricardo Ribalda <ribalda@chromium.org>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
Hans Verkuil <hverkuil+cisco@kernel.org>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
Michael Jordan <jordan.mymail@gmail.com>
Subject: [PATCH 3/3] media: uvcvideo: fix up missing AUTO_UPDATE on OBSBOT Tiny 2 pan/tilt
Date: Fri, 28 Aug 2026 11:25:57 -0400 [thread overview]
Message-ID: <20260828152557.653475-4-jordan.mymail@gmail.com> (raw)
In-Reply-To: <20260828152557.653475-1-jordan.mymail@gmail.com>
The OBSBOT Tiny 2 (3564:fef8) answers GET_INFO for CT_PANTILT_ABSOLUTE
(entity 1, selector 0x0d) with 0x03 -- GET and SET capable, but with the
AUTOUPDATE bit clear. It returns the same 0x03 for every Camera Terminal
control queried, so the firmware is not computing the byte per control.
uvc_ctrl_get_flags() takes the flags from that byte, so it clears the
UVC_CTRL_FLAG_AUTO_UPDATE that the static uvc_ctrls[] entry sets for
this control. Without AUTO_UPDATE nothing clears ctrl->loaded after the
first read, so uvcvideo serves the control from its cache indefinitely:
VIDIOC_G_CTRL returns the last value the host commanded, never the
actuator's live position. On a motorised PTZ camera the position keeps
changing during a move, and changes on its own under the camera's
autonomous subject tracking, so userspace cannot observe it at all.
Add a flags fixup entry restoring AUTO_UPDATE, alongside the flags the
control already has, for this camera's pan/tilt control. With
AUTO_UPDATE restored, the rollback at the end of every
VIDIOC_G_EXT_CTRLS runs uvc_ctrl_commit_entity(), which clears
ctrl->loaded, so the next read re-queries the device and reports the
live position. The fixup replaces info->flags wholesale rather than
OR-ing, so the entry spells out the full flag set for the control.
Tested on an OBSBOT Tiny 2: without this, a read taken while the gimbal
is moving (or after the gimbal is moved by hand) returns a stale value;
with it, VIDIOC_G_EXT_CTRLS tracks the physical position on both axes.
The vendor has been asked to fix the firmware (support ticket #8220,
2026-08-04); no fix is available at the time of writing.
lsusb -v (device descriptor and the Camera Terminal):
Bus 003 Device 006: ID 3564:fef8 Remo Tech Co., Ltd. OBSBOT Tiny 2
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.10
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 [unknown]
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x3564 Remo Tech Co., Ltd.
idProduct 0xfef8 OBSBOT Tiny 2
bcdDevice 4.09
iManufacturer 1 Remo Tech Co., Ltd.
iProduct 2 OBSBOT Tiny 2
iSerial 0
bNumConfigurations 1
[...]
VideoControl Interface Descriptor:
bLength 18
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 1
wTerminalType 0x0201 Camera Sensor
bAssocTerminal 0
iTerminal 0
wObjectiveFocalLengthMin 0
wObjectiveFocalLengthMax 0
wOcularFocalLength 0
bControlSize 3
bmControls 0x00023e3e
Auto-Exposure Mode
Auto-Exposure Priority
Exposure Time (Absolute)
Exposure Time (Relative)
Focus (Absolute)
Zoom (Absolute)
Zoom (Relative)
PanTilt (Absolute)
PanTilt (Relative)
Roll (Absolute)
Focus, Auto
Suggested-by: Ricardo Ribalda <ribalda@chromium.org>
Signed-off-by: Michael Jordan <jordan.mymail@gmail.com>
---
drivers/media/usb/uvc/uvc_ctrl.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
index b16a5cc0d..379ee51bd 100644
--- a/drivers/media/usb/uvc/uvc_ctrl.c
+++ b/drivers/media/usb/uvc/uvc_ctrl.c
@@ -2876,6 +2876,15 @@ static void uvc_ctrl_fixup_flags(struct uvc_device *dev,
UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX |
UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_SET_CUR |
UVC_CTRL_FLAG_AUTO_UPDATE },
+ /*
+ * OBSBOT Tiny 2: GET_INFO on CT_PANTILT_ABSOLUTE_CONTROL is a
+ * stub that reports GET|SET only, clearing the AUTO_UPDATE the
+ * driver's own control table sets for this control.
+ */
+ { { USB_DEVICE(0x3564, 0xfef8) }, 1,
+ UVC_CT_PANTILT_ABSOLUTE_CONTROL,
+ UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_RANGE |
+ UVC_CTRL_FLAG_RESTORE | UVC_CTRL_FLAG_AUTO_UPDATE },
};
unsigned int i;
--
2.43.0
next prev parent reply other threads:[~2026-08-28 15:26 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-28 15:25 [PATCH 0/3] media: uvcvideo: live pan/tilt position on the OBSBOT Tiny 2 Michael Jordan
2026-08-28 15:25 ` [PATCH 1/3] media: uvcvideo: report AUTO_UPDATE controls as volatile Michael Jordan
2026-08-31 9:36 ` Ricardo Ribalda
2026-08-28 15:25 ` [PATCH 2/3] media: uvcvideo: generalise the XU flags fixup to all controls Michael Jordan
2026-08-31 9:35 ` Ricardo Ribalda
2026-08-28 15:25 ` Michael Jordan [this message]
2026-08-31 9:40 ` [PATCH 3/3] media: uvcvideo: fix up missing AUTO_UPDATE on OBSBOT Tiny 2 pan/tilt Ricardo Ribalda
2026-08-31 9:42 ` Ricardo Ribalda
2026-09-02 0:25 ` Michael Jordan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260828152557.653475-4-jordan.mymail@gmail.com \
--to=jordan.mymail@gmail.com \
--cc=hansg@kernel.org \
--cc=hverkuil+cisco@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=ribalda@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox