1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project 3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License. 6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at 7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and 14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License. 15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Adjust the controller's power states. 19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "OverrideLog.h" 21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "PowerSwitch.h" 22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcJniUtil.h" 23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "config.h" 24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "SecureElement.h" 25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android 28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project void doStartupConfig (); 30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 32a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern bool gActivated; 33a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chuextern SyncEvent gDeactivatedEvent; 34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 35525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectPowerSwitch PowerSwitch::sPowerSwitch; 36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectconst PowerSwitch::PowerActivity PowerSwitch::DISCOVERY=0x01; 37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectconst PowerSwitch::PowerActivity PowerSwitch::SE_ROUTING=0x02; 38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectconst PowerSwitch::PowerActivity PowerSwitch::SE_CONNECTED=0x04; 399f8f6cf9c58405ecafe2d425801e6c14088db8c7Martijn Coenenconst PowerSwitch::PowerActivity PowerSwitch::HOST_ROUTING=0x08; 40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: PowerSwitch 44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Initialize member variables. 46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 50525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectPowerSwitch::PowerSwitch () 51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project: mCurrLevel (UNKNOWN_LEVEL), 52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrDeviceMgtPowerState (NFA_DM_PWR_STATE_UNKNOWN), 53a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mExpectedDeviceMgtPowerState (NFA_DM_PWR_STATE_UNKNOWN), 54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mDesiredScreenOffPowerState (0), 55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrActivity(0) 56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: ~PowerSwitch 63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Release all resources. 65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 69525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectPowerSwitch::~PowerSwitch () 70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: getInstance 77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get the singleton of this object. 79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Reference to this object. 81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 83525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectPowerSwitch& PowerSwitch::getInstance () 84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return sPowerSwitch; 86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: initialize 92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Initialize member variables. 94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid PowerSwitch::initialize (PowerLevel level) 99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "PowerSwitch::initialize"; 101a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu unsigned long num = 0; 102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: level=%s (%u)", fn, powerLevelToString(level), level); 106a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (GetNumValue (NAME_SCREEN_OFF_POWER_STATE, &num, sizeof(num))) 107a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mDesiredScreenOffPowerState = (int) num; 108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: desired screen-off state=%d", fn, mDesiredScreenOffPowerState); 109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (level) 111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case FULL_POWER: 113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrDeviceMgtPowerState = NFA_DM_PWR_MODE_FULL; 114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrLevel = level; 115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case UNKNOWN_LEVEL: 118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrDeviceMgtPowerState = NFA_DM_PWR_STATE_UNKNOWN; 119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrLevel = level; 120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: not handled", fn); 124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: getLevel 133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get the current power level of the controller. 135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Power level. 137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 139525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectPowerSwitch::PowerLevel PowerSwitch::getLevel () 140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project PowerLevel level = UNKNOWN_LEVEL; 142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project level = mCurrLevel; 144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return level; 146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: setLevel 152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set the controller's power level. 154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** level: power level. 155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool PowerSwitch::setLevel (PowerLevel newLevel) 160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "PowerSwitch::setLevel"; 162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retval = false; 163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: level=%s (%u)", fn, powerLevelToString(newLevel), newLevel); 167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mCurrLevel == newLevel) 168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = true; 170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 172525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 173a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (mCurrLevel == UNKNOWN_LEVEL) 174a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 175a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGE ("%s: unknown power level", fn); 176a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu goto TheEnd; 177a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 178a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 179a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if ( (mCurrLevel == LOW_POWER && newLevel == FULL_POWER) || 180a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu (mCurrLevel == FULL_POWER && newLevel == LOW_POWER) ) 181a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 182a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mMutex.unlock (); 183a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu SyncEventGuard g (gDeactivatedEvent); 184a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu if (gActivated) 185a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 186a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD("%s: wait for deactivation", fn); 187a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu gDeactivatedEvent.wait (); 188a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 189a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mMutex.lock (); 190a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 191a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu 192525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (newLevel) 193525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 194525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case FULL_POWER: 195525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mCurrDeviceMgtPowerState == NFA_DM_PWR_MODE_OFF_SLEEP) 196525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = setPowerOffSleepState (false); 197525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 198525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 199525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case LOW_POWER: 200525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case POWER_OFF: 201525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (isPowerOffSleepFeatureEnabled()) 202525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = setPowerOffSleepState (true); 203525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else if (mDesiredScreenOffPowerState == 1) //.conf file desires full-power 204525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 205525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrLevel = FULL_POWER; 206525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = true; 207525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 208525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 209525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 210525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 211525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: not handled", fn); 212525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 213525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 214525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 215525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 216525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 217525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retval; 218525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 219525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 220525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 221525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 222525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: setModeOff 223525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 224525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set a mode to be deactive. 225525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 226525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if any mode is still active. 227525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 228525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 229525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool PowerSwitch::setModeOff (PowerActivity deactivated) 230525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 231525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retVal = false; 232525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 233525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 234525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrActivity &= ~deactivated; 235525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retVal = mCurrActivity != 0; 236525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("PowerSwitch::setModeOff(deactivated=0x%x) : mCurrActivity=0x%x", deactivated, mCurrActivity); 237525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 238525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retVal; 239525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 240525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 241525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 242525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 243525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 244525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: setModeOn 245525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 246525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Set a mode to be active. 247525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 248525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if any mode is active. 249525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 250525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 251525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool PowerSwitch::setModeOn (PowerActivity activated) 252525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 253525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retVal = false; 254525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 255525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.lock (); 256525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrActivity |= activated; 257525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retVal = mCurrActivity != 0; 258525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("PowerSwitch::setModeOn(activated=0x%x) : mCurrActivity=0x%x", activated, mCurrActivity); 259525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mMutex.unlock (); 260525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retVal; 261525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 262525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 263525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 264525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 265525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 266525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: setPowerOffSleepState 267525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 268525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Adjust controller's power-off-sleep state. 269525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** sleep: whether to enter sleep state. 270525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 271525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if ok. 272525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 273525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 274525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool PowerSwitch::setPowerOffSleepState (bool sleep) 275525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 276525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "PowerSwitch::setPowerOffSleepState"; 277525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: enter; sleep=%u", fn, sleep); 278525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_STATUS stat = NFA_STATUS_FAILED; 279525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project bool retval = false; 280525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 281525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (sleep) //enter power-off-sleep state 282525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 283525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //make sure the current power state is ON 284525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mCurrDeviceMgtPowerState != NFA_DM_PWR_MODE_OFF_SLEEP) 285525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 286525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (mPowerStateEvent); 287a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mExpectedDeviceMgtPowerState = NFA_DM_PWR_MODE_OFF_SLEEP; //if power adjustment is ok, then this is the expected state 288525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: try power off", fn); 289525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project stat = NFA_PowerOffSleepMode (TRUE); 290525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (stat == NFA_STATUS_OK) 291525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 292525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mPowerStateEvent.wait (); 293525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrLevel = LOW_POWER; 294525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 295525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 296525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 297525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: API fail; stat=0x%X", fn, stat); 298525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 299525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 300525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 301525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 302525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 303525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: power is not ON; curr device mgt power state=%s (%u)", fn, 304525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project deviceMgtPowerStateToString (mCurrDeviceMgtPowerState), mCurrDeviceMgtPowerState); 305525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 306525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 307525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 308525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else //exit power-off-sleep state 309525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 310525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project //make sure the current power state is OFF 311525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mCurrDeviceMgtPowerState != NFA_DM_PWR_MODE_FULL) 312525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 313525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (mPowerStateEvent); 314a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mCurrDeviceMgtPowerState = NFA_DM_PWR_STATE_UNKNOWN; 315a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu mExpectedDeviceMgtPowerState = NFA_DM_PWR_MODE_FULL; //if power adjustment is ok, then this is the expected state 316525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: try full power", fn); 317525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project stat = NFA_PowerOffSleepMode (FALSE); 318525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (stat == NFA_STATUS_OK) 319525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 320525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mPowerStateEvent.wait (); 321525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (mCurrDeviceMgtPowerState != NFA_DM_PWR_MODE_FULL) 322525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 323525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: unable to full power; curr device mgt power stat=%s (%u)", fn, 324525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project deviceMgtPowerStateToString (mCurrDeviceMgtPowerState), mCurrDeviceMgtPowerState); 325525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 326525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 327525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project android::doStartupConfig (); 328525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mCurrLevel = FULL_POWER; 329525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 330525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 331525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 332525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: API fail; stat=0x%X", fn, stat); 333525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 334525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 335525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 336525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project else 337525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 338525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("%s: not in power-off state; curr device mgt power state=%s (%u)", fn, 339525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project deviceMgtPowerStateToString (mCurrDeviceMgtPowerState), mCurrDeviceMgtPowerState); 340525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project goto TheEnd; 341525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 342525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 343525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 344525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project retval = true; 345525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectTheEnd: 346525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s: exit; return %u", fn, retval); 347525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return retval; 348525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 349525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 350525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 351525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 352525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 353525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: deviceMgtPowerStateToString 354525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 355525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Decode power level to a string. 356525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** deviceMgtPowerState: power level. 357525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 358525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Text representation of power level. 359525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 360525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 361525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectconst char* PowerSwitch::deviceMgtPowerStateToString (UINT8 deviceMgtPowerState) 362525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 363525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (deviceMgtPowerState) 364525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 365525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_PWR_MODE_FULL: 366525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "DM-FULL"; 367525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_PWR_MODE_OFF_SLEEP: 368525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "DM-OFF"; 369525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 370525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "DM-unknown????"; 371525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 372525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 373525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 374525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 375525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 376525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 377525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: powerLevelToString 378525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 379525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Decode power level to a string. 380525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** level: power level. 381525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 382525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Text representation of power level. 383525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 384525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 385525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectconst char* PowerSwitch::powerLevelToString (PowerLevel level) 386525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 387525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (level) 388525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 389525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case UNKNOWN_LEVEL: 390525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "PS-UNKNOWN"; 391525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case FULL_POWER: 392525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "PS-FULL"; 393525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case LOW_POWER: 394525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "PS-LOW-POWER"; 395525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case POWER_OFF: 396525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "PS-POWER-OFF"; 397525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project default: 398525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return "PS-unknown????"; 399525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 400525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 401525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 402525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 403525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 404525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 405525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: abort 406525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 407525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Abort and unblock currrent operation. 408525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 409525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 410525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 411525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 412525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid PowerSwitch::abort () 413525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 414525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "PowerSwitch::abort"; 415525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGD ("%s", fn); 416525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (mPowerStateEvent); 417525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project mPowerStateEvent.notifyOne (); 418525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 419525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 420525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 421525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 422525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 423525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: deviceManagementCallback 424525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 425525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Callback function for the stack. 426525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** event: event ID. 427525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** eventData: event's data. 428525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 429525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None 430525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 431525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 432525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid PowerSwitch::deviceManagementCallback (UINT8 event, tNFA_DM_CBACK_DATA* eventData) 433525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 434525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project static const char fn [] = "PowerSwitch::deviceManagementCallback"; 435525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 436525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project switch (event) 437525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 438525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project case NFA_DM_PWR_MODE_CHANGE_EVT: 439525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 440525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project tNFA_DM_PWR_MODE_CHANGE& power_mode = eventData->power_mode; 441a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu ALOGD ("%s: NFA_DM_PWR_MODE_CHANGE_EVT; status=0x%X; device mgt power state=%s (0x%X)", fn, 442a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu power_mode.status, sPowerSwitch.deviceMgtPowerStateToString (power_mode.power_mode), 443a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu power_mode.power_mode); 444525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project SyncEventGuard guard (sPowerSwitch.mPowerStateEvent); 445525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (power_mode.status == NFA_STATUS_OK) 446a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu { 447a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu //the event data does not contain the newly configured power mode, 448a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu //so this code assigns the expected value 449a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu sPowerSwitch.mCurrDeviceMgtPowerState = sPowerSwitch.mExpectedDeviceMgtPowerState; 450a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu } 451525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project sPowerSwitch.mPowerStateEvent.notifyOne (); 452525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 453525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project break; 454525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 455525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 456525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 457525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 458525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 459525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 460525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: isPowerOffSleepFeatureEnabled 461525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 462525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Whether power-off-sleep feature is enabled in .conf file. 463525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 464525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if feature is enabled. 465525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 466525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 467525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool PowerSwitch::isPowerOffSleepFeatureEnabled () 468525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 469525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return mDesiredScreenOffPowerState == 0; 470525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 471525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 472