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