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