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