summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.xml11
-rw-r--r--core/java/android/hardware/usb/UsbDeviceConnection.java12
-rw-r--r--core/jni/android_hardware_UsbDeviceConnection.cpp22
3 files changed, 45 insertions, 0 deletions
diff --git a/api/current.xml b/api/current.xml
index e669a99..a906d24 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -95449,6 +95449,17 @@
visibility="public"
>
</method>
+<method name="getRawDescriptors"
+ return="byte[]"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getSerial"
return="java.lang.String"
abstract="false"
diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java
index a153c0b..b536490 100644
--- a/core/java/android/hardware/usb/UsbDeviceConnection.java
+++ b/core/java/android/hardware/usb/UsbDeviceConnection.java
@@ -69,6 +69,17 @@ public class UsbDeviceConnection {
}
/**
+ * Returns the raw USB descriptors for the device.
+ * This can be used to access descriptors not supported directly
+ * via the higher level APIs.
+ *
+ * @return raw USB descriptors
+ */
+ public byte[] getRawDescriptors() {
+ return native_get_desc();
+ }
+
+ /**
* Claims exclusive access to a {@link android.hardware.usb.UsbInterface}.
* This must be done before sending or receiving data on any
* {@link android.hardware.usb.UsbEndpoint}s belonging to the interface.
@@ -160,6 +171,7 @@ public class UsbDeviceConnection {
private native boolean native_open(String deviceName, FileDescriptor pfd);
private native void native_close();
private native int native_get_fd();
+ private native byte[] native_get_desc();
private native boolean native_claim_interface(int interfaceID, boolean force);
private native boolean native_release_interface(int interfaceID);
private native int native_control_request(int requestType, int request, int value,
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp
index ec36a38..b5d6b91 100644
--- a/core/jni/android_hardware_UsbDeviceConnection.cpp
+++ b/core/jni/android_hardware_UsbDeviceConnection.cpp
@@ -83,6 +83,27 @@ android_hardware_UsbDeviceConnection_get_fd(JNIEnv *env, jobject thiz)
return usb_device_get_fd(device);
}
+static jbyteArray
+android_hardware_UsbDeviceConnection_get_desc(JNIEnv *env, jobject thiz)
+{
+ char buffer[16384];
+ int fd = android_hardware_UsbDeviceConnection_get_fd(env, thiz);
+ if (fd < 0) return NULL;
+ lseek(fd, 0, SEEK_SET);
+ int length = read(fd, buffer, sizeof(buffer));
+ if (length < 0) return NULL;
+
+ jbyteArray ret = env->NewByteArray(length);
+ if (ret) {
+ jbyte* bytes = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0);
+ if (bytes) {
+ memcpy(bytes, buffer, length);
+ env->ReleasePrimitiveArrayCritical(ret, bytes, 0);
+ }
+ }
+ return ret;
+}
+
static jboolean
android_hardware_UsbDeviceConnection_claim_interface(JNIEnv *env, jobject thiz,
int interfaceID, jboolean force)
@@ -211,6 +232,7 @@ static JNINativeMethod method_table[] = {
(void *)android_hardware_UsbDeviceConnection_open},
{"native_close", "()V", (void *)android_hardware_UsbDeviceConnection_close},
{"native_get_fd", "()I", (void *)android_hardware_UsbDeviceConnection_get_fd},
+ {"native_get_desc", "()[B", (void *)android_hardware_UsbDeviceConnection_get_desc},
{"native_claim_interface", "(IZ)Z",(void *)android_hardware_UsbDeviceConnection_claim_interface},
{"native_release_interface","(I)Z", (void *)android_hardware_UsbDeviceConnection_release_interface},
{"native_control_request", "(IIII[BII)I",