mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
From: Michael Tretter <m.tretter@pengutronix.de>
To: ptxdist@pengutronix.de
Subject: Re: [ptxdist] [PATCH v2] libusbgx: update to release 0.3.0
Date: Wed, 2 Oct 2024 09:33:34 +0200	[thread overview]
Message-ID: <Zvz3Tk7v3A6Tepb2@pengutronix.de> (raw)
In-Reply-To: <20241001204544.3481279-1-m.grzeschik@pengutronix.de>

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
> 
> 
> 



  reply	other threads:[~2024-10-02  7:33 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-01 20:45 Michael Grzeschik
2024-10-02  7:33 ` Michael Tretter [this message]
2024-10-02 11:49   ` Michael Grzeschik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Zvz3Tk7v3A6Tepb2@pengutronix.de \
    --to=m.tretter@pengutronix.de \
    --cc=ptxdist@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox