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.Parcel;
20e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Parcelable;
21e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
22e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood/**
2311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * A class representing an interface on a {@link UsbDevice}.
2411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * USB devices can have one or more interfaces, each one providing a different
2511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * piece of functionality, separate from the other interfaces.
2611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * An interface will have one or more {@link UsbEndpoint}s, which are the
2711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * channels by which the host transfers data with the device.
283aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
293aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
303aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
313aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about communicating with USB hardware, read the
323aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/usb/index.html">USB</a> developer guide.</p>
333aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
34e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */
35c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodpublic class UsbInterface implements Parcelable {
36e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
37acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mId;
387531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    private final int mAlternateSetting;
397531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    private final String mName;
40acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mClass;
41acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mSubclass;
42acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mProtocol;
437531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    private Parcelable[] mEndpoints;
44e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
45e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
46e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * UsbInterface should only be instantiated by UsbService implementation
47e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @hide
48e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
497531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    public UsbInterface(int id, int alternateSetting, String name,
507531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            int Class, int subClass, int protocol) {
51e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mId = id;
527531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        mAlternateSetting = alternateSetting;
537531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        mName = name;
54e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mClass = Class;
55e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mSubclass = subClass;
56e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mProtocol = protocol;
57e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
58e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
59e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
607531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * Returns the interface's bInterfaceNumber field.
617531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * This is an integer that along with the alternate setting uniquely identifies
627531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * the interface on the device.
63e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
64e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the interface's ID
65e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
66e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getId() {
67e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mId;
68e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
69e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
70e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
717531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * Returns the interface's bAlternateSetting field.
727531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * This is an integer that along with the ID uniquely identifies
737531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * the interface on the device.
747531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * {@link UsbDeviceConnection#setInterface} can be used to switch between
757531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * two interfaces with the same ID but different alternate setting.
767531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     *
777531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * @return the interface's alternate setting
787531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     */
797531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    public int getAlternateSetting() {
807531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return mAlternateSetting;
817531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    }
827531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
837531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    /**
847531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * Returns the interface's name.
857531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     *
867531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * @return the interface's name
877531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     */
887531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    public String getName() {
897531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return mName;
907531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    }
917531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
927531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    /**
93e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the interface's class field.
9411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Some useful constants for USB classes can be found in {@link UsbConstants}
95e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
96e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the interface's class
97e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
98e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getInterfaceClass() {
99e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mClass;
100e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
101e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
102e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
103e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the interface's subclass field.
104e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
105e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the interface's subclass
106e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
107e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getInterfaceSubclass() {
108e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mSubclass;
109e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
110e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
111e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
112e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the interface's protocol field.
113e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
114e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the interface's protocol
115e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
116e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getInterfaceProtocol() {
117e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mProtocol;
118e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
119e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
120e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
121c4308f01c965571dc2354107c3574df113e397eeMike Lockwood     * Returns the number of {@link android.hardware.usb.UsbEndpoint}s this interface contains.
122e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
123e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the number of endpoints
124e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
125e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getEndpointCount() {
126e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mEndpoints.length;
127e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
128e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
129e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
130c4308f01c965571dc2354107c3574df113e397eeMike Lockwood     * Returns the {@link android.hardware.usb.UsbEndpoint} at the given index.
131e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
132e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint
133e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
134e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public UsbEndpoint getEndpoint(int index) {
135e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return (UsbEndpoint)mEndpoints[index];
136e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
137e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
1387531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    /**
1397531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * Only used by UsbService implementation
1407531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * @hide
1417531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     */
1427531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    public void setEndpoints(Parcelable[] endpoints) {
1437531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        mEndpoints = endpoints;
1447531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    }
1457531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
146e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
147e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public String toString() {
1487531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        StringBuilder builder = new StringBuilder("UsbInterface[mId=" + mId +
1497531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                ",mAlternateSetting=" + mAlternateSetting +
1507531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                ",mName=" + mName + ",mClass=" + mClass +
151e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                ",mSubclass=" + mSubclass + ",mProtocol=" + mProtocol +
1527531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                ",mEndpoints=[");
1537531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        for (int i = 0; i < mEndpoints.length; i++) {
1547531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            builder.append("\n");
1557531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            builder.append(mEndpoints[i].toString());
1567531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        }
1577531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        builder.append("]");
1587531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return builder.toString();
159e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
160e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
161e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static final Parcelable.Creator<UsbInterface> CREATOR =
162e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        new Parcelable.Creator<UsbInterface>() {
163e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbInterface createFromParcel(Parcel in) {
164e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int id = in.readInt();
1657531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            int alternateSetting = in.readInt();
1667531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            String name = in.readString();
167e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int Class = in.readInt();
168e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int subClass = in.readInt();
169e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int protocol = in.readInt();
170e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            Parcelable[] endpoints = in.readParcelableArray(UsbEndpoint.class.getClassLoader());
1717531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            UsbInterface intf = new UsbInterface(id, alternateSetting, name, Class, subClass, protocol);
1727531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            intf.setEndpoints(endpoints);
1737531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            return intf;
174e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
175e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
176e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbInterface[] newArray(int size) {
177e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return new UsbInterface[size];
178e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
179e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    };
180e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
181e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int describeContents() {
182e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return 0;
183e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
184e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
185e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
186e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mId);
1877531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        parcel.writeInt(mAlternateSetting);
1887531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        parcel.writeString(mName);
189e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mClass);
190e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mSubclass);
191e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mProtocol);
192e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeParcelableArray(mEndpoints, 0);
193e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood   }
194e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood}
195