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