Re: [PATCH 3/3] media: uvcvideo: fix up missing AUTO_UPDATE on OBSBOT Tiny 2 pan/tilt
From: Ricardo Ribalda
Date: Mon Aug 31 2026 - 05:43:49 EST
Hi again.
Sashiko [1] has pointed out that there might be other controls that
will benefit from the UVC_CTRL_FLAG_AUTO_UPDATE.
Can you double check if that is the case? Feel free to add is a v2 or
as a follow-up patch.
Thanks!
[1] https://sashiko.dev/#/patchset/20260828152557.653475-1-jordan.mymail%40gmail.com
On Mon, 31 Aug 2026 at 11:40, Ricardo Ribalda <ribalda@xxxxxxxxxxxx> wrote:
>
> Hi Michael
>
> Thanks for the patch, and for contacting the vendor.
> Could you reply to this patch with the full output of lsusb -v instead
> of a cropped one?
>
> We keep that info for future reference.
>
> Thanks!
>
> On Fri, 28 Aug 2026 at 17:26, Michael Jordan <jordan.mymail@xxxxxxxxx> wrote:
> >
> > 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
> >
> Reviewed-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx>
> > Suggested-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx>
> > Signed-off-by: Michael Jordan <jordan.mymail@xxxxxxxxx>
> > ---
> > 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
> >
>
>
> --
> Ricardo Ribalda
--
Ricardo Ribalda