summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/android.cpp b/android.cpp
index 0b4aadb27..4e2b2b1d3 100644
--- a/android.cpp
+++ b/android.cpp
@@ -8,6 +8,10 @@
#include <QtAndroidExtras/QtAndroidExtras>
#include <QtAndroidExtras/QAndroidJniObject>
+#include <QtAndroid>
+
+#define FTDI_VID 0x0403
+#define USB_SERVICE "usb"
extern "C" {
@@ -51,6 +55,81 @@ int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
return -1;
}
+/**
+ * Get the file descriptor of first available ftdi device attached to usb in android.
+ * This is needed for dc_device_open on android.
+ *
+ * return
+ * -1 : No Usb Device is attached.
+ * -2 : No ftdi device found.
+ * -3 : No permission for using the device
+ * -4 : Error while opening the device.
+ * +ve num : Successfully extracted file descriptor is returned.
+ * */
+int get_usb_fd()
+{
+ int i;
+ jint fd, vendorid, productid;
+ QAndroidJniObject usbName, usbDevice;
+
+ // Get the current main activity of the application.
+ QAndroidJniObject activity = QtAndroid::androidActivity();
+
+ QAndroidJniObject usb_service = QAndroidJniObject::fromString(USB_SERVICE);
+
+ // Get UsbManager from activity
+ QAndroidJniObject usbManager = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;", usb_service.object());
+
+ // Get a HashMap<Name, UsbDevice> of all USB devices attached to Android
+ QAndroidJniObject deviceMap = usbManager.callObjectMethod("getDeviceList", "()Ljava/util/HashMap;");
+ jint num_devices = deviceMap.callMethod<jint>("size", "()I");
+ if (num_devices == 0) {
+ // No USB device is attached.
+ return -1;
+ }
+
+ // Iterate over all the devices and find the first available FTDI device.
+ QAndroidJniObject keySet = deviceMap.callObjectMethod("keySet", "()Ljava/util/Set;");
+ QAndroidJniObject iterator = keySet.callObjectMethod("iterator", "()Ljava/util/Iterator;");
+
+ for (i = 0; i < num_devices; i++) {
+ usbName = iterator.callObjectMethod("next", "()Ljava/lang/Object;");
+ usbDevice = deviceMap.callObjectMethod ("get", "(Ljava/lang/Object;)Ljava/lang/Object;", usbName.object());
+ vendorid = usbDevice.callMethod<jint>("getVendorId", "()I");
+ productid = usbDevice.callMethod<jint>("getProductId", "()I");
+ if(vendorid == FTDI_VID) // Found a FTDI device. Break.
+ break;
+ }
+ if (i == num_devices) {
+ // No ftdi device found.
+ return -2;
+ }
+
+ jboolean hasPermission = usbManager.callMethod<jboolean>("hasPermission", "(Landroid/hardware/usb/UsbDevice;)Z", usbDevice.object());
+ if (!hasPermission) {
+ // You do not have permission to use the usbDevice.
+ // Please remove and reinsert the USB device.
+ // Could also give an dialogbox asking for permission.
+ return -3;
+ }
+
+ // An FTDI device is present and we also have permission to use the device.
+ // Open the device and get its file descriptor.
+ QAndroidJniObject usbDeviceConnection = usbManager.callObjectMethod("openDevice", "(Landroid/hardware/usb/UsbDevice;)Landroid/hardware/usb/UsbDeviceConnection;", usbDevice.object());
+ if (usbDeviceConnection.object() == NULL) {
+ // Some error occurred while opening the device. Exit.
+ return -4;
+ }
+
+ // Finally get the required file descriptor.
+ fd = usbDeviceConnection.callMethod<jint>("getFileDescriptor", "()I");
+ if (fd == -1) {
+ // The device is not opened. Some error.
+ return -4;
+ }
+ return fd;
+}
+
/* NOP wrappers to comform with windows.c */
int subsurface_rename(const char *path, const char *newpath)
{