mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
* [ptxdist] [PATCH v2] libusbgx: update to release 0.3.0
@ 2024-10-01 20:45 Michael Grzeschik
  2024-10-02  7:33 ` Michael Tretter
  0 siblings, 1 reply; 3+ messages in thread
From: Michael Grzeschik @ 2024-10-01 20:45 UTC (permalink / raw)
  To: ptxdist

Since libusbgx was released to version 0.3.0 we update the rule.

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 <m.grzeschik@pengutronix.de>

---
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 <fuga@studiofuga.com>
-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 <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-+#include <sys/sysmacros.h>
- 
- 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 <gwenhael.goavec-merou@trabucayre.com>
-Date: Mon, 10 Sep 2018 15:52:09 +0200
-Subject: [PATCH] libusbgx: fix build with glibc-2.28 since <sys/sysmacros.h>
- is no more included by <sys/types.h>
-
-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 <k.opasiak@samsung.com>
----
- 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 <errno.h>
- #include <stdio.h>
-+#include <sys/sysmacros.h>
- #include <linux/usb/ch9.h>
- #include <usbg/usbg.h>
- 
-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 <errno.h>
- #include <string.h>
- #include <stdio.h>
-+#include <sys/sysmacros.h>
- #include <usbg/usbg.h>
- 
- 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 <errno.h>
- #include <stdio.h>
-+#include <sys/sysmacros.h>
- #include <linux/usb/ch9.h>
- #include <usbg/usbg.h>
- #include <usbg/function/ms.h>
-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 <errno.h>
- #include <stdio.h>
- #include <string.h>
-+#include <sys/sysmacros.h>
- #include <netinet/ether.h>
- #include <usbg/usbg.h>
- #include <usbg/function/ms.h>
-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 <errno.h>
- #include <stdio.h>
-+#include <sys/sysmacros.h>
- #include <usbg/usbg.h>
- 
- 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 <sys/sysmacros.h>
- #include <libconfig.h>
- #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 <m.grzeschik@pengutronix.de>
-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 <m.grzeschik@pengutronix.de>
----
- 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 <errno.h>
- #include <stdio.h>
-+#include <string.h>
-+#include <stdlib.h>
- #include <usbg/usbg.h>
- 
--#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 <thomas.haemmerle@wolfvision.net>
-Date: Wed, 8 Jan 2020 14:43:45 +0100
-Subject: [PATCH] libusbgx: Add UVC support
-
-Signed-off-by: Thomas Haemmerle <thomas.haemmerle@wolfvision.net>
-Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
-
-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 <mgr@pengutronix.de>
-+ *
-+ * 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 <errno.h>
-+#include <stdio.h>
-+#include <sys/sysmacros.h>
-+#include <linux/usb/ch9.h>
-+#include <usbg/usbg.h>
-+#include <usbg/function/uvc.h>
-+
-+/**
-+ * @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 <usbg/usbg.h>
-+
-+#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 <errno.h>
-+#include <sys/stat.h>
-+#include <unistd.h>
-+#include <malloc.h>
-+#include <ftw.h>
-+#ifdef HAS_GADGET_SCHEMES
-+#include <libconfig.h>
-+#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




^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [ptxdist] [PATCH v2] libusbgx: update to release 0.3.0
  2024-10-01 20:45 [ptxdist] [PATCH v2] libusbgx: update to release 0.3.0 Michael Grzeschik
@ 2024-10-02  7:33 ` Michael Tretter
  2024-10-02 11:49   ` Michael Grzeschik
  0 siblings, 1 reply; 3+ messages in thread
From: Michael Tretter @ 2024-10-02  7:33 UTC (permalink / raw)
  To: ptxdist

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 <m.grzeschik@pengutronix.de>

Reviewed-by: Michael Tretter <m.tretter@pengutronix.de>

> 
> ---
> 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 <fuga@studiofuga.com>
> -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 <stdio.h>
> - #include <stdlib.h>
> - #include <unistd.h>
> -+#include <sys/sysmacros.h>
> - 
> - 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 <gwenhael.goavec-merou@trabucayre.com>
> -Date: Mon, 10 Sep 2018 15:52:09 +0200
> -Subject: [PATCH] libusbgx: fix build with glibc-2.28 since <sys/sysmacros.h>
> - is no more included by <sys/types.h>
> -
> -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 <k.opasiak@samsung.com>
> ----
> - 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 <errno.h>
> - #include <stdio.h>
> -+#include <sys/sysmacros.h>
> - #include <linux/usb/ch9.h>
> - #include <usbg/usbg.h>
> - 
> -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 <errno.h>
> - #include <string.h>
> - #include <stdio.h>
> -+#include <sys/sysmacros.h>
> - #include <usbg/usbg.h>
> - 
> - 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 <errno.h>
> - #include <stdio.h>
> -+#include <sys/sysmacros.h>
> - #include <linux/usb/ch9.h>
> - #include <usbg/usbg.h>
> - #include <usbg/function/ms.h>
> -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 <errno.h>
> - #include <stdio.h>
> - #include <string.h>
> -+#include <sys/sysmacros.h>
> - #include <netinet/ether.h>
> - #include <usbg/usbg.h>
> - #include <usbg/function/ms.h>
> -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 <errno.h>
> - #include <stdio.h>
> -+#include <sys/sysmacros.h>
> - #include <usbg/usbg.h>
> - 
> - 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 <sys/sysmacros.h>
> - #include <libconfig.h>
> - #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 <m.grzeschik@pengutronix.de>
> -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 <m.grzeschik@pengutronix.de>
> ----
> - 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 <errno.h>
> - #include <stdio.h>
> -+#include <string.h>
> -+#include <stdlib.h>
> - #include <usbg/usbg.h>
> - 
> --#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 <thomas.haemmerle@wolfvision.net>
> -Date: Wed, 8 Jan 2020 14:43:45 +0100
> -Subject: [PATCH] libusbgx: Add UVC support
> -
> -Signed-off-by: Thomas Haemmerle <thomas.haemmerle@wolfvision.net>
> -Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> -
> -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 <mgr@pengutronix.de>
> -+ *
> -+ * 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 <errno.h>
> -+#include <stdio.h>
> -+#include <sys/sysmacros.h>
> -+#include <linux/usb/ch9.h>
> -+#include <usbg/usbg.h>
> -+#include <usbg/function/uvc.h>
> -+
> -+/**
> -+ * @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 <usbg/usbg.h>
> -+
> -+#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 <errno.h>
> -+#include <sys/stat.h>
> -+#include <unistd.h>
> -+#include <malloc.h>
> -+#include <ftw.h>
> -+#ifdef HAS_GADGET_SCHEMES
> -+#include <libconfig.h>
> -+#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
> 
> 
> 



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [ptxdist] [PATCH v2] libusbgx: update to release 0.3.0
  2024-10-02  7:33 ` Michael Tretter
