view src/cs/drivers/drv_app/power/board/power.c @ 261:841a848ba762

SPI SWE: clear any pending boot-time interrupts in spi_init() Charger plug/unplug hw logic in the Iota ABB has no built-in debouncing, thus electrical contact bounce on the charging power connection interface produces a lot of charger plug/unplug interrupts. When we boot in charging mode (charging power present at boot time and is presumably the cause of Switch-ON), some bounce may occur between the initial Iota Switch-ON action and Calypso firmware booting. By clearing any accumulated ITSTATREG interrupts on boot, we prevent these pre-boot interrupts from generating charger plug/unplug events to FCHG, which would upset smooth from-boot charging.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 14 May 2021 02:49:05 +0000
parents a5b00817a60f
children b5e8dfd114a7
line wrap: on
line source

/*******************************************************************************
*
* 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)
*
* The present FreeCalypso version is heavily modified from TI's original,
* for the new FreeCalypso way of managing handset on/off state.
*
******************************************************************************/

#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

#ifndef _WINDOWS
  /* Declare the variable containing pressed and released callback.  */
  extern T_KPD_KEYPAD Kp;

  extern effs_t ffs_exit(void);
#endif  // _WINDOWS

#if (MMI != 0)
  #include "fcbm/fcbm_send_msg.h"
#endif

/// 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)
{
#if (MMI != 0)
    extern void fchs_pwon_button_boot(void);
    extern int r2d_is_running, mmi_task_init_done;
    extern UINT16 fchg_first_vbat;

    while (!fchg_first_vbat || !r2d_is_running || !mmi_task_init_done)
	rvf_delay(8);

    fchs_pwon_button_boot();
#endif
}


/*******************************************************************************
**
** 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)
{
    rvf_send_trace("Power off button", 16, NULL_PARAM, RV_TRACE_LEVEL_WARNING,
		   LCC_USE_ID);
    if (Kp.pressed && Kp.released) {
	(Kp.pressed)(KPD_PWR);  /* tell key is pressed */
	rvf_delay(5);
	(Kp.released)();        /* tell key is released */
    } else
	ABB_Power_Off();
}


/**
 * @brief Sets the cause of the switch 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 (Power_abb_status & CHGPRES)
   {
      /* Switch on Condition on CHARGER IC PLUG */
      rvf_send_trace("Boot: Charger Plug",18, NULL_PARAM,
		     RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID);
      #if (MMI != 0)
	fcbm_message_to_task(FCBM_START_CHG_MODE);
      #endif
   }

   else if (Power_abb_status & ONBSTS)
   {
      /* 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();
   }

   else
   {
      /* In FreeCalypso start from reset is NOT the same as PWON! */
      rvf_send_trace("Start from reset",16, NULL_PARAM,
		     RV_TRACE_LEVEL_DEBUG_LOW, LCC_USE_ID);
      #if (MMI != 0)
	fcbm_message_to_task(FCBM_START_RESET_MODE);
      #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)
{
}