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