am 0aba3b18: Merge "Support specifying buffer start offset for USB requests." into jb-mr2-dev

* commit '0aba3b18a8c32d8ea349fead8c1649617220d2da':
  Support specifying buffer start offset for USB requests.
This commit is contained in:
Jeff Brown
2013-03-28 11:57:57 -07:00
committed by Android Git Automerger
3 changed files with 86 additions and 29 deletions

View File

@@ -10306,10 +10306,12 @@ package android.hardware.usb {
}
public class UsbDeviceConnection {
method public int bulkTransfer(android.hardware.usb.UsbEndpoint, byte[], int, int);
method public deprecated int bulkTransfer(android.hardware.usb.UsbEndpoint, byte[], int, int);
method public int bulkTransfer(android.hardware.usb.UsbEndpoint, byte[], int, int, int);
method public boolean claimInterface(android.hardware.usb.UsbInterface, boolean);
method public void close();
method public int controlTransfer(int, int, int, int, byte[], int, int);
method public deprecated int controlTransfer(int, int, int, int, byte[], int, int);
method public int controlTransfer(int, int, int, int, byte[], int, int, int);
method public int getFileDescriptor();
method public byte[] getRawDescriptors();
method public java.lang.String getSerial();

View File

@@ -17,7 +17,6 @@
package android.hardware.usb;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import java.io.FileDescriptor;
@@ -119,10 +118,41 @@ public class UsbDeviceConnection {
* @param timeout in milliseconds
* @return length of data transferred (or zero) for success,
* or negative value for failure
*
* @deprecate Use {@link #controlTransfer(int, int, int, int, byte[], int, int, int)}
* which accepts a buffer start index.
*/
@Deprecated
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);
return controlTransfer(requestType, request, value, index, buffer, 0, length, timeout);
}
/**
* 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
* @param value value field for this transaction
* @param index index field for this transaction
* @param buffer buffer for data portion of transaction,
* or null if no data needs to be sent or received
* @param start the index of the first byte in the buffer 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 controlTransfer(int requestType, int request, int value, int index,
byte[] buffer, int start, int length, int timeout) {
checkBounds(buffer, start, length);
return native_control_request(requestType, request, value, index,
buffer, start, length, timeout);
}
/**
@@ -130,14 +160,37 @@ public class UsbDeviceConnection {
* 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 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
*
* @deprecate Use {@link #bulkTransfer(UsbEndpoint, byte[], int, int, int)}
* which accepts a buffer start index.
*/
@Deprecated
public int bulkTransfer(UsbEndpoint endpoint,
byte[] buffer, int length, int timeout) {
return bulkTransfer(endpoint, buffer, 0, 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 start the index of the first byte in the buffer 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);
public int bulkTransfer(UsbEndpoint endpoint,
byte[] buffer, int start, int length, int timeout) {
checkBounds(buffer, start, length);
return native_bulk_request(endpoint.getAddress(), buffer, start, length, timeout);
}
/**
@@ -168,6 +221,13 @@ public class UsbDeviceConnection {
return native_get_serial();
}
private static void checkBounds(byte[] buffer, int start, int length) {
final int bufferLength = (buffer != null ? buffer.length : 0);
if (start < 0 || start + length > bufferLength) {
throw new IllegalArgumentException("Buffer start or length out of bounds.");
}
}
private native boolean native_open(String deviceName, FileDescriptor pfd);
private native void native_close();
private native int native_get_fd();
@@ -175,8 +235,9 @@ public class UsbDeviceConnection {
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 timeout);
private native int native_bulk_request(int endpoint, byte[] buffer, int length, int timeout);
int index, byte[] buffer, int start, int length, int timeout);
private native int native_bulk_request(int endpoint, byte[] buffer,
int start, int length, int timeout);
private native UsbRequest native_request_wait();
private native String native_get_serial();
}

View File

@@ -142,7 +142,7 @@ android_hardware_UsbDeviceConnection_release_interface(JNIEnv *env, jobject thiz
static jint
android_hardware_UsbDeviceConnection_control_request(JNIEnv *env, jobject thiz,
jint requestType, jint request, jint value, jint index,
jbyteArray buffer, jint length, jint timeout)
jbyteArray buffer, jint start, jint length, jint timeout)
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
@@ -152,25 +152,22 @@ android_hardware_UsbDeviceConnection_control_request(JNIEnv *env, jobject thiz,
jbyte* bufferBytes = NULL;
if (buffer) {
if (env->GetArrayLength(buffer) < length) {
jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL);
return -1;
}
bufferBytes = env->GetByteArrayElements(buffer, 0);
bufferBytes = (jbyte*)env->GetPrimitiveArrayCritical(buffer, NULL);
}
jint result = usb_device_control_transfer(device, requestType, request,
value, index, bufferBytes, length, timeout);
value, index, bufferBytes + start, length, timeout);
if (bufferBytes)
env->ReleaseByteArrayElements(buffer, bufferBytes, 0);
if (bufferBytes) {
env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0);
}
return result;
}
static jint
android_hardware_UsbDeviceConnection_bulk_request(JNIEnv *env, jobject thiz,
jint endpoint, jbyteArray buffer, jint length, jint timeout)
jint endpoint, jbyteArray buffer, jint start, jint length, jint timeout)
{
struct usb_device* device = get_device_from_object(env, thiz);
if (!device) {
@@ -180,17 +177,14 @@ android_hardware_UsbDeviceConnection_bulk_request(JNIEnv *env, jobject thiz,
jbyte* bufferBytes = NULL;
if (buffer) {
if (env->GetArrayLength(buffer) < length) {
jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL);
return -1;
}
bufferBytes = env->GetByteArrayElements(buffer, 0);
bufferBytes = (jbyte*)env->GetPrimitiveArrayCritical(buffer, NULL);
}
jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes, length, timeout);
jint result = usb_device_bulk_transfer(device, endpoint, bufferBytes + start, length, timeout);
if (bufferBytes)
env->ReleaseByteArrayElements(buffer, bufferBytes, 0);
if (bufferBytes) {
env->ReleasePrimitiveArrayCritical(buffer, bufferBytes, 0);
}
return result;
}
@@ -235,9 +229,9 @@ static JNINativeMethod method_table[] = {
{"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",
{"native_control_request", "(IIII[BIII)I",
(void *)android_hardware_UsbDeviceConnection_control_request},
{"native_bulk_request", "(I[BII)I",
{"native_bulk_request", "(I[BIII)I",
(void *)android_hardware_UsbDeviceConnection_bulk_request},
{"native_request_wait", "()Landroid/hardware/usb/UsbRequest;",
(void *)android_hardware_UsbDeviceConnection_request_wait},