1acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood/* 2acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Copyright (C) 2011 The Android Open Source Project 3acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 4acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * you may not use this file except in compliance with the License. 6acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * You may obtain a copy of the License at 7acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 8acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 10acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * See the License for the specific language governing permissions and 14acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * limitations under the License. 15acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 16acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 17acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodpackage android.hardware.usb; 18acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 19acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodimport android.os.ParcelFileDescriptor; 20acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodimport android.util.Log; 21acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 22acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodimport java.io.FileDescriptor; 23acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 24acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 25acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood/** 2611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This class is used for sending and receiving data and control messages to a USB device. 2711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Instances of this class are created by {@link UsbManager#openDevice}. 28acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 29acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodpublic class UsbDeviceConnection { 30acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 31acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private static final String TAG = "UsbDeviceConnection"; 32acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 33acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private final UsbDevice mDevice; 34acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 35acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // used by the JNI code 36acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private int mNativeContext; 37acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 38acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 39acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * UsbDevice should only be instantiated by UsbService implementation 40acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @hide 41acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 42acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public UsbDeviceConnection(UsbDevice device) { 43acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood mDevice = device; 44acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 45acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 46acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /* package */ boolean open(String name, ParcelFileDescriptor pfd) { 47acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_open(name, pfd.getFileDescriptor()); 48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 49acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 50acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 51acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Releases all system resources related to the device. 5211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Once the object is closed it cannot be used again. 5311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * The client must call {@link UsbManager#openDevice} again 5411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * to retrieve a new instance to reestablish communication with the device. 55acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 56acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public void close() { 57acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood native_close(); 58acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 59acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 60acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 6111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Returns the native file descriptor for the device, or 62acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * -1 if the device is not opened. 6311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This is intended for passing to native code to access the device. 6411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * 6511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * @return the native file descriptor 66acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 67acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public int getFileDescriptor() { 68acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_get_fd(); 69acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 70acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 71acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 72a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * Returns the raw USB descriptors for the device. 73a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * This can be used to access descriptors not supported directly 74a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * via the higher level APIs. 75a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * 76a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * @return raw USB descriptors 77a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood */ 78a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood public byte[] getRawDescriptors() { 79a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood return native_get_desc(); 80a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood } 81a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood 82a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood /** 83acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Claims exclusive access to a {@link android.hardware.usb.UsbInterface}. 84acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * This must be done before sending or receiving data on any 8511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link android.hardware.usb.UsbEndpoint}s belonging to the interface. 8611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * 87acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param intf the interface to claim 88acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param force true to disconnect kernel driver if necessary 89acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return true if the interface was successfully claimed 90acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 91acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public boolean claimInterface(UsbInterface intf, boolean force) { 92acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_claim_interface(intf.getId(), force); 93acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 94acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 95acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 96acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Releases exclusive access to a {@link android.hardware.usb.UsbInterface}. 97acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 98acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return true if the interface was successfully released 99acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 100acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public boolean releaseInterface(UsbInterface intf) { 101acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_release_interface(intf.getId()); 102acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 103acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 104acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 105acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Performs a control transaction on endpoint zero for this device. 106acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * The direction of the transfer is determined by the request type. 107acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * If requestType & {@link UsbConstants#USB_ENDPOINT_DIR_MASK} is 108acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * {@link UsbConstants#USB_DIR_OUT}, then the transfer is a write, 109acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * and if it is {@link UsbConstants#USB_DIR_IN}, then the transfer 110acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * is a read. 111acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 112acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param requestType request type for this transaction 113acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param request request ID for this transaction 114acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param value value field for this transaction 115acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param index index field for this transaction 116acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param buffer buffer for data portion of transaction, 117acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * or null if no data needs to be sent or received 118acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param length the length of the data to send or receive 119acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param timeout in milliseconds 120acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return length of data transferred (or zero) for success, 121acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * or negative value for failure 122acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 123acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public int controlTransfer(int requestType, int request, int value, 124acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int index, byte[] buffer, int length, int timeout) { 125acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_control_request(requestType, request, value, index, buffer, length, timeout); 126acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 127acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 128acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 129acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Performs a bulk transaction on the given endpoint. 130acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * The direction of the transfer is determined by the direction of the endpoint 131acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 132acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param endpoint the endpoint for this transaction 133acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param buffer buffer for data to send or receive, 134acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param length the length of the data to send or receive 135acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param timeout in milliseconds 136acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return length of data transferred (or zero) for success, 137acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * or negative value for failure 138acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 139acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public int bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout) { 140acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_bulk_request(endpoint.getAddress(), buffer, length, timeout); 141acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 142acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 143acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 144acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Waits for the result of a {@link android.hardware.usb.UsbRequest#queue} operation 145acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Note that this may return requests queued on multiple 146acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * {@link android.hardware.usb.UsbEndpoint}s. 147acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * When multiple endpoints are in use, {@link android.hardware.usb.UsbRequest#getEndpoint} and 148acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * {@link android.hardware.usb.UsbRequest#getClientData} can be useful in determining 149acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * how to process the result of this function. 150acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 151acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return a completed USB request, or null if an error occurred 152acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 153acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public UsbRequest requestWait() { 154acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood UsbRequest request = native_request_wait(); 155acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (request != null) { 156acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood request.dequeue(); 157acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 158acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return request; 159acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 160acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 161acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 162acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Returns the serial number for the device. 163acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * This will return null if the device has not been opened. 164acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 165acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return the device serial number 166acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 167acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public String getSerial() { 168acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_get_serial(); 169acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 170acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 171acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native boolean native_open(String deviceName, FileDescriptor pfd); 172acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native void native_close(); 173acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native int native_get_fd(); 174a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood private native byte[] native_get_desc(); 175acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native boolean native_claim_interface(int interfaceID, boolean force); 176acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native boolean native_release_interface(int interfaceID); 177acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native int native_control_request(int requestType, int request, int value, 178acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int index, byte[] buffer, int length, int timeout); 179acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native int native_bulk_request(int endpoint, byte[] buffer, int length, int timeout); 180acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native UsbRequest native_request_wait(); 181acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native String native_get_serial(); 182acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 183