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