diff options
-rw-r--r-- | api/current.xml | 11 | ||||
-rw-r--r-- | core/java/android/hardware/usb/UsbDeviceConnection.java | 12 | ||||
-rw-r--r-- | core/jni/android_hardware_UsbDeviceConnection.cpp | 22 |
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", |