summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2011-01-27 10:47:40 -0800
committerMike Lockwood <lockwood@android.com>2011-01-27 16:22:15 -0800
commit1fce24b241e386af19ba7c5bc29af5d18461f4ff (patch)
treefa61c49409b571c28e1dbee1522d1b11354f22db
parent05b536e671b60740a47c37e8be6adbfff6fad3eb (diff)
downloadframeworks_base-1fce24b241e386af19ba7c5bc29af5d18461f4ff.zip
frameworks_base-1fce24b241e386af19ba7c5bc29af5d18461f4ff.tar.gz
frameworks_base-1fce24b241e386af19ba7c5bc29af5d18461f4ff.tar.bz2
Add support for synchronous bulk USB transfers
Change-Id: Id5de49e4d728a702fa1583ecc24f83f36cc57d21 Signed-off-by: Mike Lockwood <lockwood@android.com>
-rw-r--r--api/current.xml67
-rw-r--r--core/java/android/hardware/UsbDevice.java30
-rw-r--r--core/jni/android_hardware_UsbDevice.cpp37
-rw-r--r--media/mtp/MtpDevice.cpp10
4 files changed, 108 insertions, 36 deletions
diff --git a/api/current.xml b/api/current.xml
index af67575..17ce81f 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -94377,6 +94377,25 @@
>
<implements name="android.os.Parcelable">
</implements>
+<method name="bulkTransfer"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="endpoint" type="android.hardware.UsbEndpoint">
+</parameter>
+<parameter name="buffer" type="byte[]">
+</parameter>
+<parameter name="length" type="int">
+</parameter>
+<parameter name="timeout" type="int">
+</parameter>
+</method>
<method name="claimInterface"
return="boolean"
abstract="false"
@@ -94403,6 +94422,31 @@
visibility="public"
>
</method>
+<method name="controlTransfer"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="requestType" type="int">
+</parameter>
+<parameter name="request" type="int">
+</parameter>
+<parameter name="value" type="int">
+</parameter>
+<parameter name="index" type="int">
+</parameter>
+<parameter name="buffer" type="byte[]">
+</parameter>
+<parameter name="length" type="int">
+</parameter>
+<parameter name="timeout" type="int">
+</parameter>
+</method>
<method name="describeContents"
return="int"
abstract="false"
@@ -94587,29 +94631,6 @@
visibility="public"
>
</method>
-<method name="sendControlRequest"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="requestType" type="int">
-</parameter>
-<parameter name="request" type="int">
-</parameter>
-<parameter name="value" type="int">
-</parameter>
-<parameter name="index" type="int">
-</parameter>
-<parameter name="buffer" type="byte[]">
-</parameter>
-<parameter name="length" type="int">
-</parameter>
-</method>
<method name="writeToParcel"
return="void"
abstract="false"
diff --git a/core/java/android/hardware/UsbDevice.java b/core/java/android/hardware/UsbDevice.java
index e6b38be..ca7dae3 100644
--- a/core/java/android/hardware/UsbDevice.java
+++ b/core/java/android/hardware/UsbDevice.java
@@ -193,6 +193,11 @@ public final class UsbDevice implements Parcelable {
/**
* Performs a control transaction on endpoint zero for this device.
+ * The direction of the transfer is determined by the request type.
+ * If requestType & {@link UsbConstants#USB_ENDPOINT_DIR_MASK} is
+ * {@link UsbConstants#USB_DIR_OUT}, then the transfer is a write,
+ * and if it is {@link UsbConstants#USB_DIR_IN}, then the transfer
+ * is a read.
*
* @param requestType request type for this transaction
* @param request request ID for this transaction
@@ -201,12 +206,28 @@ public final class UsbDevice implements Parcelable {
* @param buffer buffer for data portion of transaction,
* or null if no data needs to be sent or received
* @param length the length of the data to send or receive
+ * @param timeout in milliseconds
* @return length of data transferred (or zero) for success,
* or negative value for failure
*/
- public int sendControlRequest(int requestType, int request, int value,
- int index, byte[] buffer, int length) {
- return native_control_request(requestType, request, value, index, buffer, length);
+ public int controlTransfer(int requestType, int request, int value,
+ int index, byte[] buffer, int length, int timeout) {
+ return native_control_request(requestType, request, value, index, buffer, length, timeout);
+ }
+
+ /**
+ * Performs a bulk transaction on the given endpoint.
+ * The direction of the transfer is determined by the direction of the endpoint
+ *
+ * @param endpoint the endpoint for this transaction
+ * @param buffer buffer for data to send or receive,
+ * @param length the length of the data to send or receive
+ * @param timeout in milliseconds
+ * @return length of data transferred (or zero) for success,
+ * or negative value for failure
+ */
+ public int bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout) {
+ return native_bulk_request(endpoint.getAddress(), buffer, length, timeout);
}
/**
@@ -305,7 +326,8 @@ public final class UsbDevice implements Parcelable {
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,
- int index, byte[] buffer, int length);
+ int index, byte[] buffer, int length, int timeout);
+ private native int native_bulk_request(int endpoint, byte[] buffer, int length, int timeout);
private native UsbRequest native_request_wait();
private native String native_get_serial();
diff --git a/core/jni/android_hardware_UsbDevice.cpp b/core/jni/android_hardware_UsbDevice.cpp
index 4bc9154..9014450 100644
--- a/core/jni/android_hardware_UsbDevice.cpp
+++ b/core/jni/android_hardware_UsbDevice.cpp
@@ -123,7 +123,7 @@ android_hardware_UsbDevice_release_interface(JNIEnv *env, jobject thiz, int inte
static jint
android_hardware_UsbDevice_control_request(JNIEnv *env, jobject thiz,
jint requestType, jint request, jint value, jint index,
- jbyteArray buffer, jint length)
+ jbyteArray buffer, jint length, jint timeout)
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
@@ -140,8 +140,35 @@ android_hardware_UsbDevice_control_request(JNIEnv *env, jobject thiz,
bufferBytes = env->GetByteArrayElements(buffer, 0);
}
- jint result = usb_device_send_control(device, requestType, request,
- value, index, length, bufferBytes);
+ jint result = usb_device_control_transfer(device, requestType, request,
+ value, index, bufferBytes, length, timeout);
+
+ if (bufferBytes)
+ env->ReleaseByteArrayElements(buffer, bufferBytes, 0);
+
+ return result;
+}
+
+static jint
+android_hardware_UsbDevice_bulk_request(JNIEnv *env, jobject thiz,
+ jint endpoint, jbyteArray buffer, jint length, jint timeout)
+{
+ struct usb_device* device = get_device_from_object(env, thiz);
+ if (!device) {
+ LOGE("device is closed in native_control_request");
+ return -1;
+ }
+
+ jbyte* bufferBytes = NULL;
+ if (buffer) {
+ if (env->GetArrayLength(buffer) < length) {
+ env->ThrowNew(env->FindClass("java/lang/ArrayIndexOutOfBoundsException"), NULL);
+ return -1;
+ }
+ bufferBytes = env->GetByteArrayElements(buffer, 0);
+ }
+
+ jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes, length, timeout);
if (bufferBytes)
env->ReleaseByteArrayElements(buffer, bufferBytes, 0);
@@ -206,8 +233,10 @@ static JNINativeMethod method_table[] = {
{"native_get_fd", "()I", (void *)android_hardware_UsbDevice_get_fd},
{"native_claim_interface", "(IZ)Z",(void *)android_hardware_UsbDevice_claim_interface},
{"native_release_interface","(I)Z", (void *)android_hardware_UsbDevice_release_interface},
- {"native_control_request", "(IIII[BI)I",
+ {"native_control_request", "(IIII[BII)I",
(void *)android_hardware_UsbDevice_control_request},
+ {"native_bulk_request", "(I[BII)I",
+ (void *)android_hardware_UsbDevice_bulk_request},
{"native_request_wait", "()Landroid/hardware/UsbRequest;",
(void *)android_hardware_UsbDevice_request_wait},
{ "native_get_serial", "()Ljava/lang/String;",
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp
index d02ed90..4383b5f 100644
--- a/media/mtp/MtpDevice.cpp
+++ b/media/mtp/MtpDevice.cpp
@@ -92,16 +92,16 @@ MtpDevice* MtpDevice::open(const char* deviceName, int fd) {
// some music players need to see this before entering MTP mode.
char buffer[256];
memset(buffer, 0, sizeof(buffer));
- int ret = usb_device_send_control(device,
+ int ret = usb_device_control_transfer(device,
USB_DIR_IN|USB_RECIP_DEVICE|USB_TYPE_STANDARD,
USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) | 0xEE,
- 0, sizeof(buffer), buffer);
- printf("usb_device_send_control returned %d errno: %d\n", ret, errno);
+ 0, buffer, sizeof(buffer), 0);
+ printf("usb_device_control_transfer returned %d errno: %d\n", ret, errno);
if (ret > 0) {
printf("got MTP string %s\n", buffer);
- ret = usb_device_send_control(device,
+ ret = usb_device_control_transfer(device,
USB_DIR_IN|USB_RECIP_DEVICE|USB_TYPE_VENDOR, 1,
- 0, 4, sizeof(buffer), buffer);
+ 0, 4, buffer, sizeof(buffer), 0);
printf("OS descriptor got %d\n", ret);
} else {
printf("no MTP string\n");