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 endpoint on a {@link UsbInterface}.
2411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Endpoints are the channels for sending and receiving data over USB.
2511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Typically bulk endpoints are used for sending non-trivial amounts of data.
2611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Interrupt endpoints are used for sending small amounts of data, typically events,
2711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * separately from the main data streams.
2811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * The endpoint zero is a special endpoint for control messages sent from the host
2911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * to device.
3011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Isochronous endpoints are currently unsupported.
31e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */
32acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodpublic class UsbEndpoint implements Parcelable {
33e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
34acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mAddress;
35acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mAttributes;
36acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mMaxPacketSize;
37acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mInterval;
38e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
39e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
40e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * UsbEndpoint should only be instantiated by UsbService implementation
41e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @hide
42e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
43e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public UsbEndpoint(int address, int attributes, int maxPacketSize, int interval) {
44e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mAddress = address;
45e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mAttributes = attributes;
46e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mMaxPacketSize = maxPacketSize;
47e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mInterval = interval;
48e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
49e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
50e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
51e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the endpoint's address field.
5211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * The address is a bitfield containing both the endpoint number
5311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * as well as the data direction of the endpoint.
5411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * the endpoint number and direction can also be accessed via
5511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * {@link #getEndpointNumber} and {@link #getDirection}.
56e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
57e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint's address
58e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
59e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getAddress() {
60e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mAddress;
61e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
62e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
63e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
64e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Extracts the endpoint's endpoint number from its address
65e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
66e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint's endpoint number
67e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
68e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getEndpointNumber() {
69e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mAddress & UsbConstants.USB_ENDPOINT_NUMBER_MASK;
70e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
71e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
72e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
73e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the endpoint's direction.
7411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns {@link UsbConstants#USB_DIR_OUT}
75e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * if the direction is host to device, and
7611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * {@link UsbConstants#USB_DIR_IN} if the
77e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * direction is device to host.
7811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * @see {@link UsbConstants#USB_DIR_IN}
7911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * @see {@link UsbConstants#USB_DIR_OUT}
80e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
81e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint's direction
82e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
83e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDirection() {
84e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mAddress & UsbConstants.USB_ENDPOINT_DIR_MASK;
85e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
86e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
87e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
88e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the endpoint's attributes field.
89e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
90e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint's attributes
91e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
92e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getAttributes() {
93e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mAttributes;
94e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
95e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
96e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
97e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the endpoint's type.
98e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Possible results are:
99e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * <ul>
10011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * <li>{@link UsbConstants#USB_ENDPOINT_XFER_CONTROL} (endpoint zero)
10111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * <li>{@link UsbConstants#USB_ENDPOINT_XFER_ISOC} (isochronous endpoint)
10211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * <li>{@link UsbConstants#USB_ENDPOINT_XFER_BULK} (bulk endpoint)
10311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * <li>{@link UsbConstants#USB_ENDPOINT_XFER_INT} (interrupt endpoint)
104e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * </ul>
105e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
106e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint's type
107e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
108e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getType() {
109e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mAttributes & UsbConstants.USB_ENDPOINT_XFERTYPE_MASK;
110e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
111e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
112e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
113e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the endpoint's maximum packet size.
114e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
115e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint's maximum packet size
116e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
117e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getMaxPacketSize() {
118e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mMaxPacketSize;
119e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
120e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
121e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
122e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the endpoint's interval field.
123e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
124e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the endpoint's interval
125e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
126e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getInterval() {
127e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mInterval;
128e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
129e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
130e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
131e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public String toString() {
132e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return "UsbEndpoint[mAddress=" + mAddress + ",mAttributes=" + mAttributes +
133e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                ",mMaxPacketSize=" + mMaxPacketSize + ",mInterval=" + mInterval +"]";
134e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
135e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
136e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static final Parcelable.Creator<UsbEndpoint> CREATOR =
137e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        new Parcelable.Creator<UsbEndpoint>() {
138e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbEndpoint createFromParcel(Parcel in) {
139e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int address = in.readInt();
140e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int attributes = in.readInt();
141e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int maxPacketSize = in.readInt();
142e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int interval = in.readInt();
143e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return new UsbEndpoint(address, attributes, maxPacketSize, interval);
144e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
145e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
146e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbEndpoint[] newArray(int size) {
147e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return new UsbEndpoint[size];
148e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
149e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    };
150e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
151e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int describeContents() {
152e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return 0;
153e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
154e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
155e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
156e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mAddress);
157e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mAttributes);
158e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mMaxPacketSize);
159e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mInterval);
160e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood   }
161e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood}
162