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.util.Log;
23e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
24e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport java.io.FileDescriptor;
25e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
26e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood/**
2711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This class represents a USB device attached to the android device with the android device
2811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * acting as the USB host.
2911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Each device contains one or more {@link UsbInterface}s, each of which contains a number of
3011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link UsbEndpoint}s (the channels via which data is transmitted over USB).
3111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood *
3211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * <p> This class contains information (along with {@link UsbInterface} and {@link UsbEndpoint})
3311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * that describes the capabilities of the USB device.
3411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * To communicate with the device, you open a {@link UsbDeviceConnection} for the device
3511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * and use {@link UsbRequest} to send and receive data on an endpoint.
3611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link UsbDeviceConnection#controlTransfer} is used for control requests on endpoint zero.
37e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */
38acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodpublic class UsbDevice implements Parcelable {
39e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
40e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static final String TAG = "UsbDevice";
41e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
42acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final String mName;
43acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mVendorId;
44acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mProductId;
45acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mClass;
46acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mSubclass;
47acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mProtocol;
48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final Parcelable[] mInterfaces;
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.
10811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Some useful constants for USB device classes can be found in {@link UsbConstants}.
109e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
110e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the devices's class
111e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
112e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceClass() {
113e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mClass;
114e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
115e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
116e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
117e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the device's subclass field.
118e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
119e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device's subclass
120e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
121e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceSubclass() {
122e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mSubclass;
123e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
124e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
125e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
12611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the device's protocol field.
127e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
128e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device's protocol
129e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
130e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceProtocol() {
131e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mProtocol;
132e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
133e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
134e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
13511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the number of {@link UsbInterface}s this device contains.
136e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
137e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the number of interfaces
138e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
139e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getInterfaceCount() {
140e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mInterfaces.length;
141e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
142e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
143e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
14411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the {@link UsbInterface} at the given index.
145e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
146e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the interface
147e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
148e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public UsbInterface getInterface(int index) {
149e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return (UsbInterface)mInterfaces[index];
150e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
151e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
152e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
153e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public boolean equals(Object o) {
154e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        if (o instanceof UsbDevice) {
155e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return ((UsbDevice)o).mName.equals(mName);
156e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        } else if (o instanceof String) {
157e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return ((String)o).equals(mName);
158e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        } else {
159e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return false;
160e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
161e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
162e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
163e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
164c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    public int hashCode() {
165c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood        return mName.hashCode();
166c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    }
167c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood
168c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    @Override
169e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public String toString() {
170e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return "UsbDevice[mName=" + mName + ",mVendorId=" + mVendorId +
171e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                ",mProductId=" + mProductId + ",mClass=" + mClass +
172e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                ",mSubclass=" + mSubclass + ",mProtocol=" + mProtocol +
173e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                ",mInterfaces=" + mInterfaces + "]";
174e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
175e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
176e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static final Parcelable.Creator<UsbDevice> CREATOR =
177e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        new Parcelable.Creator<UsbDevice>() {
178e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbDevice createFromParcel(Parcel in) {
179e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            String name = in.readString();
180e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int vendorId = in.readInt();
181e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int productId = in.readInt();
182e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int clasz = in.readInt();
183e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int subClass = in.readInt();
184e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int protocol = in.readInt();
185e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            Parcelable[] interfaces = in.readParcelableArray(UsbInterface.class.getClassLoader());
186acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood            return new UsbDevice(name, vendorId, productId, clasz, subClass, protocol, interfaces);
187e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
188e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
189e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbDevice[] newArray(int size) {
190e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return new UsbDevice[size];
191e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
192e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    };
193e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
194e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int describeContents() {
195e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return 0;
196e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
197e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
198e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
199e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeString(mName);
200e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mVendorId);
201e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mProductId);
202e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mClass);
203e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mSubclass);
204e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mProtocol);
205e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeParcelableArray(mInterfaces, 0);
206e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood   }
207e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
208e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static int getDeviceId(String name) {
209e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return native_get_device_id(name);
210e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
211e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
212e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static String getDeviceName(int id) {
213e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return native_get_device_name(id);
214e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
215e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
216e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static native int native_get_device_id(String name);
217e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static native String native_get_device_name(int id);
218e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood}
219