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