linux icon indicating copy to clipboard operation
linux copied to clipboard

Quirk fix for OBSBOT Tiny camera minimum control settings

Open johnebgood opened this issue 1 year ago • 1 comments

The OBSBOT Tiny cameras are misreporting their minimum relative pan, tilt and zoom speed settings. This makes controlling the cameras with an analog stick or changing the speed of transit for presets not possible. I'm looking for guidance on creating a proper control mapping override or any feedback on what I have implemented; it works. Opening this draft pull request for feedback and to provide visibility to the vendor to fix their firmware.

@ribalda, I looked through some of the control mapping code you have authored, do you have any thoughts on a fix until the vendor (maybe) resolves this?

Before the patch:
zoom_continuous 0x009a090f (int)    : min=0 max=100 step=1 default=100 value=240
pan_speed 0x009a0920 (int)          : min=-1 max=160 step=1 default=20 value=0
tilt_speed 0x009a0921 (int)         : min=-1 max=120 step=1 default=20 value=0

After the patch:
zoom_continuous 0x009a090f (int)    : min=-100 max=100 step=1 default=100 value=240
pan_speed 0x009a0920 (int)          : min=-160 max=160 step=1 default=20 value=0
tilt_speed 0x009a0921 (int)         : min=-120 max=120 step=1 default=20 value=0

johnebgood avatar Mar 21 '24 10:03 johnebgood

Hi John

Most of the discussion for linux-media is done in this mailing list: https://lore.kernel.org/linux-media/ Could you share this message there?

There is a mechanism that allows overriding a control for a specific device. You probably want to use it. Take a look at this: https://git.linuxtv.org/media_tree.git/tree/drivers/media/usb/uvc/uvc_driver.c?h=master#n2603

Could you share the "lsusb -v " info of your device, and also what are the raw values from the device for UVC_GET_MAX, UVC_GET_MIN for UVC_CT_PANTILT_RELATIVE_CONTROL and UVC_CT_ZOOM_RELATIVE_CONTROL ?

Something like this (not tested :) ):

diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
index e59a463c27618..76c7adc3aa579 100644
--- a/drivers/media/usb/uvc/uvc_ctrl.c
+++ b/drivers/media/usb/uvc/uvc_ctrl.c
@@ -415,7 +415,11 @@ static s32 uvc_ctrl_get_zoom(struct
uvc_control_mapping *mapping,
                return (zoom == 0) ? 0 : (zoom > 0 ? data[2] : -data[2]);

        case UVC_GET_MIN:
+               printk(KERN_ERR "zoom: GET_MIN 0%x 0x%x 0%x\n",
data[0], data[1], data[2]);
+               return data[2];
        case UVC_GET_MAX:
+               printk(KERN_ERR "zoom: GET_MAX 0%x 0x%x 0%x\n",
data[0], data[1], data[2]);
+               fallthrough;
        case UVC_GET_RES:
        case UVC_GET_DEF:
        default:
@@ -441,8 +445,11 @@ static s32 uvc_ctrl_get_rel_speed(struct
uvc_control_mapping *mapping,
                return (rel == 0) ? 0 : (rel > 0 ? data[first+1]
                                                 : -data[first+1]);
        case UVC_GET_MIN:
+               printk(KERN_ERR "speed: GET_MIN 0%x 0x%x 0%x\n",
data[first], data[first+1], data[first+2]);
                return -data[first+1];
        case UVC_GET_MAX:
+               printk(KERN_ERR "speed: GET_MAX 0%x 0x%x 0%x\n",
data[first], data[first+1], data[first+2]);
+               fallthrough;
        case UVC_GET_RES:
        case UVC_GET_DEF:
        default:

Thanks!

ribalda avatar Mar 21 '24 22:03 ribalda