From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Wed, 02 Oct 2024 09:33:56 +0200 Received: from metis.whiteo.stw.pengutronix.de ([2a0a:edc0:2:b01:1d::104]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1svtrv-005Hmw-16 for lore@lore.pengutronix.de; Wed, 02 Oct 2024 09:33:56 +0200 Received: from localhost ([127.0.0.1] helo=metis.whiteo.stw.pengutronix.de) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1svtrv-00046Q-Sm; Wed, 02 Oct 2024 09:33:55 +0200 Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1svtra-00046I-LK for ptxdist@pengutronix.de; Wed, 02 Oct 2024 09:33:34 +0200 Received: from [2a0a:edc0:2:b01:1d::c5] (helo=pty.whiteo.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1svtra-0033h5-97 for ptxdist@pengutronix.de; Wed, 02 Oct 2024 09:33:34 +0200 Received: from mtr by pty.whiteo.stw.pengutronix.de with local (Exim 4.96) (envelope-from ) id 1svtra-006o3s-0e for ptxdist@pengutronix.de; Wed, 02 Oct 2024 09:33:34 +0200 Date: Wed, 2 Oct 2024 09:33:34 +0200 From: Michael Tretter To: ptxdist@pengutronix.de Message-ID: References: <20241001204544.3481279-1-m.grzeschik@pengutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20241001204544.3481279-1-m.grzeschik@pengutronix.de> X-Sent-From: Pengutronix Hildesheim X-URL: http://www.pengutronix.de/ X-Accept-Language: de,en X-Accept-Content-Type: text/plain Subject: Re: [ptxdist] [PATCH v2] libusbgx: update to release 0.3.0 X-BeenThere: ptxdist@pengutronix.de X-Mailman-Version: 2.1.29 Precedence: list List-Id: PTXdist Development Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: ptxdist@pengutronix.de Sender: "ptxdist" X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: ptxdist-bounces@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false On Tue, 01 Oct 2024 22:45:44 +0200, Michael Grzeschik wrote: > Since libusbgx was released to version 0.3.0 we update the rule. Usually the patch subject should be something like "libusbgx: version bump 0.2.0 -> 0.3.0", and the use of "we" in the commit message is at least unusual. > > This release also includes the support to build with meson so we also > change the build system in the rule file. > > Signed-off-by: Michael Grzeschik Reviewed-by: Michael Tretter > > --- > v1 -> v2: > - dropped the v in the packagename > --- > ...1-Fix-39-Compilation-fails-on-gcc-v8.patch | 20 - > ...ld-with-glibc-2.28-since-sys-sysmacr.patch | 90 --- > ...vid-pid-remove-add-dynamic-vid-pid-s.patch | 67 -- > .../0004-libusbgx-Add-UVC-support.patch | 737 ------------------ > patches/libusbgx-0.2.0/autogen.sh | 16 - > patches/libusbgx-0.2.0/series | 7 - > rules/libusbgx.in | 1 + > rules/libusbgx.make | 24 +- > 8 files changed, 12 insertions(+), 950 deletions(-) > delete mode 100644 patches/libusbgx-0.2.0/0001-Fix-39-Compilation-fails-on-gcc-v8.patch > delete mode 100644 patches/libusbgx-0.2.0/0002-libusbgx-fix-build-with-glibc-2.28-since-sys-sysmacr.patch > delete mode 100644 patches/libusbgx-0.2.0/0003-examples-gadget-vid-pid-remove-add-dynamic-vid-pid-s.patch > delete mode 100644 patches/libusbgx-0.2.0/0004-libusbgx-Add-UVC-support.patch > delete mode 100755 patches/libusbgx-0.2.0/autogen.sh > delete mode 100644 patches/libusbgx-0.2.0/series > > diff --git a/patches/libusbgx-0.2.0/0001-Fix-39-Compilation-fails-on-gcc-v8.patch b/patches/libusbgx-0.2.0/0001-Fix-39-Compilation-fails-on-gcc-v8.patch > deleted file mode 100644 > index 4e7ff0ca4..000000000 > --- a/patches/libusbgx-0.2.0/0001-Fix-39-Compilation-fails-on-gcc-v8.patch > +++ /dev/null > @@ -1,20 +0,0 @@ > -From: Federico Fuga > -Date: Thu, 23 May 2019 13:40:39 +0200 > -Subject: [PATCH] Fix #39 Compilation fails on gcc v8 > - > ---- > - src/usbg_common.c | 1 + > - 1 file changed, 1 insertion(+) > - > -diff --git a/src/usbg_common.c b/src/usbg_common.c > -index f8822fcf727f..f3aa8b053c44 100644 > ---- a/src/usbg_common.c > -+++ b/src/usbg_common.c > -@@ -20,6 +20,7 @@ > - #include > - #include > - #include > -+#include > - > - int usbg_read_buf_limited(const char *path, const char *name, > - const char *file, char *buf, int len) > diff --git a/patches/libusbgx-0.2.0/0002-libusbgx-fix-build-with-glibc-2.28-since-sys-sysmacr.patch b/patches/libusbgx-0.2.0/0002-libusbgx-fix-build-with-glibc-2.28-since-sys-sysmacr.patch > deleted file mode 100644 > index 9670d469a..000000000 > --- a/patches/libusbgx-0.2.0/0002-libusbgx-fix-build-with-glibc-2.28-since-sys-sysmacr.patch > +++ /dev/null > @@ -1,90 +0,0 @@ > -From: Gwenhael Goavec-Merou > -Date: Mon, 10 Sep 2018 15:52:09 +0200 > -Subject: [PATCH] libusbgx: fix build with glibc-2.28 since > - is no more included by > - > -Signed-off-by: Sid Spry R030t1@gmail.com > -Signed-off-by: Gwenhael Goavec-Merou gwenhael.goavec-merou@trabucayre.com > -[Copy sign-offs from pull requst to commit msg] > -Signed-off-by: Krzysztof Opasiak > ---- > - examples/gadget-acm-ecm.c | 1 + > - examples/gadget-import.c | 1 + > - examples/gadget-ms.c | 1 + > - examples/show-gadgets.c | 1 + > - examples/show-udcs.c | 1 + > - include/usbg/usbg_internal_libconfig.h | 1 + > - 6 files changed, 6 insertions(+) > - > -diff --git a/examples/gadget-acm-ecm.c b/examples/gadget-acm-ecm.c > -index 1c5e2ca5161c..29360da15811 100644 > ---- a/examples/gadget-acm-ecm.c > -+++ b/examples/gadget-acm-ecm.c > -@@ -20,6 +20,7 @@ > - > - #include > - #include > -+#include > - #include > - #include > - > -diff --git a/examples/gadget-import.c b/examples/gadget-import.c > -index e684fdb861e8..63df4499926b 100644 > ---- a/examples/gadget-import.c > -+++ b/examples/gadget-import.c > -@@ -25,6 +25,7 @@ > - #include > - #include > - #include > -+#include > - #include > - > - int main(int argc, char **argv) > -diff --git a/examples/gadget-ms.c b/examples/gadget-ms.c > -index 478c37097397..a5c668187a96 100644 > ---- a/examples/gadget-ms.c > -+++ b/examples/gadget-ms.c > -@@ -23,6 +23,7 @@ > - > - #include > - #include > -+#include > - #include > - #include > - #include > -diff --git a/examples/show-gadgets.c b/examples/show-gadgets.c > -index 707d4488d16b..a2a21c883b27 100644 > ---- a/examples/show-gadgets.c > -+++ b/examples/show-gadgets.c > -@@ -21,6 +21,7 @@ > - #include > - #include > - #include > -+#include > - #include > - #include > - #include > -diff --git a/examples/show-udcs.c b/examples/show-udcs.c > -index 66e950f7bf85..2f5cc458ebb1 100644 > ---- a/examples/show-udcs.c > -+++ b/examples/show-udcs.c > -@@ -23,6 +23,7 @@ > - > - #include > - #include > -+#include > - #include > - > - int main(void) > -diff --git a/include/usbg/usbg_internal_libconfig.h b/include/usbg/usbg_internal_libconfig.h > -index ac51758b3d6c..3fa55c0b544b 100644 > ---- a/include/usbg/usbg_internal_libconfig.h > -+++ b/include/usbg/usbg_internal_libconfig.h > -@@ -12,6 +12,7 @@ > - #ifndef USBG_INTERNAL_LIBCONFIG_H > - #define USBG_INTERNAL_LIBCONFIG_H > - > -+#include > - #include > - #ifdef __cplusplus > - extern "C" { > diff --git a/patches/libusbgx-0.2.0/0003-examples-gadget-vid-pid-remove-add-dynamic-vid-pid-s.patch b/patches/libusbgx-0.2.0/0003-examples-gadget-vid-pid-remove-add-dynamic-vid-pid-s.patch > deleted file mode 100644 > index 63ddf347f..000000000 > --- a/patches/libusbgx-0.2.0/0003-examples-gadget-vid-pid-remove-add-dynamic-vid-pid-s.patch > +++ /dev/null > @@ -1,67 +0,0 @@ > -From: Michael Grzeschik > -Date: Wed, 28 Apr 2021 21:43:07 +0200 > -Subject: [PATCH] examples: gadget-vid-pid-remove: add dynamic vid pid support > - > -Signed-off-by: Michael Grzeschik > ---- > - examples/gadget-vid-pid-remove.c | 25 ++++++++++++++++++++----- > - 1 file changed, 20 insertions(+), 5 deletions(-) > - > -diff --git a/examples/gadget-vid-pid-remove.c b/examples/gadget-vid-pid-remove.c > -index f6b950b38da3..f5eb9664b721 100644 > ---- a/examples/gadget-vid-pid-remove.c > -+++ b/examples/gadget-vid-pid-remove.c > -@@ -23,11 +23,10 @@ > - > - #include > - #include > -+#include > -+#include > - #include > - > --#define VENDOR 0x1d6b > --#define PRODUCT 0x0104 > -- > - int remove_gadget(usbg_gadget *g) > - { > - int usbg_ret; > -@@ -60,13 +59,29 @@ out: > - return usbg_ret; > - } > - > --int main(void) > -+int main(int argc, char **argv) > - { > - int usbg_ret; > - int ret = -EINVAL; > - usbg_state *s; > - usbg_gadget *g; > - struct usbg_gadget_attrs g_attrs; > -+ char *cp; > -+ int vendor = 0x1d6b, product = 0x0104; > -+ > -+ if (argc >= 2) { > -+ cp = strchr(argv[1], ':'); > -+ if (!cp) { > -+ ret = -EINVAL; > -+ fprintf(stderr, "Usage: gadget-vid-pid-remove vid:pid\n"); > -+ goto out1; > -+ } > -+ *cp++ = 0; > -+ if (&argv[1]) > -+ vendor = strtoul(argv[1], NULL, 16); > -+ if (*cp) > -+ product = strtoul(cp, NULL, 16); > -+ } > - > - usbg_ret = usbg_init("/sys/kernel/config", &s); > - if (usbg_ret != USBG_SUCCESS) { > -@@ -88,7 +103,7 @@ int main(void) > - } > - > - /* Compare attrs with given values and remove if suitable */ > -- if (g_attrs.idVendor == VENDOR && g_attrs.idProduct == PRODUCT) { > -+ if (g_attrs.idVendor == vendor && g_attrs.idProduct == product) { > - usbg_gadget *g_next = usbg_get_next_gadget(g); > - > - usbg_ret = remove_gadget(g); > diff --git a/patches/libusbgx-0.2.0/0004-libusbgx-Add-UVC-support.patch b/patches/libusbgx-0.2.0/0004-libusbgx-Add-UVC-support.patch > deleted file mode 100644 > index 0217bb02d..000000000 > --- a/patches/libusbgx-0.2.0/0004-libusbgx-Add-UVC-support.patch > +++ /dev/null > @@ -1,737 +0,0 @@ > -From: Thomas Haemmerle > -Date: Wed, 8 Jan 2020 14:43:45 +0100 > -Subject: [PATCH] libusbgx: Add UVC support > - > -Signed-off-by: Thomas Haemmerle > -Signed-off-by: Michael Grzeschik > - > -Notes: > -v2 -> v3: - simplified exit paths of functions with reutrns instead of gotos > - - added cleanup code for remove > - - added gadget-uvc example file > - - simplified class link creation > - - added support for more than one format > ---- > - Makefile.am | 2 +- > - examples/Makefile.am | 3 +- > - examples/gadget-uvc.c | 156 ++++++++++++++++++ > - include/usbg/function/uvc.h | 90 +++++++++++ > - include/usbg/usbg.h | 1 + > - src/Makefile.am | 2 +- > - src/function/uvc.c | 378 ++++++++++++++++++++++++++++++++++++++++++++ > - src/usbg.c | 2 + > - 8 files changed, 631 insertions(+), 3 deletions(-) > - create mode 100644 examples/gadget-uvc.c > - create mode 100644 include/usbg/function/uvc.h > - create mode 100644 src/function/uvc.c > - > -diff --git a/Makefile.am b/Makefile.am > -index a3cc337c18da..b3cd097d9d32 100644 > ---- a/Makefile.am > -+++ b/Makefile.am > -@@ -14,6 +14,6 @@ EXTRA_DIST = doxygen.cfg > - library_includedir=$(includedir)/usbg > - library_include_HEADERS = include/usbg/usbg.h include/usbg/usbg_version.h > - function_includedir=$(includedir)/usbg/function > --function_include_HEADERS = include/usbg/function/ffs.h include/usbg/function/loopback.h include/usbg/function/midi.h include/usbg/function/ms.h include/usbg/function/net.h include/usbg/function/phonet.h include/usbg/function/serial.h include/usbg/function/hid.h include/usbg/function/uac2.h > -+function_include_HEADERS = include/usbg/function/ffs.h include/usbg/function/loopback.h include/usbg/function/midi.h include/usbg/function/ms.h include/usbg/function/net.h include/usbg/function/phonet.h include/usbg/function/serial.h include/usbg/function/hid.h include/usbg/function/uac2.h include/usbg/function/uvc.h > - pkgconfigdir = $(libdir)/pkgconfig > - pkgconfig_DATA = libusbgx.pc > -diff --git a/examples/Makefile.am b/examples/Makefile.am > -index 993432156d6c..3217eb3bfd6f 100644 > ---- a/examples/Makefile.am > -+++ b/examples/Makefile.am > -@@ -1,5 +1,6 @@ > --bin_PROGRAMS = show-gadgets gadget-acm-ecm gadget-vid-pid-remove gadget-ffs gadget-export gadget-import show-udcs gadget-ms gadget-midi gadget-hid gadget-rndis-os-desc gadget-uac2 > -+bin_PROGRAMS = show-gadgets gadget-acm-ecm gadget-vid-pid-remove gadget-uvc gadget-ffs gadget-export gadget-import show-udcs gadget-ms gadget-midi gadget-hid gadget-rndis-os-desc gadget-uac2 > - gadget_acm_ecm_SOURCES = gadget-acm-ecm.c > -+gadget_uvc_SOURCES = gadget-uvc.c > - show_gadgets_SOURCES = show-gadgets.c > - gadget_vid_pid_remove_SOURCES = gadget-vid-pid-remove.c > - gadget_ffs_SOURCES = gadget-ffs.c > -diff --git a/examples/gadget-uvc.c b/examples/gadget-uvc.c > -new file mode 100644 > -index 000000000000..d3efe2deaebe > ---- /dev/null > -+++ b/examples/gadget-uvc.c > -@@ -0,0 +1,156 @@ > -+/* > -+ * Copyright (C) 2021 Pengutronix > -+ * > -+ * Michael Grzeschik > -+ * > -+ * This program is free software; you can redistribute it and/or modify > -+ * it under the terms of the GNU General Public License as published by > -+ * the Free Software Foundation; either version 2 of the License, or > -+ * (at your option) any later version. > -+ * > -+ * This program is distributed in the hope that it will be useful, > -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of > -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > -+ * GNU General Public License for more details. > -+ */ > -+ > -+#include > -+#include > -+#include > -+#include > -+#include > -+#include > -+ > -+/** > -+ * @file gadget-uvc.c > -+ * @example gadget-uvc.c > -+ * This is an example of how to create an UVC gadget device. > -+ */ > -+ > -+#define VENDOR 0x1d6b > -+#define PRODUCT 0x0104 > -+ > -+int main(void) > -+{ > -+ usbg_state *s; > -+ usbg_gadget *g; > -+ usbg_config *c; > -+ usbg_function *f_uvc; > -+ int ret = -EINVAL; > -+ int usbg_ret; > -+ > -+ struct usbg_gadget_attrs g_attrs = { > -+ .bcdUSB = 0x0200, > -+ .bDeviceClass = USB_CLASS_PER_INTERFACE, > -+ .bDeviceSubClass = 0x00, > -+ .bDeviceProtocol = 0x00, > -+ .bMaxPacketSize0 = 64, /* Max allowed ep0 packet size */ > -+ .idVendor = VENDOR, > -+ .idProduct = PRODUCT, > -+ .bcdDevice = 0x0001, /* Verson of device */ > -+ }; > -+ > -+ struct usbg_gadget_strs g_strs = { > -+ .serial = "0123456789", /* Serial number */ > -+ .manufacturer = "Foo Inc.", /* Manufacturer */ > -+ .product = "Bar Gadget" /* Product string */ > -+ }; > -+ > -+ struct usbg_config_strs c_strs = { > -+ .configuration = "UVC" > -+ }; > -+ > -+ struct usbg_f_uvc_format_attrs uvc_format_attrs_array[] = { > -+ { > -+ .format = UVC_FORMAT_MJPEG, > -+ .dwFrameInterval = "333333", > -+ .height = 1080, > -+ .width = 1920, > -+ }, { > -+ .format = UVC_FORMAT_MJPEG, > -+ .dwFrameInterval = "333333", > -+ .height = 3940, > -+ .width = 2160, > -+ }, { > -+ .format = UVC_FORMAT_UNCOMPRESSED, > -+ .dwFrameInterval = "333333", > -+ .height = 1080, > -+ .width = 1920, > -+ }, { > -+ .format = UVC_FORMAT_UNCOMPRESSED, > -+ .dwFrameInterval = "333333", > -+ .height = 3940, > -+ .width = 2160, > -+ } > -+ }; > -+ > -+ struct usbg_f_uvc_format_attrs *uvc_format_attrs[] = { > -+ &uvc_format_attrs_array[3], > -+ &uvc_format_attrs_array[2], > -+ &uvc_format_attrs_array[1], > -+ &uvc_format_attrs_array[0], > -+ NULL, > -+ }; > -+ > -+ struct usbg_f_uvc_attrs uvc_attrs = { > -+ .formats = uvc_format_attrs, > -+ }; > -+ > -+ usbg_ret = usbg_init("/sys/kernel/config", &s); > -+ if (usbg_ret != USBG_SUCCESS) { > -+ fprintf(stderr, "Error on USB gadget init\n"); > -+ fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), > -+ usbg_strerror(usbg_ret)); > -+ goto out1; > -+ } > -+ > -+ usbg_ret = usbg_create_gadget(s, "g1", &g_attrs, &g_strs, &g); > -+ if (usbg_ret != USBG_SUCCESS) { > -+ fprintf(stderr, "Error on create gadget\n"); > -+ fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), > -+ usbg_strerror(usbg_ret)); > -+ goto out2; > -+ } > -+ > -+ usbg_ret = usbg_create_function(g, USBG_F_UVC, "uvc", &uvc_attrs, &f_uvc); > -+ if(usbg_ret != USBG_SUCCESS) > -+ { > -+ fprintf(stderr, "Error creating uvc function\n"); > -+ fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), > -+ usbg_strerror(usbg_ret)); > -+ goto out2; > -+ } > -+ > -+ /* NULL can be passed to use kernel defaults */ > -+ usbg_ret = usbg_create_config(g, 1, "The only one", NULL, &c_strs, &c); > -+ if (usbg_ret != USBG_SUCCESS) { > -+ fprintf(stderr, "Error creating config\n"); > -+ fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), > -+ usbg_strerror(usbg_ret)); > -+ goto out2; > -+ } > -+ > -+ usbg_ret = usbg_add_config_function(c, "uvc.cam", f_uvc); > -+ if (usbg_ret != USBG_SUCCESS) { > -+ fprintf(stderr, "Error adding acm.GS0\n"); > -+ fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), > -+ usbg_strerror(usbg_ret)); > -+ goto out2; > -+ } > -+ > -+ usbg_ret = usbg_enable_gadget(g, DEFAULT_UDC); > -+ if (usbg_ret != USBG_SUCCESS) { > -+ fprintf(stderr, "Error enabling gadget\n"); > -+ fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), > -+ usbg_strerror(usbg_ret)); > -+ goto out2; > -+ } > -+ > -+ ret = 0; > -+ > -+out2: > -+ usbg_cleanup(s); > -+ > -+out1: > -+ return ret; > -+} > -diff --git a/include/usbg/function/uvc.h b/include/usbg/function/uvc.h > -new file mode 100644 > -index 000000000000..4c641dacdfcb > ---- /dev/null > -+++ b/include/usbg/function/uvc.h > -@@ -0,0 +1,90 @@ > -+/* > -+ * This library is free software; you can redistribute it and/or > -+ * modify it under the terms of the GNU Lesser General Public > -+ * License as published by the Free Software Foundation; either > -+ * version 2.1 of the License, or (at your option) any later version. > -+ * > -+ * This library is distributed in the hope that it will be useful, > -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of > -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > -+ * Lesser General Public License for more details. > -+ */ > -+ > -+#ifndef USBG_FUNCTION_UVC__ > -+#define USBG_FUNCTION_UVC__ > -+ > -+#include > -+ > -+#ifdef __cplusplus > -+extern "C" { > -+#endif > -+ > -+ > -+#define USBG_UVC_MAX_PATH_LENGTH 1024 > -+ > -+struct usbg_f_uvc; > -+typedef struct usbg_f_uvc usbg_f_uvc; > -+ > -+enum uvc_format > -+{ > -+ UVC_FORMAT_MJPEG, > -+ UVC_FORMAT_UNCOMPRESSED > -+}; > -+ > -+struct usbg_f_uvc_format_attrs > -+{ > -+ enum uvc_format format; > -+ const char *dwFrameInterval; > -+ int height; > -+ int width; > -+}; > -+ > -+struct usbg_f_uvc_attrs > -+{ > -+ struct usbg_f_uvc_format_attrs **formats; > -+}; > -+ > -+/** > -+ * @brief Cast from generic function to uvc function > -+ * @param[in] f function to be converted to uvc funciton. > -+ * Should be one of types: > -+ * ecm, subset, ncm, eem, rndis > -+ * @return Converted uvc function or NULL if function hasn't suitable type > -+ */ > -+usbg_f_uvc *usbg_to_uvc_function(usbg_function *f); > -+ > -+/** > -+ * @brief Cast form uvc function to generic one > -+ * @param[in] uvc function to be converted to generic one > -+ * @return Generic usbg function > -+ */ > -+usbg_function *usbg_from_uvc_function(usbg_f_uvc *ff); > -+ > -+/** > -+ * @brief Cleanup attributes structure after usage > -+ * @param[in] attrs to be cleaned up > -+ */ > -+static inline void usbg_f_uvc_cleanup_attrs(struct usbg_f_uvc_attrs *attrs) > -+{ > -+ struct usbg_f_uvc_format_attrs **format_attrs; > -+ int i; > -+ > -+ if (attrs) { > -+ for(format_attrs = attrs->formats, i = 0; format_attrs[i]; ++i) { > -+ if (format_attrs[i]) { > -+ free((char *)format_attrs[i]->dwFrameInterval); > -+ format_attrs[i]->dwFrameInterval = NULL; > -+ } > -+ } > -+ } > -+} > -+ > -+int usbg_f_uvc_get_attrs(usbg_f_uvc *uvcf, struct usbg_f_uvc_attrs *attrs); > -+int usbg_f_uvc_set_attrs(usbg_f_uvc *uvcf, const struct usbg_f_uvc_attrs *attrs); > -+ > -+ > -+#ifdef __cplusplus > -+} > -+#endif > -+ > -+#endif /* USBG_FUNCTION_UVC__ */ > -diff --git a/include/usbg/usbg.h b/include/usbg/usbg.h > -index 55c52a1c3768..de72793ddcf0 100644 > ---- a/include/usbg/usbg.h > -+++ b/include/usbg/usbg.h > -@@ -219,6 +219,7 @@ typedef enum > - USBG_F_LOOPBACK, > - USBG_F_HID, > - USBG_F_UAC2, > -+ USBG_F_UVC, > - USBG_FUNCTION_TYPE_MAX, > - } usbg_function_type; > - > -diff --git a/src/Makefile.am b/src/Makefile.am > -index 6b2726ec5219..c51878fac2ff 100644 > ---- a/src/Makefile.am > -+++ b/src/Makefile.am > -@@ -1,6 +1,6 @@ > - AUTOMAKE_OPTIONS = std-options subdir-objects > - lib_LTLIBRARIES = libusbgx.la > --libusbgx_la_SOURCES = usbg.c usbg_error.c usbg_common.c function/ether.c function/ffs.c function/midi.c function/ms.c function/phonet.c function/serial.c function/loopback.c function/hid.c function/uac2.c > -+libusbgx_la_SOURCES = usbg.c usbg_error.c usbg_common.c function/ether.c function/ffs.c function/midi.c function/ms.c function/phonet.c function/serial.c function/loopback.c function/hid.c function/uac2.c function/uvc.c > - if TEST_GADGET_SCHEMES > - libusbgx_la_SOURCES += usbg_schemes_libconfig.c usbg_common_libconfig.c > - else > -diff --git a/src/function/uvc.c b/src/function/uvc.c > -new file mode 100644 > -index 000000000000..92d738c5763c > ---- /dev/null > -+++ b/src/function/uvc.c > -@@ -0,0 +1,378 @@ > -+/* > -+ * This library is free software; you can redistribute it and/or > -+ * modify it under the terms of the GNU Lesser General Public > -+ * License as published by the Free Software Foundation; either > -+ * version 2.1 of the License, or (at your option) any later version. > -+ * > -+ * This library is distributed in the hope that it will be useful, > -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of > -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > -+ * Lesser General Public License for more details. > -+ */ > -+ > -+#include "usbg/usbg.h" > -+#include "usbg/usbg_internal.h" > -+#include "usbg/function/uvc.h" > -+ > -+#include > -+#include > -+#include > -+#include > -+#include > -+#ifdef HAS_GADGET_SCHEMES > -+#include > -+#endif > -+ > -+#define UVC_PATH_CONTROL "control" > -+#define UVC_PATH_HEADER "header/h" > -+#define UVC_PATH_CLASS_FS "class/fs/h" > -+#define UVC_PATH_CLASS_HS "class/hs/h" > -+#define UVC_PATH_CLASS_SS "class/ss/h" > -+#define UVC_PATH_STREAMING "streaming" > -+#define UVC_PATH_STREAMING_UNCOMPRESSED "uncompressed/u" > -+#define UVC_PATH_STREAMING_MJPEG "mjpeg/m" > -+ > -+struct usbg_f_uvc > -+{ > -+ struct usbg_function func; > -+}; > -+ > -+GENERIC_ALLOC_INST(uvc, struct usbg_f_uvc, func); > -+ > -+GENERIC_FREE_INST(uvc, struct usbg_f_uvc, func); > -+ > -+static int uvc_set_attrs(struct usbg_function *f, void *f_attrs) > -+{ > -+ return usbg_f_uvc_set_attrs(usbg_to_uvc_function(f), f_attrs); > -+} > -+ > -+static int uvc_get_attrs(struct usbg_function *f, void *f_attrs) > -+{ > -+ return usbg_f_uvc_get_attrs(usbg_to_uvc_function(f), f_attrs); > -+} > -+ > -+static void uvc_cleanup_attrs(struct usbg_function *f, void *f_attrs) > -+{ > -+ return usbg_f_uvc_cleanup_attrs(f_attrs); > -+} > -+ > -+static int uvc_libconfig_import(struct usbg_function *f, config_setting_t *root) > -+{ > -+ return USBG_SUCCESS; > -+} > -+ > -+static int uvc_libconfig_export(struct usbg_function *f, config_setting_t *root) > -+{ > -+ return USBG_SUCCESS; > -+} > -+ > -+static int uvc_create_dir(const char *path) > -+{ > -+ char tmp[USBG_MAX_PATH_LENGTH]; > -+ char *p = NULL; > -+ size_t len; > -+ int nmb, ret = USBG_SUCCESS; > -+ > -+ nmb = snprintf(tmp, sizeof(tmp), "%s", path); > -+ if(nmb >= sizeof(tmp)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ len = strlen(tmp); > -+ if(tmp[len - 1] == '/') > -+ tmp[len - 1] = 0; > -+ > -+ for (p = tmp + 1; *p; p++) { > -+ if(*p == '/') { > -+ *p = 0; > -+ if((mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) != 0) && errno != EEXIST) { > -+ ret = usbg_translate_error(errno); > -+ break; > -+ } > -+ *p = '/'; > -+ } > -+ } > -+ if(ret != USBG_SUCCESS) > -+ return ret; > -+ > -+ if((mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) != 0) && errno != EEXIST) > -+ return usbg_translate_error(errno); > -+} > -+ > -+static int uvc_link(char *path, char *to, char *from) > -+{ > -+ char oldname[USBG_MAX_PATH_LENGTH]; > -+ char newname[USBG_MAX_PATH_LENGTH]; > -+ int nmb; > -+ > -+ nmb = snprintf(oldname, sizeof(oldname), "%s/%s", path, to); > -+ if (nmb >= sizeof(oldname)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ nmb = snprintf(newname, sizeof(newname), "%s/%s", path, from); > -+ if (nmb >= sizeof(newname)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ if(symlink(oldname, newname)) > -+ return usbg_translate_error(errno); > -+} > -+ > -+static int uvc_set_class(char *func_path, char *cs) > -+{ > -+ int ret, nmb; > -+ char path[USBG_MAX_PATH_LENGTH]; > -+ char header_path[USBG_MAX_PATH_LENGTH]; > -+ > -+ nmb = snprintf(path, sizeof(path), "%s/%s", func_path, cs); > -+ if (nmb >= sizeof(path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ nmb = snprintf(header_path, sizeof(header_path), "%s/" UVC_PATH_HEADER, path); > -+ if (nmb >= sizeof(header_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ ret = uvc_create_dir(header_path); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ > -+ if (!strncmp(cs, UVC_PATH_STREAMING, strlen(UVC_PATH_STREAMING))) { > -+ char check_path[USBG_MAX_PATH_LENGTH]; > -+ struct stat buffer; > -+ > -+ nmb = snprintf(check_path, sizeof(check_path), "%s/" UVC_PATH_STREAMING_UNCOMPRESSED, path); > -+ if (nmb >= sizeof(check_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ ret = stat(check_path, &buffer); > -+ if (!ret) { > -+ ret = uvc_link(path, UVC_PATH_STREAMING_UNCOMPRESSED, "header/h/u"); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ } > -+ > -+ nmb = snprintf(check_path, sizeof(check_path), "%s/" UVC_PATH_STREAMING_MJPEG, path); > -+ if (nmb >= sizeof(check_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ ret = stat(check_path, &buffer); > -+ if (!ret) { > -+ ret = uvc_link(path, UVC_PATH_STREAMING_MJPEG, "header/h/m"); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ } > -+ > -+ ret = uvc_link(path, UVC_PATH_HEADER, UVC_PATH_CLASS_HS); > -+ if (ret) > -+ return ret; > -+ } > -+ > -+ ret = uvc_link(path, UVC_PATH_HEADER, UVC_PATH_CLASS_FS); > -+ if (ret) > -+ return ret; > -+ > -+ return uvc_link(path, UVC_PATH_HEADER, UVC_PATH_CLASS_SS); > -+} > -+ > -+static int uvc_set_frame(char *format_path, char *format, const struct usbg_f_uvc_format_attrs *attrs) > -+{ > -+ int nmb, ret, i; > -+ char frame_path[USBG_MAX_PATH_LENGTH]; > -+ char full_frame_path[USBG_MAX_PATH_LENGTH]; > -+ char frame_interval[USBG_MAX_PATH_LENGTH]; > -+ char frame_name[32]; > -+ > -+ nmb = snprintf(frame_name, sizeof(frame_name), "%dp", attrs->height); > -+ if (nmb >= sizeof(frame_name)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ nmb = snprintf(frame_path, sizeof(frame_path), "%s/%s", format_path, format); > -+ if (nmb >= sizeof(frame_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ nmb = snprintf(full_frame_path, sizeof(frame_path), "%s/%s", frame_path, frame_name); > -+ if (nmb >= sizeof(full_frame_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ ret = uvc_create_dir(full_frame_path); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ > -+ ret = usbg_write_string(frame_path, frame_name, "dwFrameInterval", attrs->dwFrameInterval); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ > -+ ret = usbg_write_dec(frame_path, frame_name, "wHeight", attrs->height); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ > -+ return usbg_write_dec(frame_path, frame_name, "wWidth", attrs->width); > -+} > -+ > -+static int uvc_set_streaming(char *func_path, const struct usbg_f_uvc_format_attrs *attrs) > -+{ > -+ char streaming_path[USBG_MAX_PATH_LENGTH]; > -+ int ret, nmb; > -+ > -+ nmb = snprintf(streaming_path, sizeof(streaming_path), "%s/" UVC_PATH_STREAMING, func_path); > -+ if (nmb >= sizeof(streaming_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ if (attrs->format == UVC_FORMAT_UNCOMPRESSED) > -+ ret = uvc_set_frame(streaming_path, UVC_PATH_STREAMING_UNCOMPRESSED, attrs); > -+ else > -+ ret = uvc_set_frame(streaming_path, UVC_PATH_STREAMING_MJPEG, attrs); > -+ > -+ return ret; > -+} > -+ > -+static int dir_nftw_cb(const char *pathname, const struct stat *sbuf, int type, struct FTW *ftwb) > -+{ > -+ (void) sbuf; > -+ (void) type; > -+ (void) ftwb; > -+ int ret; > -+ > -+ ret = remove(pathname); > -+ if (ret < -1) > -+ ERROR("failed to remove %s - %s", pathname, strerror(ret)); > -+ > -+ return 0; > -+} > -+ > -+int remove_dir(const char *dirpath) > -+{ > -+ const int max_open_descs = 8; > -+ int ret; > -+ > -+ ret = nftw(dirpath, dir_nftw_cb, max_open_descs, FTW_DEPTH | FTW_MOUNT | FTW_PHYS); > -+ if (ret < 0) { > -+ ERROR("nftw failed"); > -+ return ret; > -+ } > -+ > -+ return 0; > -+} > -+ > -+static int content_nftw_cb(const char *pathname, const struct stat *sbuf, int type, struct FTW *ftwb) > -+{ > -+ (void) sbuf; > -+ (void) type; > -+ (void) ftwb; > -+ int ret; > -+ > -+ if(ftwb->level == 0) > -+ return 0; > -+ > -+ ret = remove(pathname); > -+ if(ret < -1) > -+ ERROR("failed to remove %s - %s", pathname, strerror(ret)); > -+ > -+ return 0; > -+} > -+ > -+int remove_dir_content(const char *dirpath) > -+{ > -+ const int max_open_descs = 8; > -+ int ret; > -+ > -+ /* traverse in reverse order (handle directory after it's content), stay within the same file system and do not follow symbolic links */ > -+ ret = nftw(dirpath, content_nftw_cb, max_open_descs, FTW_DEPTH | FTW_MOUNT | FTW_PHYS); > -+ if (ret < 0) { > -+ ERROR("nftw failed"); > -+ return ret; > -+ } > -+ > -+ return 0; > -+} > -+ > -+static int uvc_remove(struct usbg_function *f, int opts) > -+{ > -+ usbg_f_uvc *uvcf = usbg_to_uvc_function(f); > -+ char streaming_path[USBG_MAX_PATH_LENGTH]; > -+ char control_path[USBG_MAX_PATH_LENGTH]; > -+ char path[USBG_UVC_MAX_PATH_LENGTH]; > -+ int nmb, ret = USBG_SUCCESS; > -+ > -+ nmb = snprintf(path, sizeof(path), "%s/%s", uvcf->func.path, uvcf->func.name); > -+ if (nmb >= sizeof(path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ nmb = snprintf(streaming_path, sizeof(streaming_path), "%s/streaming", path); > -+ if (nmb >= sizeof(streaming_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ nmb = snprintf(control_path, sizeof(control_path), "%s/control", path); > -+ if (nmb >= sizeof(control_path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ if(remove_dir_content(streaming_path) < 0) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ if(remove_dir_content(control_path) < 0) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ if(remove_dir(streaming_path) < 0) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ if(remove_dir(control_path) < 0) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ return 0; > -+}; > -+ > -+struct usbg_function_type usbg_f_type_uvc = { > -+ .name = "uvc", > -+ .alloc_inst = uvc_alloc_inst, > -+ .free_inst = uvc_free_inst, > -+ .set_attrs = uvc_set_attrs, > -+ .get_attrs = uvc_get_attrs, > -+ .cleanup_attrs = uvc_cleanup_attrs, > -+ .import = uvc_libconfig_import, > -+ .export = uvc_libconfig_export, > -+ .remove = uvc_remove, > -+}; > -+ > -+/* API implementation */ > -+ > -+usbg_f_uvc *usbg_to_uvc_function(usbg_function *f) > -+{ > -+ return f->ops == &usbg_f_type_uvc ? > -+ container_of(f, struct usbg_f_uvc, func) : NULL; > -+} > -+ > -+usbg_function *usbg_from_uvc_function(usbg_f_uvc *ff) > -+{ > -+ return &ff->func; > -+} > -+ > -+int usbg_f_uvc_get_attrs(usbg_f_uvc *uvcf, struct usbg_f_uvc_attrs *attrs) > -+{ > -+ return USBG_SUCCESS; > -+} > -+ > -+int usbg_f_uvc_set_attrs(usbg_f_uvc *uvcf, const struct usbg_f_uvc_attrs *attrs) > -+{ > -+ int nmb, ret = USBG_SUCCESS; > -+ char path[USBG_UVC_MAX_PATH_LENGTH]; > -+ struct usbg_f_uvc_format_attrs **format_attrs; > -+ int i; > -+ > -+ nmb = snprintf(path, sizeof(path), "%s/%s", uvcf->func.path, uvcf->func.name); > -+ if (nmb >= sizeof(path)) > -+ return USBG_ERROR_PATH_TOO_LONG; > -+ > -+ for(format_attrs = attrs->formats, i = 0; format_attrs[i]; ++i) { > -+ ret = uvc_set_streaming(path, format_attrs[i]); > -+ if(ret != USBG_SUCCESS) > -+ ERROR("Error: %d", ret); > -+ } > -+ > -+ ret = uvc_set_class(path, "control"); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ > -+ ret = uvc_set_class(path, "streaming"); > -+ if (ret != USBG_SUCCESS) > -+ return ret; > -+ > -+ return ret; > -+} > -diff --git a/src/usbg.c b/src/usbg.c > -index d2bf38160358..b298ddc50ecf 100644 > ---- a/src/usbg.c > -+++ b/src/usbg.c > -@@ -52,6 +52,7 @@ extern struct usbg_function_type usbg_f_type_phonet; > - extern struct usbg_function_type usbg_f_type_loopback; > - extern struct usbg_function_type usbg_f_type_hid; > - extern struct usbg_function_type usbg_f_type_uac2; > -+extern struct usbg_function_type usbg_f_type_uvc; > - > - /** > - * @var function_types > -@@ -73,6 +74,7 @@ struct usbg_function_type* function_types[] = { > - [USBG_F_LOOPBACK] = &usbg_f_type_loopback, > - [USBG_F_HID] = &usbg_f_type_hid, > - [USBG_F_UAC2] = &usbg_f_type_uac2, > -+ [USBG_F_UVC] = &usbg_f_type_uvc, > - }; > - > - ARRAY_SIZE_SENTINEL(function_types, USBG_FUNCTION_TYPE_MAX); > diff --git a/patches/libusbgx-0.2.0/autogen.sh b/patches/libusbgx-0.2.0/autogen.sh > deleted file mode 100755 > index 2459647bf..000000000 > --- a/patches/libusbgx-0.2.0/autogen.sh > +++ /dev/null > @@ -1,16 +0,0 @@ > -#!/bin/bash > - > -set -e > - > -aclocal $ACLOCAL_FLAGS > - > -libtoolize \ > - --force \ > - --copy > - > -autoreconf \ > - --force \ > - --install \ > - --warnings=syntax \ > - --warnings=obsolete \ > - --warnings=unsupported > diff --git a/patches/libusbgx-0.2.0/series b/patches/libusbgx-0.2.0/series > deleted file mode 100644 > index 406d15acc..000000000 > --- a/patches/libusbgx-0.2.0/series > +++ /dev/null > @@ -1,7 +0,0 @@ > -# generated by git-ptx-patches > -#tag:base --start-number 1 > -0001-Fix-39-Compilation-fails-on-gcc-v8.patch > -0002-libusbgx-fix-build-with-glibc-2.28-since-sys-sysmacr.patch > -0003-examples-gadget-vid-pid-remove-add-dynamic-vid-pid-s.patch > -0004-libusbgx-Add-UVC-support.patch > -# 55b4c63ca7f6b97ceb9cd9588e1eacdd - git-ptx-patches magic > diff --git a/rules/libusbgx.in b/rules/libusbgx.in > index e576f842e..95e92a04c 100644 > --- a/rules/libusbgx.in > +++ b/rules/libusbgx.in > @@ -2,6 +2,7 @@ > > menuconfig LIBUSBGX > bool > + select HOST_MESON > select LIBCONFIG if LIBUSBGX_SCHEMES > prompt "libusbgx " > help > diff --git a/rules/libusbgx.make b/rules/libusbgx.make > index f6ccb6e9b..78128fd0a 100644 > --- a/rules/libusbgx.make > +++ b/rules/libusbgx.make > @@ -14,11 +14,11 @@ PACKAGES-$(PTXCONF_LIBUSBGX) += libusbgx > # > # Paths and names > # > -LIBUSBGX_VERSION := 0.2.0 > -LIBUSBGX_MD5 := a8ea2234c6355ac8ad2ca86c453297bd > +LIBUSBGX_VERSION := 0.3.0 > +LIBUSBGX_MD5 := f2ca9c639e6fc6ee9dbecb545fa61637 > LIBUSBGX := libusbgx-$(LIBUSBGX_VERSION) > -LIBUSBGX_SUFFIX := zip > -LIBUSBGX_URL := https://github.com/libusbgx/libusbgx/archive/refs/tags/libusbgx-v$(LIBUSBGX_VERSION).zip > +LIBUSBGX_SUFFIX := tar.gz > +LIBUSBGX_URL := https://github.com/linux-usb-gadgets/libusbgx/archive/refs/tags/libusbgx-v$(LIBUSBGX_VERSION).$(LIBUSBGX_SUFFIX) > LIBUSBGX_SOURCE := $(SRCDIR)/$(LIBUSBGX).$(LIBUSBGX_SUFFIX) > LIBUSBGX_DIR := $(BUILDDIR)/$(LIBUSBGX) > LIBUSBGX_LICENSE := GPL-2.0-or-later AND LGPL-2.1-or-later > @@ -32,18 +32,16 @@ LIBUSBGX_LICENSE_FILES := \ > # Prepare > # ---------------------------------------------------------------------------- > > -LIBUSBGX_CONF_ENV := $(CROSS_ENV) > - > # > -# autoconf > +# meson > # > -LIBUSBGX_CONF_TOOL := autoconf > +LIBUSBGX_CONF_TOOL := meson > LIBUSBGX_CONF_OPT := \ > - $(CROSS_AUTOCONF_USR) \ > - --$(call ptx/wwo, PTXCONF_LIBUSBGX_SCHEMES)-libconfig \ > - --enable-examples \ > - --$(call ptx/endis, PTXCONF_LIBUSBGX_SCHEMES)-gadget-schemes \ > - --disable-doxygen-doc > + $(CROSS_MESON_USR) \ > + -Dexamples=true \ > + -Dtests=disabled \ > + -Dgadget-schemes=$(call ptx/endis, PTXCONF_LIBUSBGX_SCHEMES)d \ > + -Ddoxygen=disabled > > # ---------------------------------------------------------------------------- > # Target-Install > -- > 2.39.5 > > >