Download raw body.
Support LG UltraFine Display Camera
On Sun, 01 Dec 2024 22:12:55 +0100,
Marcus Glocker <marcus@nazgul.ch> wrote:
>
> This still breaks my Logitech Webcam C930e :-(
>
I think the quirk approach is wrong. So I re-read the UVC 1.5 class
specification, and I think I figured it out.
Section 2.4.3 states that the bulk endpoint only supports the alternative
setting of zero, which is the default stream, and which is switched at
uvideo_attach_hook. Inside uvideo_vs_close the code uses the same switch to
turn off the cam LED.
And I see this behaviour on both bulk cams: it flashes the LED and looks
like it is switched off.
I had checked the linux, and it doesn't set alt interface for bulk:
https://github.com/torvalds/linux/blob/v6.12/drivers/media/usb/uvc/uvc_video.c#L2054-L2064
Here is the diff that skips uvideo_vs_set_alt inside uvideo_vs_open for
bulk, and cleaned up quirk and usbdevs.
This diff is enough to make the Jabra PanaCast 20 work, and by adding the
missing usbd_get_xfer_status the LG UltraFine Display Camera works as well.
Ok?
Index: sys/dev/usb/uvideo.c
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/uvideo.c,v
diff -u -p -r1.225 uvideo.c
--- sys/dev/usb/uvideo.c 1 Dec 2024 10:38:47 -0000 1.225
+++ sys/dev/usb/uvideo.c 5 Dec 2024 00:20:16 -0000
@@ -298,7 +298,6 @@ const struct video_hw_if uvideo_hw_if =
#define UVIDEO_FLAG_REATTACH 0x2
#define UVIDEO_FLAG_VENDOR_CLASS 0x4
#define UVIDEO_FLAG_NOATTACH 0x8
-#define UVIDEO_FLAG_RENEGOTIATE_AFTER_SET_ALT 0x10
const struct uvideo_devs {
struct usb_devno uv_dev;
char *ucode_name;
@@ -380,12 +379,6 @@ const struct uvideo_devs {
NULL,
UVIDEO_FLAG_NOATTACH
},
- { /* Needs renegotiate after setting alternate interface */
- { USB_VENDOR_GN_NETCOM, USB_PRODUCT_GN_NETCOM_JABRA_PANACAST_20 },
- NULL,
- NULL,
- UVIDEO_FLAG_RENEGOTIATE_AFTER_SET_ALT
- },
};
#define uvideo_lookup(v, p) \
((const struct uvideo_devs *)usb_lookup(uvideo_devs, v, p))
@@ -1889,6 +1882,10 @@ uvideo_vs_open(struct uvideo_softc *sc)
return (error);
}
+ /* 2.4.3 the bulk endpoint only supports the alternative setting of 0 */
+ if (sc->sc_vs_cur->bulk_endpoint)
+ goto skip_set_alt;
+
error = uvideo_vs_set_alt(sc, sc->sc_vs_cur->ifaceh,
UGETDW(sc->sc_desc_probe.dwMaxPayloadTransferSize));
if (error != USBD_NORMAL_COMPLETION) {
@@ -1906,17 +1903,7 @@ uvideo_vs_open(struct uvideo_softc *sc)
return (USBD_INVAL);
}
- /* renegotiate with commit after setting alternate interface */
- if (sc->sc_quirk &&
- sc->sc_quirk->flags & UVIDEO_FLAG_RENEGOTIATE_AFTER_SET_ALT) {
- error = uvideo_vs_negotiation(sc, 1);
- if (error != USBD_NORMAL_COMPLETION) {
- printf("%s: could not renegotiate after setting "
- "alternate interface!\n", DEVNAME(sc));
- return (error);
- }
- }
-
+skip_set_alt:
DPRINTF(1, "%s: open pipe for bEndpointAddress=0x%02x\n",
DEVNAME(sc), sc->sc_vs_cur->endpoint);
error = usbd_open_pipe(
Index: sys/dev/usb/usbdevs
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/usbdevs,v
diff -u -p -r1.772 usbdevs
--- sys/dev/usb/usbdevs 30 Nov 2024 17:41:57 -0000 1.772
+++ sys/dev/usb/usbdevs 4 Dec 2024 23:47:04 -0000
@@ -409,7 +409,6 @@ vendor NEODIO 0x0aec Neodio
vendor OPTION 0x0af0 Option
vendor ASUS 0x0b05 ASUS
vendor TODOS 0x0b0c Todos Data System
-vendor GN_NETCOM 0x0b0e GN Jabra A/S
vendor GEARHEAD 0x0b38 Gear Head
vendor OCT 0x0b39 Omnidirectional Control Technology
vendor TEKRAM 0x0b3b Tekram Technology
@@ -2204,9 +2203,6 @@ product GMATE YP3X00 0x1001 YP3X00 PDA
/* GN Otometrics products */
product GNOTOMETRICS AURICAL 0x0010 Aurical
-
-/* GN Netcom products */
-product GN_NETCOM JABRA_PANACAST_20 0x3021 Jabra PanaCast 20
/* GoHubs products */
product GOHUBS GOCOM232 0x1001 GoCOM232 Serial converter
Index: sys/dev/usb/usbdevs.h
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/usbdevs.h,v
diff -u -p -r1.784 usbdevs.h
--- sys/dev/usb/usbdevs.h 30 Nov 2024 17:43:46 -0000 1.784
+++ sys/dev/usb/usbdevs.h 4 Dec 2024 23:47:17 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdevs.h,v 1.784 2024/11/30 17:43:46 kirill Exp $ */
+/* $OpenBSD$ */
/*
* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
@@ -416,7 +416,6 @@
#define USB_VENDOR_OPTION 0x0af0 /* Option */
#define USB_VENDOR_ASUS 0x0b05 /* ASUS */
#define USB_VENDOR_TODOS 0x0b0c /* Todos Data System */
-#define USB_VENDOR_GN_NETCOM 0x0b0e /* GN Jabra A/S */
#define USB_VENDOR_GEARHEAD 0x0b38 /* Gear Head */
#define USB_VENDOR_OCT 0x0b39 /* Omnidirectional Control Technology */
#define USB_VENDOR_TEKRAM 0x0b3b /* Tekram Technology */
@@ -2211,9 +2210,6 @@
/* GN Otometrics products */
#define USB_PRODUCT_GNOTOMETRICS_AURICAL 0x0010 /* Aurical */
-
-/* GN Netcom products */
-#define USB_PRODUCT_GN_NETCOM_JABRA_PANACAST_20 0x3021 /* Jabra PanaCast 20 */
/* GoHubs products */
#define USB_PRODUCT_GOHUBS_GOCOM232 0x1001 /* GoCOM232 Serial converter */
Index: sys/dev/usb/usbdevs_data.h
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/usbdevs_data.h,v
diff -u -p -r1.778 usbdevs_data.h
--- sys/dev/usb/usbdevs_data.h 30 Nov 2024 17:43:46 -0000 1.778
+++ sys/dev/usb/usbdevs_data.h 4 Dec 2024 23:47:17 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdevs_data.h,v 1.778 2024/11/30 17:43:46 kirill Exp $ */
+/* $OpenBSD$ */
/*
* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
@@ -4618,10 +4618,6 @@ const struct usb_known_product usb_known
"Aurical",
},
{
- USB_VENDOR_GN_NETCOM, USB_PRODUCT_GN_NETCOM_JABRA_PANACAST_20,
- "Jabra PanaCast 20",
- },
- {
USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232,
"GoCOM232 Serial converter",
},
@@ -13940,10 +13936,6 @@ const struct usb_known_vendor usb_known_
{
USB_VENDOR_TODOS,
"Todos Data System",
- },
- {
- USB_VENDOR_GN_NETCOM,
- "GN Jabra A/S",
},
{
USB_VENDOR_GEARHEAD,
Index: sys/dev/usb/uvideo.c
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/uvideo.c,v
diff -u -p -r1.225 uvideo.c
--- sys/dev/usb/uvideo.c 1 Dec 2024 10:38:47 -0000 1.225
+++ sys/dev/usb/uvideo.c 4 Dec 2024 22:55:18 -0000
@@ -2052,6 +2052,9 @@ uvideo_vs_start_bulk_thread(void *arg)
break;
}
+ usbd_get_xfer_status(sc->sc_vs_cur->bxfer.xfer,
+ NULL, NULL, &size, NULL);
+
DPRINTF(2, "%s: *** buffer len = %d\n", DEVNAME(sc), size);
(void)sc->sc_decode_stream_header(sc,
--
wbr, Kirill
Support LG UltraFine Display Camera