@ 2024-10-02 11:49   ` Michael Grzeschik
  0 siblings, 0 replies; 3+ messages in thread
From: Michael Grzeschik @ 2024-10-02 11:49 UTC (permalink / raw)
  To: ptxdist

[-- Attachment #1: Type: text/plain, Size: 38495 bytes --]

On Wed, Oct 02, 2024 at 09:33:34AM +0200, Michael Tretter wrote:
>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.
>

What is so atypical to use "we" in an commit message?

Just type the following command in any opensource project of your choice
(including ptxdist) and be taught better.

git log --patch --grep "we "

If the unusal wording for the version "bump" as you say, would be a
breaker for the project to be commited, I think this would not be
very welcoming for people to contribute and is a bit to pedantic IMHO.

>> 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 <m.grzeschik@pengutronix.de>
>
>Reviewed-by: Michael Tretter <m.tretter@pengutronix.de>

Thanks for the review.

Michael

>>
>> ---
>> 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 <fuga@studiofuga.com>
>> -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 <stdio.h>
>> - #include <stdlib.h>
>> - #include <unistd.h>
>> -+#include <sys/sysmacros.h>
>> -
>> - 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 <gwenhael.goavec-merou@trabucayre.com>
>> -Date: Mon, 10 Sep 2018 15:52:09 +0200
>> -Subject: [PATCH] libusbgx: fix build with glibc-2.28 since <sys/sysmacros.h>
>> - is no more included by <sys/types.h>
>> -
>> -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 <k.opasiak@samsung.com>
>> ----
>> - 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 <errno.h>
>> - #include <stdio.h>
>> -+#include <sys/sysmacros.h>
>> - #include <linux/usb/ch9.h>
>> - #include <usbg/usbg.h>
>> -
>> -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 <errno.h>
>> - #include <string.h>
>> - #include <stdio.h>
>> -+#include <sys/sysmacros.h>
>> - #include <usbg/usbg.h>
>> -
>> - 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 <errno.h>
>> - #include <stdio.h>
>> -+#include <sys/sysmacros.h>
>> - #include <linux/usb/ch9.h>
>> - #include <usbg/usbg.h>
>> - #include <usbg/function/ms.h>
>> -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 <errno.h>
>> - #include <stdio.h>
>> - #include <string.h>
>> -+#include <sys/sysmacros.h>
>> - #include <netinet/ether.h>
>> - #include <usbg/usbg.h>
>> - #include <usbg/function/ms.h>
>> -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 <errno.h>
>> - #include <stdio.h>
>> -+#include <sys/sysmacros.h>
>> - #include <usbg/usbg.h>
>> -
>> - 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 <sys/sysmacros.h>
>> - #include <libconfig.h>
>> - #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 <m.grzeschik@pengutronix.de>
>> -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 <m.grzeschik@pengutronix.de>
>> ----
>> - 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 <errno.h>
>> - #include <stdio.h>
>> -+#include <string.h>
>> -+#include <stdlib.h>
>> - #include <usbg/usbg.h>
>> -
>> --#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 <thomas.haemmerle@wolfvision.net>
>> -Date: Wed, 8 Jan 2020 14:43:45 +0100
>> -Subject: [PATCH] libusbgx: Add UVC support
>> -
>> -Signed-off-by: Thomas Haemmerle <thomas.haemmerle@wolfvision.net>
>> -Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
>> -
>> -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 <mgr@pengutronix.de>
>> -+ *
>> -+ * 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 <errno.h>
>> -+#include <stdio.h>
>> -+#include <sys/sysmacros.h>
>> -+#include <linux/usb/ch9.h>
>> -+#include <usbg/usbg.h>
>> -+#include <usbg/function/uvc.h>
>> -+
>> -+/**
>> -+ * @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 <usbg/usbg.h>
>> -+
>> -+#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 <errno.h>
>> -+#include <sys/stat.h>
>> -+#include <unistd.h>
>> -+#include <malloc.h>
>> -+#include <ftw.h>
>> -+#ifdef HAS_GADGET_SCHEMES
>> -+#include <libconfig.h>
>> -+#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
>>
>>
>>
>
>

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-10-02 11:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-01 20:45 [ptxdist] [PATCH v2] libusbgx: update to release 0.3.0 Michael Grzeschik
2024-10-02  7:33 ` Michael Tretter
2024-10-02 11:49   ` Michael Grzeschik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox