martijn@ has recently reported that in his machine he has two cams
of which one is doing IR, which isn't really supported by uvideo(4).
This IR device attaches always first as uvideo0, so he needs to swap
that regularly with his working cam which by default attaches to uvideo1.

I came up with a new quirk flag to *not* attach certain devices.  Tested
successfully by martijn@, the IR cam attaches to ugen0 and the supported
cam to uvideo0.

This patch shouldn't affect any supported uvideo(4) devices.

OK?


Index: sys/dev/usb/uvideo.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uvideo.c,v
retrieving revision 1.211
diff -u -p -u -p -r1.211 uvideo.c
--- sys/dev/usb/uvideo.c        27 Jan 2021 17:28:19 -0000      1.211
+++ sys/dev/usb/uvideo.c        8 Mar 2021 22:06:51 -0000
@@ -307,6 +307,7 @@ struct video_hw_if uvideo_hw_if = {
 #define UVIDEO_FLAG_ISIGHT_STREAM_HEADER       0x1
 #define UVIDEO_FLAG_REATTACH                   0x2
 #define UVIDEO_FLAG_VENDOR_CLASS               0x4
+#define UVIDEO_FLAG_NOATTACH                   0x8
 struct uvideo_devs {
        struct usb_devno         uv_dev;
        char                    *ucode_name;
@@ -382,6 +383,12 @@ struct uvideo_devs {
            NULL,
            UVIDEO_FLAG_VENDOR_CLASS
        },
+       {   /* Infrared camera not supported */
+           { USB_VENDOR_CHICONY, USB_PRODUCT_CHICONY_IRCAMERA },
+           NULL,
+           NULL,
+           UVIDEO_FLAG_NOATTACH
+       },
 };
 #define uvideo_lookup(v, p) \
        ((struct uvideo_devs *)usb_lookup(uvideo_devs, v, p))
@@ -480,13 +487,12 @@ uvideo_match(struct device *parent, void
        if (id == NULL)
                return (UMATCH_NONE);
 
-       if (id->bInterfaceClass == UICLASS_VIDEO &&
-           id->bInterfaceSubClass == UISUBCLASS_VIDEOCONTROL)
-               return (UMATCH_VENDOR_PRODUCT_CONF_IFACE);
-
-       /* quirk devices which we want to attach */
+       /* quirk devices */
        quirk = uvideo_lookup(uaa->vendor, uaa->product);
        if (quirk != NULL) {
+               if (quirk->flags & UVIDEO_FLAG_NOATTACH)
+                       return (UMATCH_NONE);
+
                if (quirk->flags & UVIDEO_FLAG_REATTACH)
                        return (UMATCH_VENDOR_PRODUCT_CONF_IFACE);
 
@@ -495,6 +501,10 @@ uvideo_match(struct device *parent, void
                    id->bInterfaceSubClass == UISUBCLASS_VIDEOCONTROL)
                        return (UMATCH_VENDOR_PRODUCT_CONF_IFACE);
        }
+
+       if (id->bInterfaceClass == UICLASS_VIDEO &&
+           id->bInterfaceSubClass == UISUBCLASS_VIDEOCONTROL)
+               return (UMATCH_VENDOR_PRODUCT_CONF_IFACE);
 
        return (UMATCH_NONE);
 }
Index: sys/dev/usb/usbdevs
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.731
diff -u -p -u -p -r1.731 usbdevs
--- sys/dev/usb/usbdevs 27 Feb 2021 03:03:40 -0000      1.731
+++ sys/dev/usb/usbdevs 8 Mar 2021 22:06:53 -0000
@@ -1336,6 +1336,7 @@ product CHICONY RTL8188CUS_3      0xaff9  RTL8
 product CHICONY RTL8188CUS_4   0xaffa  RTL8188CUS
 product CHICONY RTL8188CUS_5   0xaffb  RTL8188CUS
 product CHICONY RTL8188CUS_6   0xaffc  RTL8188CUS
+product CHICONY IRCAMERA       0xb615  Integrated IR Camera
 
 /* CH Products */
 product CHPRODUCTS PROTHROTTLE 0x00f1  Pro Throttle

Reply via email to