mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 13:10:19 +00:00
676c1b319f
This idea was inspired by: https://github.com/PointCloudLibrary/mobile/blob/master/3rdparty/android/patches/libusb.patch The whole thing is re-written from scratch but the idea came from there, and its a way simpler way of getting a system-opened fd to the right place than patching every call in the stack to pass a fd down. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
94 lines
2.6 KiB
Diff
94 lines
2.6 KiB
Diff
diff -ur libusb-1.0.19.orig/libusb/libusb.h libusb-1.0.19/libusb/libusb.h
|
|
--- libusb-1.0.19.orig/libusb/libusb.h 2014-06-13 20:31:35.000000000 +0200
|
|
+++ libusb-1.0.19/libusb/libusb.h 2015-08-20 22:26:15.851840655 +0200
|
|
@@ -1991,6 +1991,14 @@
|
|
void LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx,
|
|
libusb_hotplug_callback_handle handle);
|
|
|
|
+#ifdef __ANDROID__
|
|
+typedef int (*libusb_android_open_callback_func)(uint16_t idVendor, uint16_t idProduct);
|
|
+/* Make the darn thing ifdef'able */
|
|
+#define libusb_android_open_callback_func libusb_android_open_callback_func
|
|
+
|
|
+void libusb_set_android_open_callback(libusb_android_open_callback_func aocf);
|
|
+#endif
|
|
+
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
diff -ur libusb-1.0.19.orig/libusb/os/linux_usbfs.c libusb-1.0.19/libusb/os/linux_usbfs.c
|
|
--- libusb-1.0.19.orig/libusb/os/linux_usbfs.c 2014-06-13 20:31:35.000000000 +0200
|
|
+++ libusb-1.0.19/libusb/os/linux_usbfs.c 2015-08-20 22:24:26.841479417 +0200
|
|
@@ -179,6 +179,14 @@
|
|
int iso_packet_offset;
|
|
};
|
|
|
|
+#ifdef __ANDROID__
|
|
+static libusb_android_open_callback_func _android_open_callback = NULL;
|
|
+
|
|
+void libusb_set_android_open_callback(libusb_android_open_callback_func aocf) {
|
|
+ _android_open_callback = aocf;
|
|
+}
|
|
+#endif
|
|
+
|
|
static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent)
|
|
{
|
|
struct libusb_context *ctx = DEVICE_CTX(dev);
|
|
@@ -186,14 +194,25 @@
|
|
int fd;
|
|
int delay = 10000;
|
|
|
|
+#ifndef __ANDROID__
|
|
if (usbdev_names)
|
|
snprintf(path, PATH_MAX, "%s/usbdev%d.%d",
|
|
usbfs_path, dev->bus_number, dev->device_address);
|
|
else
|
|
snprintf(path, PATH_MAX, "%s/%03d/%03d",
|
|
usbfs_path, dev->bus_number, dev->device_address);
|
|
+#endif
|
|
|
|
+#ifdef __ANDROID__
|
|
+ if (_android_open_callback) {
|
|
+ fd = _android_open_callback(dev->device_descriptor.idVendor, dev->device_descriptor.idProduct);
|
|
+ } else {
|
|
+ usbi_err(ctx, "_android_open_callback not set");
|
|
+ return LIBUSB_ERROR_OTHER;
|
|
+ }
|
|
+#else
|
|
fd = open(path, mode);
|
|
+#endif
|
|
if (fd != -1)
|
|
return fd; /* Success */
|
|
|
|
@@ -369,11 +388,13 @@
|
|
struct stat statbuf;
|
|
int r;
|
|
|
|
+#ifndef __ANDROID__
|
|
usbfs_path = find_usbfs_path();
|
|
if (!usbfs_path) {
|
|
usbi_err(ctx, "could not find usbfs");
|
|
return LIBUSB_ERROR_OTHER;
|
|
}
|
|
+#endif
|
|
|
|
if (monotonic_clkid == -1)
|
|
monotonic_clkid = find_monotonic_clock();
|
|
@@ -469,6 +490,8 @@
|
|
{
|
|
#if defined(USE_UDEV)
|
|
return linux_udev_start_event_monitor();
|
|
+#elif __ANDROID__
|
|
+ return LIBUSB_SUCCESS;
|
|
#else
|
|
return linux_netlink_start_event_monitor();
|
|
#endif
|
|
@@ -478,6 +501,8 @@
|
|
{
|
|
#if defined(USE_UDEV)
|
|
return linux_udev_stop_event_monitor();
|
|
+#elif __ANDROID__
|
|
+ return LIBUSB_SUCCESS;
|
|
#else
|
|
return linux_netlink_stop_event_monitor();
|
|
#endif
|