FreeCalypso > hg > fc-tourmaline
diff src/cs/drivers/drv_app/power/board/power.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children | 96c7a4eed1df |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/drivers/drv_app/power/board/power.c Fri Oct 16 06:23:26 2020 +0000 @@ -0,0 +1,321 @@ +/******************************************************************************* +* +* power.c +* +* Purpose: This file contains the functions used for power on and off +* management of the board. +* In case of RVM_PWR_SWE, this file contains also the +* functions used for charger plug and unplug management. +* They are all called after the occurence of the ABB interrupt. +* +* Author: Candice Bazanegue (c-brille@ti.com) +* +* +* (C) Texas Instruments 2001 +* +******************************************************************************/ + +#ifndef _WINDOWS + #include "rv.cfg" +#endif + +#include "abb/abb.h" +#include "rvm/rvm_use_id_list.h" +#include "spi/spi_env.h" +#include "power/power.h" +#include "rv/rv_defined_swe.h" // for RVM_PWR_SWE + +#ifndef _WINDOWS + #include "kpd/kpd_power_api.h" + #include "ffs/ffs.h" +#endif // _WINDOWS + +#ifdef RVM_PWR_SWE + #include "spi/spi_task.h" + #ifndef _WINDOWS + #include "l1sw.cfg" + #include "chipset.cfg" + #endif // _WINDOWS + #include "pwr/pwr_messages.h" + #include "pwr/pwr_liion_cha.h" + #include "pwr/pwr_disch.h" +#endif /* #ifdef RVM_PWR_SWE */ + + + +#ifndef _WINDOWS + /* Declare the variable containing pressed and released callback. */ + extern T_KPD_KEYPAD Kp; + + extern effs_t ffs_exit(void); +#endif // _WINDOWS + + +/// The ABB status used to know the cause of the Switch ON event. +static SYS_UWORD16 Power_abb_status = 0; + + +/******************************************************************************* +** +** Function Power_ON_Button +** +** Description: Informs the Protocol Stack that the Power ON key has been +** pressed, and thus allows it to start. +** +*******************************************************************************/ +void Power_ON_Button(void) +{ +#ifndef _WINDOWS + SPI_GBL_INFO_PTR->is_gsm_on = TRUE; + + /* + When we build for ACI, we have no MMI, so there's no point waiting + for a keypress. See CR 17958. + */ + +#if (OP_WCP == 0) && (MMI != 0) + + /* Wait until the pointers initialization by the SMI */ + while(!(Kp.pressed && Kp.released)) + rvf_delay(1); + +#if (TEST==0) + (Kp.pressed)(KPD_PWR); /* tell key is pressed */ + rvf_delay(5); + (Kp.released)(); /* allow protocol stack to start */ +#endif + +#endif // OP_WCP == 0 + +#else + rvf_send_trace("Start from button", 17, NULL_PARAM, RV_TRACE_LEVEL_WARNING, LCC_USE_ID); + SPI_GBL_INFO_PTR->is_gsm_on = TRUE; +#endif // _WINDOWS +} + + + +/******************************************************************************* +** +** Function Power_OFF_Button +** +** Description: Informs the Protocol Stack that the Power OFF key has been +** pressed, and thus allows it to stop. +** +*******************************************************************************/ +void Power_OFF_Button(void) +{ +#ifndef _WINDOWS + ffs_exit (); +#endif // _WINDOWS + rvf_send_trace("Power off button", 16, NULL_PARAM, RV_TRACE_LEVEL_WARNING, LCC_USE_ID); + SPI_GBL_INFO_PTR->is_gsm_on = FALSE; +#ifndef _WINDOWS + #if (OP_WCP == 0) && (MMI != 0) + (Kp.pressed)(KPD_PWR); /* tell key is pressed */ + rvf_delay(5); + (Kp.released)(); /* tell key is released */ + #else + ABB_Power_Off(); + #endif +#endif // _WINDOWS +} + + +/** + * @brief Sets the cause of the swith ON event. + * + * This function get the ABB status register and stores it into the + * global variable Power_abb_status. + * + * @noparam + * + * @noreturn + */ +void Set_Switch_ON_Cause(void) +{ + Power_abb_status = ABB_Read_Status(); +} + + +/******************************************************************************* +** +** Function Switch_ON +** +** Description This function is called by the spi task after the board is +** switched ON. It calls the appropriate function according +** to the ABB status register. +** +** Warning The Set_Switch_ON_Cause() function has to be called prior. +** +*******************************************************************************/ +void Switch_ON(void) +{ +#if ((ANLG_FAM == 1) || (ANLG_FAM == 2)) + if (Power_abb_status & ONBSTS) +#elif (ANLG_FAM == 3) + if (Power_abb_status & PWONBSTS) +#endif + { + /* Switch on Condition on ON BUTTON Push */ + rvf_send_trace("Push Button from OFF to ON",26, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + Power_ON_Button(); + #ifdef RVM_PWR_SWE + pwr_handle_discharge(); + #endif + } + +#if ((ANLG_FAM == 1) || (ANLG_FAM == 2)) + else if (Power_abb_status & ONRSTS) +#elif (ANLG_FAM == 3) + else if (Power_abb_status & RPSTS) +#endif + { + /* Switch on Condition on ON REM transition 0->1 */ + rvf_send_trace("ON Remote",9, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + Power_ON_Remote(); + #ifdef RVM_PWR_SWE + pwr_handle_discharge(); + #endif + } + +#ifdef RVM_PWR_SWE + else if (Power_abb_status & CHGSTS) + { + /* Switch on Condition on CHARGER IC PLUG */ + rvf_send_trace("PWR: Charger Plug",17, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + if (Power_abb_status & CHGPRES) + { + /* charger still present */ + PWR_Charger_Plug(); + } + } +#endif /* #ifdef RVM_PWR_SWE */ + + else + { + // The reset should run the SW in the same way than a Power ON + rvf_send_trace("Start from reset",16, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID); + Power_ON_Button(); + #ifdef RVM_PWR_SWE + pwr_handle_discharge(); + #endif + } +} + + + +/******************************************************************************* +** +** Function Power_ON_Remote +** +** Description +** +** +*******************************************************************************/ +void Power_ON_Remote(void) +{ +} + + + +/******************************************************************************* +** +** Function Power_OFF_Remote +** +** Description +** +** +*******************************************************************************/ +void Power_OFF_Remote(void) +{ +} + + + +/******************************************************************************* +** +** Function Power_IT_WakeUp +** +** Description +** +** +*******************************************************************************/ +void Power_IT_WakeUp(void) +{ +} + + + +#ifdef RVM_PWR_SWE +/******************************************************************************* +** +** Function PWR_Charger_Plug +** +** Description +** +** +*******************************************************************************/ +void PWR_Charger_Plug(void) +{ + + /* Start the fast charging cycle */ + + /* Since this function is called from the SPI task + it can't be interrupt by another task + so we can directly access the SPI through the low-level driver */ + + if (SPI_GBL_INFO_PTR->is_gsm_on == FALSE) /* GSM OFF */ + { + rvf_delay(RVF_MS_TO_TICKS(2000)); + } + + rvf_stop_timer(SPI_TIMER3); + + /* informs the upper layer that the charger has been plugged */ + pwr_send_charger_plug_event(); + + /* get the type of the battery */ + pwr_get_battery_type(); +} + + + +/******************************************************************************* +** +** Function PWR_Charger_Unplug +** +** Description +** +** +*******************************************************************************/ +void PWR_Charger_Unplug(void) +{ + /* informs the upper layer that the charger has been unplugged */ + pwr_send_charger_unplug_event(); + + rvf_send_trace("Charger unplug", 14, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID ); + pwr_stop_charging(); + if (SPI_GBL_INFO_PTR->is_gsm_on == FALSE) /* GSM OFF */ + { + #ifndef _WINDOWS + #if (ANLG_FAM == 1) + ABB_Write_Register_on_page(PAGE0, VRPCCTL2, 0x00EE); + #elif ((ANLG_FAM == 2) || (ANLG_FAM == 3)) + ABB_Write_Register_on_page(PAGE0, VRPCDEV, 0x0001); + #endif + #else + ABB_Write_Register_on_page(PAGE0, VRPCDEV, 0x00EE); + #endif // _WINDOWS + } + else + { + pwr_handle_discharge(); + } +} +#endif /* #ifdef RVM_PWR_SWE */ + + + + +