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