176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown/*
276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Copyright (C) 2015 The Android Open Source Project
376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * you may not use this file except in compliance with the License.
676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * You may obtain a copy of the License at
776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
1076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Unless required by applicable law or agreed to in writing, software
1176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * See the License for the specific language governing permissions and
1476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * limitations under the License.
1576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */
1676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
1776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownpackage android.hardware.usb;
1876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
19823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharanimport android.hardware.usb.V1_0.Constants;
2076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownimport android.os.Parcel;
2176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownimport android.os.Parcelable;
2276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
23823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharanimport com.android.internal.util.Preconditions;
24823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan
2576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown/**
2676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Represents a physical USB port and describes its characteristics.
2776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * <p>
2876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * This object is immutable.
2976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * </p>
3076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
3176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide
3276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */
3376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownpublic final class UsbPort implements Parcelable {
3476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    private final String mId;
3576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    private final int mSupportedModes;
3676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
37823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int MODE_NONE = Constants.PortMode.NONE;
3876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
3976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Mode bit: This USB port can act as a downstream facing port (host).
4076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * <p>
4176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Implies that the port supports the {@link #POWER_ROLE_SOURCE} and {@link #DATA_ROLE_HOST}
4276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * combination of roles (and possibly others as well).
4376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * </p>
4476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
45823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int MODE_DFP = Constants.PortMode.DFP;
4676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
4776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
4876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Mode bit: This USB port can act as an upstream facing port (device).
4976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * <p>
5076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Implies that the port supports the {@link #POWER_ROLE_SINK} and {@link #DATA_ROLE_DEVICE}
5176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * combination of roles (and possibly others as well).
5276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * </p>
5376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
54823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int MODE_UFP = Constants.PortMode.UFP;
5576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
5676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
5776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Mode bit: This USB port can act either as an downstream facing port (host) or as
5876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * an upstream facing port (device).
5976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * <p>
6076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Implies that the port supports the {@link #POWER_ROLE_SOURCE} and {@link #DATA_ROLE_HOST}
6176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * combination of roles and the {@link #POWER_ROLE_SINK} and {@link #DATA_ROLE_DEVICE}
6276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * combination of roles (and possibly others as well).
6376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * </p>
6476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
65823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int MODE_DUAL = Constants.PortMode.DRP;
66823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan
67823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    /**
68ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan     * Mode bit: This USB port can support USB Type-C Audio accessory.
69ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan     */
70ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan    public static final int MODE_AUDIO_ACCESSORY =
71ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            android.hardware.usb.V1_1.Constants.PortMode_1_1.AUDIO_ACCESSORY;
72ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan
73ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan    /**
74ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan     * Mode bit: This USB port can support USB Type-C debug accessory.
75ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan     */
76ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan    public static final int MODE_DEBUG_ACCESSORY =
77ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            android.hardware.usb.V1_1.Constants.PortMode_1_1.DEBUG_ACCESSORY;
78ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan
79ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan    /**
80823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan     * Power role: This USB port does not have a power role.
81823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan     */
82823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int POWER_ROLE_NONE = Constants.PortPowerRole.NONE;
8376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
8476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
8576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Power role: This USB port can act as a source (provide power).
8676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
87823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int POWER_ROLE_SOURCE = Constants.PortPowerRole.SOURCE;
8876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
8976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
9076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Power role: This USB port can act as a sink (receive power).
9176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
92823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int POWER_ROLE_SINK = Constants.PortPowerRole.SINK;
93823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan
94823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    /**
95823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan     * Power role: This USB port does not have a data role.
96823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan     */
97823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int DATA_ROLE_NONE = Constants.PortDataRole.NONE;
9876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
9976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
10076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Data role: This USB port can act as a host (access data services).
10176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
102823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int DATA_ROLE_HOST = Constants.PortDataRole.HOST;
10376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
10476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
10576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Data role: This USB port can act as a device (offer data services).
10676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
107823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static final int DATA_ROLE_DEVICE = Constants.PortDataRole.DEVICE;
10876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
109823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    private static final int NUM_DATA_ROLES = Constants.PortDataRole.NUM_DATA_ROLES;
110823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    /**
111823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan     * Points to the first power role in the IUsb HAL.
112823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan     */
113823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    private static final int POWER_ROLE_OFFSET = Constants.PortPowerRole.NONE;
11476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
11576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
11676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public UsbPort(String id, int supportedModes) {
11776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        mId = id;
11876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        mSupportedModes = supportedModes;
11976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
12076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
12176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
12276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Gets the unique id of the port.
12376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
12476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @return The unique id of the port; not intended for display.
12576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
12676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public String getId() {
12776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return mId;
12876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
12976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
13076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
13176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Gets the supported modes of the port.
13276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * <p>
13376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * The actual mode of the port may vary depending on what is plugged into it.
13476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * </p>
13576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
13676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @return The supported modes: one of {@link #MODE_DFP}, {@link #MODE_UFP}, or
13776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * {@link #MODE_DUAL}.
13876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
13976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public int getSupportedModes() {
14076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return mSupportedModes;
14176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
14276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
14376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
14476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Combines one power and one data role together into a unique value with
14576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * exactly one bit set.  This can be used to efficiently determine whether
14676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * a combination of roles is supported by testing whether that bit is present
14776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * in a bit-field.
14876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
14976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @param powerRole The desired power role: {@link UsbPort#POWER_ROLE_SOURCE}
150ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan     *                  or {@link UsbPort#POWER_ROLE_SINK}, or 0 if no power role.
151ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan     * @param dataRole  The desired data role: {@link UsbPort#DATA_ROLE_HOST}
152ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan     *                  or {@link UsbPort#DATA_ROLE_DEVICE}, or 0 if no data role.
15376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @hide
15476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
15576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static int combineRolesAsBit(int powerRole, int dataRole) {
15676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        checkRoles(powerRole, dataRole);
157823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan        final int index = ((powerRole - POWER_ROLE_OFFSET) * NUM_DATA_ROLES) + dataRole;
15876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return 1 << index;
15976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
16076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
16176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
16276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static String modeToString(int mode) {
163ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        StringBuilder modeString = new StringBuilder();
164ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        if (mode == MODE_NONE) {
165ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            return "none";
166ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        }
167ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan
168ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        if ((mode & MODE_DUAL) == MODE_DUAL) {
169ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            modeString.append("dual, ");
170ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        } else {
171ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            if ((mode & MODE_DFP) == MODE_DFP) {
172ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                modeString.append("dfp, ");
173ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            } else if ((mode & MODE_UFP) == MODE_UFP) {
174ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                modeString.append("ufp, ");
175ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            }
176ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        }
177ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        if ((mode & MODE_AUDIO_ACCESSORY) == MODE_AUDIO_ACCESSORY) {
178ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            modeString.append("audio_acc, ");
17976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        }
180ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        if ((mode & MODE_DEBUG_ACCESSORY) == MODE_DEBUG_ACCESSORY) {
181ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            modeString.append("debug_acc, ");
182ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        }
183ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan
184ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        if (modeString.length() == 0) {
185ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            return Integer.toString(mode);
186ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        }
187ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        return modeString.substring(0, modeString.length() - 2);
18876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
18976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
19076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
19176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static String powerRoleToString(int role) {
19276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        switch (role) {
193823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan            case POWER_ROLE_NONE:
19476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return "no-power";
19576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            case POWER_ROLE_SOURCE:
19676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return "source";
19776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            case POWER_ROLE_SINK:
19876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return "sink";
19976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            default:
20076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return Integer.toString(role);
20176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        }
20276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
20376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
20476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
20576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static String dataRoleToString(int role) {
20676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        switch (role) {
207823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan            case DATA_ROLE_NONE:
20876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return "no-data";
20976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            case DATA_ROLE_HOST:
21076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return "host";
21176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            case DATA_ROLE_DEVICE:
21276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return "device";
21376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            default:
21476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                return Integer.toString(role);
21576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        }
21676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
21776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
21876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
21976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static String roleCombinationsToString(int combo) {
22076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        StringBuilder result = new StringBuilder();
22176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        result.append("[");
22276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
22376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        boolean first = true;
22476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        while (combo != 0) {
22576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            final int index = Integer.numberOfTrailingZeros(combo);
22676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            combo &= ~(1 << index);
227823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan            final int powerRole = (index / NUM_DATA_ROLES + POWER_ROLE_OFFSET);
22876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            final int dataRole = index % NUM_DATA_ROLES;
22976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            if (first) {
23076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                first = false;
23176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            } else {
23276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                result.append(", ");
23376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            }
23476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            result.append(powerRoleToString(powerRole));
23576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            result.append(':');
23676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            result.append(dataRoleToString(dataRole));
23776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        }
23876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
23976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        result.append("]");
24076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return result.toString();
24176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
24276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
24376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
244823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static void checkMode(int powerRole) {
245823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan        Preconditions.checkArgumentInRange(powerRole, Constants.PortMode.NONE,
246823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan                Constants.PortMode.NUM_MODES - 1, "portMode");
247823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    }
248823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan
249823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    /** @hide */
250823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static void checkPowerRole(int dataRole) {
251823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan        Preconditions.checkArgumentInRange(dataRole, Constants.PortPowerRole.NONE,
252823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan                Constants.PortPowerRole.NUM_POWER_ROLES - 1, "powerRole");
253823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    }
254823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan
255823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    /** @hide */
256823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    public static void checkDataRole(int mode) {
257823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan        Preconditions.checkArgumentInRange(mode, Constants.PortDataRole.NONE,
258823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan                Constants.PortDataRole.NUM_DATA_ROLES - 1, "powerRole");
259823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    }
260823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan
261823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan    /** @hide */
26276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static void checkRoles(int powerRole, int dataRole) {
263823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan        Preconditions.checkArgumentInRange(powerRole, POWER_ROLE_NONE, POWER_ROLE_SINK,
264823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan                "powerRole");
265823287d28ed75f96cee31cf465220fcbcbc5c7acBadhri Jagan Sridharan        Preconditions.checkArgumentInRange(dataRole, DATA_ROLE_NONE, DATA_ROLE_DEVICE, "dataRole");
26676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
26776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
268ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan    /** @hide */
269ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan    public boolean isModeSupported(int mode) {
270ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        if ((mSupportedModes & mode) == mode) return true;
271ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan        return false;
272ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan    }
273ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan
274ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan
27576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    @Override
27676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public String toString() {
27776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return "UsbPort{id=" + mId + ", supportedModes=" + modeToString(mSupportedModes) + "}";
27876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
27976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
28076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    @Override
28176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public int describeContents() {
28276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return 0;
28376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
28476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
28576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    @Override
28676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
28776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        dest.writeString(mId);
28876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        dest.writeInt(mSupportedModes);
28976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
29076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
29176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static final Parcelable.Creator<UsbPort> CREATOR =
29276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            new Parcelable.Creator<UsbPort>() {
293ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                @Override
294ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                public UsbPort createFromParcel(Parcel in) {
295ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                    String id = in.readString();
296ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                    int supportedModes = in.readInt();
297ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                    return new UsbPort(id, supportedModes);
298ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                }
299ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan
300ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                @Override
301ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                public UsbPort[] newArray(int size) {
302ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                    return new UsbPort[size];
303ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan                }
304ef4b303fc27056ae137563bc958eb3efd016972eBadhri Jagan Sridharan            };
30576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown}
306