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:50:40 EST


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