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 Lockwood 21acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodimport java.io.FileDescriptor; 22acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 23acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 24acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood/** 2511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This class is used for sending and receiving data and control messages to a USB device. 2611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Instances of this class are created by {@link UsbManager#openDevice}. 27acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 28acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodpublic class UsbDeviceConnection { 29acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 30acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private static final String TAG = "UsbDeviceConnection"; 31acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 32acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private final UsbDevice mDevice; 33acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 34acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood // used by the JNI code 354838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat private long mNativeContext; 36acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 37acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 38acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * UsbDevice should only be instantiated by UsbService implementation 39acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @hide 40acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 41acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public UsbDeviceConnection(UsbDevice device) { 42acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood mDevice = device; 43acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 44acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 45acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /* package */ boolean open(String name, ParcelFileDescriptor pfd) { 46acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_open(name, pfd.getFileDescriptor()); 47acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 49acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 50acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Releases all system resources related to the device. 5111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Once the object is closed it cannot be used again. 5211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * The client must call {@link UsbManager#openDevice} again 5311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * to retrieve a new instance to reestablish communication with the device. 54acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 55acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public void close() { 56acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood native_close(); 57acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 58acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 59acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 6011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Returns the native file descriptor for the device, or 61acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * -1 if the device is not opened. 6211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This is intended for passing to native code to access the device. 6311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * 6411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * @return the native file descriptor 65acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 66acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public int getFileDescriptor() { 67acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_get_fd(); 68acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 69acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 70acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 71a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * Returns the raw USB descriptors for the device. 72a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * This can be used to access descriptors not supported directly 73a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * via the higher level APIs. 74a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * 75a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood * @return raw USB descriptors 76a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood */ 77a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood public byte[] getRawDescriptors() { 78a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood return native_get_desc(); 79a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood } 80a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood 81a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood /** 82acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Claims exclusive access to a {@link android.hardware.usb.UsbInterface}. 83acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * This must be done before sending or receiving data on any 8411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link android.hardware.usb.UsbEndpoint}s belonging to the interface. 8511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * 86acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param intf the interface to claim 87acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param force true to disconnect kernel driver if necessary 88acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return true if the interface was successfully claimed 89acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 90acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public boolean claimInterface(UsbInterface intf, boolean force) { 91acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_claim_interface(intf.getId(), force); 92acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 93acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 94acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 95acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Releases exclusive access to a {@link android.hardware.usb.UsbInterface}. 96acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 97acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return true if the interface was successfully released 98acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 99acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public boolean releaseInterface(UsbInterface intf) { 100acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_release_interface(intf.getId()); 101acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 102acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 103acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 1047531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood * Sets the current {@link android.hardware.usb.UsbInterface}. 1057531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood * Used to select between two interfaces with the same ID but different alternate setting. 1067531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood * 107fa2b3fc6cd15a3b6bbfef87288b97354edb42307Mike Lockwood * @return true if the interface was successfully selected 1087531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood */ 1097531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood public boolean setInterface(UsbInterface intf) { 1107531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return native_set_interface(intf.getId(), intf.getAlternateSetting()); 1117531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood } 1127531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood 1137531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood /** 1147531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood * Sets the device's current {@link android.hardware.usb.UsbConfiguration}. 1157531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood * 1167531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood * @return true if the configuration was successfully set 1177531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood */ 1187531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood public boolean setConfiguration(UsbConfiguration configuration) { 1197531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood return native_set_configuration(configuration.getId()); 1207531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood } 1217531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood 1227531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood /** 123acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Performs a control transaction on endpoint zero for this device. 124acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * The direction of the transfer is determined by the request type. 125acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * If requestType & {@link UsbConstants#USB_ENDPOINT_DIR_MASK} is 126acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * {@link UsbConstants#USB_DIR_OUT}, then the transfer is a write, 127acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * and if it is {@link UsbConstants#USB_DIR_IN}, then the transfer 128acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * is a read. 129e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * <p> 130e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * This method transfers data starting from index 0 in the buffer. 131e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * To specify a different offset, use 132e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * {@link #controlTransfer(int, int, int, int, byte[], int, int, int)}. 133e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * </p> 134acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 135acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param requestType request type for this transaction 136acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param request request ID for this transaction 137acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param value value field for this transaction 138acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param index index field for this transaction 139acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param buffer buffer for data portion of transaction, 140acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * or null if no data needs to be sent or received 141acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param length the length of the data to send or receive 142acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param timeout in milliseconds 143acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return length of data transferred (or zero) for success, 144acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * or negative value for failure 145acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 146acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public int controlTransfer(int requestType, int request, int value, 147acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood int index, byte[] buffer, int length, int timeout) { 1486c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown return controlTransfer(requestType, request, value, index, buffer, 0, length, timeout); 1496c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown } 1506c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown 1516c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown /** 1526c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * Performs a control transaction on endpoint zero for this device. 1536c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * The direction of the transfer is determined by the request type. 1546c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * If requestType & {@link UsbConstants#USB_ENDPOINT_DIR_MASK} is 1556c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * {@link UsbConstants#USB_DIR_OUT}, then the transfer is a write, 1566c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * and if it is {@link UsbConstants#USB_DIR_IN}, then the transfer 1576c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * is a read. 1586c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * 1596c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param requestType request type for this transaction 1606c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param request request ID for this transaction 1616c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param value value field for this transaction 1626c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param index index field for this transaction 1636c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param buffer buffer for data portion of transaction, 1646c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * or null if no data needs to be sent or received 165e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * @param offset the index of the first byte in the buffer to send or receive 1666c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param length the length of the data to send or receive 1676c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param timeout in milliseconds 1686c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @return length of data transferred (or zero) for success, 1696c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * or negative value for failure 1706c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown */ 1716c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown public int controlTransfer(int requestType, int request, int value, int index, 172e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown byte[] buffer, int offset, int length, int timeout) { 173e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown checkBounds(buffer, offset, length); 1746c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown return native_control_request(requestType, request, value, index, 175e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown buffer, offset, length, timeout); 176acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 177acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 178acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 179acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Performs a bulk transaction on the given endpoint. 180e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * The direction of the transfer is determined by the direction of the endpoint. 181e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * <p> 182e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * This method transfers data starting from index 0 in the buffer. 183e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * To specify a different offset, use 184e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * {@link #bulkTransfer(UsbEndpoint, byte[], int, int, int)}. 185e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * </p> 186acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 187acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param endpoint the endpoint for this transaction 1886c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param buffer buffer for data to send or receive 189acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param length the length of the data to send or receive 190acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @param timeout in milliseconds 191acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return length of data transferred (or zero) for success, 192acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * or negative value for failure 193acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 1946c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown public int bulkTransfer(UsbEndpoint endpoint, 1956c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown byte[] buffer, int length, int timeout) { 1966c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown return bulkTransfer(endpoint, buffer, 0, length, timeout); 1976c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown } 1986c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown 1996c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown /** 2006c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * Performs a bulk transaction on the given endpoint. 201e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * The direction of the transfer is determined by the direction of the endpoint. 2026c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * 2036c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param endpoint the endpoint for this transaction 2046c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param buffer buffer for data to send or receive 205e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown * @param offset the index of the first byte in the buffer to send or receive 2066c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param length the length of the data to send or receive 2076c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @param timeout in milliseconds 2086c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * @return length of data transferred (or zero) for success, 2096c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown * or negative value for failure 2106c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown */ 2116c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown public int bulkTransfer(UsbEndpoint endpoint, 212e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown byte[] buffer, int offset, int length, int timeout) { 213e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown checkBounds(buffer, offset, length); 214e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown return native_bulk_request(endpoint.getAddress(), buffer, offset, length, timeout); 215acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 216acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 217acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 218acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Waits for the result of a {@link android.hardware.usb.UsbRequest#queue} operation 219acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Note that this may return requests queued on multiple 220acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * {@link android.hardware.usb.UsbEndpoint}s. 221acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * When multiple endpoints are in use, {@link android.hardware.usb.UsbRequest#getEndpoint} and 222acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * {@link android.hardware.usb.UsbRequest#getClientData} can be useful in determining 223acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * how to process the result of this function. 224acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 225acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return a completed USB request, or null if an error occurred 226acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 227acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public UsbRequest requestWait() { 228acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood UsbRequest request = native_request_wait(); 229acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood if (request != null) { 230acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood request.dequeue(); 231acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 232acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return request; 233acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 234acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 235acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood /** 236acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * Returns the serial number for the device. 237acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * This will return null if the device has not been opened. 238acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * 239acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood * @return the device serial number 240acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood */ 241acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood public String getSerial() { 242acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood return native_get_serial(); 243acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood } 244acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood 2456c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown private static void checkBounds(byte[] buffer, int start, int length) { 2466c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown final int bufferLength = (buffer != null ? buffer.length : 0); 2476c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown if (start < 0 || start + length > bufferLength) { 2486c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown throw new IllegalArgumentException("Buffer start or length out of bounds."); 2496c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown } 2506c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown } 2516c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown 252acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native boolean native_open(String deviceName, FileDescriptor pfd); 253acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native void native_close(); 254acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native int native_get_fd(); 255a88b42d569a91290477d8f5731a2ee43931271daMike Lockwood private native byte[] native_get_desc(); 256acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native boolean native_claim_interface(int interfaceID, boolean force); 257acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native boolean native_release_interface(int interfaceID); 2587531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood private native boolean native_set_interface(int interfaceID, int alternateSetting); 2597531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood private native boolean native_set_configuration(int configurationID); 260acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native int native_control_request(int requestType, int request, int value, 261e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown int index, byte[] buffer, int offset, int length, int timeout); 2626c81a93ef3c9d949b6f0b3e192feafebc96a5d91Jeff Brown private native int native_bulk_request(int endpoint, byte[] buffer, 263e783d99038721eb42886840f707a53a43d4e39f4Jeff Brown int offset, int length, int timeout); 264acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native UsbRequest native_request_wait(); 265acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood private native String native_get_serial(); 266acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood} 267