UsbDevice.java revision c4308f01c965571dc2354107c3574df113e397ee
1e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood/* 2e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Copyright (C) 2010 The Android Open Source Project 3e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 4e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * you may not use this file except in compliance with the License. 6e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * You may obtain a copy of the License at 7e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 8e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 10e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Unless required by applicable law or agreed to in writing, software 11e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * See the License for the specific language governing permissions and 14e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * limitations under the License. 15e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 16e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 17c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodpackage android.hardware.usb; 18e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 19e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Bundle; 20e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Parcel; 21e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Parcelable; 22e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.ParcelFileDescriptor; 23e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.util.Log; 24e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 25e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport java.io.FileDescriptor; 26e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 27e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 28e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood/** 29e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * A class representing a USB device. 30e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 31e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodpublic final class UsbDevice implements Parcelable { 32e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 33e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private static final String TAG = "UsbDevice"; 34e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 35e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private String mName; 36e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private int mVendorId; 37e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private int mProductId; 38e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private int mClass; 39e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private int mSubclass; 40e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private int mProtocol; 41e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private Parcelable[] mInterfaces; 42e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 43e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood // used by the JNI code 44e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private int mNativeContext; 45e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 46e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private UsbDevice() { 47e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 48e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 49e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 50e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 51e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * UsbDevice should only be instantiated by UsbService implementation 52e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @hide 53e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 54e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public UsbDevice(String name, int vendorId, int productId, 55e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood int Class, int subClass, int protocol, Parcelable[] interfaces) { 56e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mName = name; 57e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mVendorId = vendorId; 58e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mProductId = productId; 59e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mClass = Class; 60e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mSubclass = subClass; 61e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mProtocol = protocol; 62e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood mInterfaces = interfaces; 63e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 64e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 65e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 66e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns the name of the device. 67e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * In the standard implementation, this is the path of the device file 68e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * for the device in the usbfs file system. 69e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 70e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the device name 71e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 72e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public String getDeviceName() { 73e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return mName; 74e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 75e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 76e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 77e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns a unique integer ID for the device. 78e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This is a convenience for clients that want to use an integer to represent 79e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * the device, rather than the device name. 80e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * IDs are not persistent across USB disconnects. 81e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 82e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the device ID 83e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 84e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getDeviceId() { 85e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return getDeviceId(mName); 86e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 87e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 88e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 89e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns a vendor ID for the device. 90e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 91e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the device vendor ID 92e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 93e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getVendorId() { 94e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return mVendorId; 95e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 96e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 97e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 98e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns a product ID for the device. 99e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 100e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the device product ID 101e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 102e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getProductId() { 103e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return mProductId; 104e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 105e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 106e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 107e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns the devices's class field. 108e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Some useful constants for USB device classes can be found in 109c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * {@link android.hardware.usb.UsbConstants} 110e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 111e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the devices's class 112e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 113e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getDeviceClass() { 114e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return mClass; 115e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 116e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 117e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 118e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns the device's subclass field. 119e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 120e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the device's subclass 121e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 122e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getDeviceSubclass() { 123e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return mSubclass; 124e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 125e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 126e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 127e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns the device's subclass field. 128e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 129e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the device's protocol 130e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 131e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getDeviceProtocol() { 132e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return mProtocol; 133e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 134e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 135e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 136c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * Returns the number of {@link android.hardware.usb.UsbInterface}s this device contains. 137e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 138e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the number of interfaces 139e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 140e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getInterfaceCount() { 141e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return mInterfaces.length; 142e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 143e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 144e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 145c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * Returns the {@link android.hardware.usb.UsbInterface} at the given index. 146e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 147e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the interface 148e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 149e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public UsbInterface getInterface(int index) { 150e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return (UsbInterface)mInterfaces[index]; 151e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 152e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 153e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /* package */ boolean open(ParcelFileDescriptor pfd) { 154e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return native_open(mName, pfd.getFileDescriptor()); 155e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 156e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 157e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 158e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Releases all system resources related to the device. 159e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 160e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public void close() { 161e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood native_close(); 162e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 163e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 164e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 165e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns an integer file descriptor for the device, or 166e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * -1 if the device is not opened. 167e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This is intended for passing to native code to access the device 168e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 169e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int getFileDescriptor() { 170e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return native_get_fd(); 171e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 172e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 173e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 174c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * Claims exclusive access to a {@link android.hardware.usb.UsbInterface}. 175e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This must be done before sending or receiving data on any 176c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * {@link android.hardware.usb.UsbEndpoint}s belonging to the interface 177e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param intf the interface to claim 178e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param force true to disconnect kernel driver if necessary 179e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return true if the interface was successfully claimed 180e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 181e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public boolean claimInterface(UsbInterface intf, boolean force) { 182e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return native_claim_interface(intf.getId(), force); 183e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 184e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 185e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 186c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * Releases exclusive access to a {@link android.hardware.usb.UsbInterface}. 187e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 188e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return true if the interface was successfully released 189e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 190e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public boolean releaseInterface(UsbInterface intf) { 191e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return native_release_interface(intf.getId()); 192e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 193e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 194e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 195e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Performs a control transaction on endpoint zero for this device. 1961fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * The direction of the transfer is determined by the request type. 1971fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * If requestType & {@link UsbConstants#USB_ENDPOINT_DIR_MASK} is 1981fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * {@link UsbConstants#USB_DIR_OUT}, then the transfer is a write, 1991fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * and if it is {@link UsbConstants#USB_DIR_IN}, then the transfer 2001fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * is a read. 201e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 202e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param requestType request type for this transaction 203e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param request request ID for this transaction 204e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param value value field for this transaction 205e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param index index field for this transaction 206e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param buffer buffer for data portion of transaction, 207e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * or null if no data needs to be sent or received 208e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @param length the length of the data to send or receive 2091fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * @param timeout in milliseconds 210e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return length of data transferred (or zero) for success, 211e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * or negative value for failure 212e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 2131fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood public int controlTransfer(int requestType, int request, int value, 2141fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood int index, byte[] buffer, int length, int timeout) { 2151fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood return native_control_request(requestType, request, value, index, buffer, length, timeout); 2161fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood } 2171fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood 2181fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood /** 2191fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * Performs a bulk transaction on the given endpoint. 2201fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * The direction of the transfer is determined by the direction of the endpoint 2211fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * 2221fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * @param endpoint the endpoint for this transaction 2231fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * @param buffer buffer for data to send or receive, 2241fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * @param length the length of the data to send or receive 2251fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * @param timeout in milliseconds 2261fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * @return length of data transferred (or zero) for success, 2271fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood * or negative value for failure 2281fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood */ 2291fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood public int bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout) { 2301fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood return native_bulk_request(endpoint.getAddress(), buffer, length, timeout); 231e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 232e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 233e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 234c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * Waits for the result of a {@link android.hardware.usb.UsbRequest#queue} operation 235c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * Note that this may return requests queued on multiple 236c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * {@link android.hardware.usb.UsbEndpoint}s. 237c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * When multiple endpoints are in use, {@link android.hardware.usb.UsbRequest#getEndpoint} and 238c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * {@link android.hardware.usb.UsbRequest#getClientData} can be useful in determining 239c4308f01c965571dc2354107c3574df113e397eeMike Lockwood * how to process the result of this function. 240e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 241e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return a completed USB request, or null if an error occurred 242e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 243e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public UsbRequest requestWait() { 244e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood UsbRequest request = native_request_wait(); 245e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood if (request != null) { 246e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood request.dequeue(); 247e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 248e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return request; 249e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 250e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 251e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood /** 252e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Returns the serial number for the device. 253e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * This will return null if the device has not been opened. 254e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * 255e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * @return the device serial number 256e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */ 257e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public String getSerial() { 258e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return native_get_serial(); 259e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 260e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 261e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood @Override 262e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public boolean equals(Object o) { 263e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood if (o instanceof UsbDevice) { 264e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return ((UsbDevice)o).mName.equals(mName); 265e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } else if (o instanceof String) { 266e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return ((String)o).equals(mName); 267e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } else { 268e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return false; 269e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 270e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 271e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 272e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood @Override 273e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public String toString() { 274e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return "UsbDevice[mName=" + mName + ",mVendorId=" + mVendorId + 275e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood ",mProductId=" + mProductId + ",mClass=" + mClass + 276e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood ",mSubclass=" + mSubclass + ",mProtocol=" + mProtocol + 277e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood ",mInterfaces=" + mInterfaces + "]"; 278e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 279e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 280e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static final Parcelable.Creator<UsbDevice> CREATOR = 281e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood new Parcelable.Creator<UsbDevice>() { 282e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public UsbDevice createFromParcel(Parcel in) { 283e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood String name = in.readString(); 284e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood int vendorId = in.readInt(); 285e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood int productId = in.readInt(); 286e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood int clasz = in.readInt(); 287e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood int subClass = in.readInt(); 288e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood int protocol = in.readInt(); 289e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood Parcelable[] interfaces = in.readParcelableArray(UsbInterface.class.getClassLoader()); 290e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood UsbDevice result = new UsbDevice(name, vendorId, productId, clasz, subClass, protocol, interfaces); 291e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood for (int i = 0; i < interfaces.length; i++) { 292e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood ((UsbInterface)interfaces[i]).setDevice(result); 293e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 294e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return result; 295e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 296e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 297e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public UsbDevice[] newArray(int size) { 298e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return new UsbDevice[size]; 299e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 300e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood }; 301e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 302e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public int describeContents() { 303e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return 0; 304e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 305e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 306e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public void writeToParcel(Parcel parcel, int flags) { 307e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood parcel.writeString(mName); 308e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood parcel.writeInt(mVendorId); 309e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood parcel.writeInt(mProductId); 310e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood parcel.writeInt(mClass); 311e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood parcel.writeInt(mSubclass); 312e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood parcel.writeInt(mProtocol); 313e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood parcel.writeParcelableArray(mInterfaces, 0); 314e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 315e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 316e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static int getDeviceId(String name) { 317e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return native_get_device_id(name); 318e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 319e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 320e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood public static String getDeviceName(int id) { 321e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood return native_get_device_name(id); 322e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 323e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 324e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native boolean native_open(String deviceName, FileDescriptor pfd); 325e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native void native_close(); 326e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native int native_get_fd(); 327e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native boolean native_claim_interface(int interfaceID, boolean force); 328e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native boolean native_release_interface(int interfaceID); 329e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native int native_control_request(int requestType, int request, int value, 3301fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood int index, byte[] buffer, int length, int timeout); 3311fce24b241e386af19ba7c5bc29af5d18461f4ffMike Lockwood private native int native_bulk_request(int endpoint, byte[] buffer, int length, int timeout); 332e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native UsbRequest native_request_wait(); 333e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private native String native_get_serial(); 334e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 335e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private static native int native_get_device_id(String name); 336e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood private static native String native_get_device_name(int id); 337e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood} 338