nes-proj/arch/platform/zoul/remote-reva/power-mgmt.h
2017-09-29 22:18:48 +02:00

188 lines
7.2 KiB
C

/*
* Copyright (c) 2015, Zolertia - http://www.zolertia.com
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
/*---------------------------------------------------------------------------*/
/**
* \addtogroup remote-reva
* @{
*
* \defgroup remote-power-mgmt-reva RE-Mote power management driver
*
* The power management module is composed by a nano-watt (gating) timer and an
* ultra-low power MCU, driving the RE-Mote power supply when connected to an
* external battery, and allowing an application to enter a so-called "shutdown
* mode".
* While in shutdown mode, only the RTCC and the power management block is on,
* effectively reducing the RE-Mote power consumption down to <~200nA. The
* nano Timer allows the RE-Mote to be awaken off shutdown mode after a given
* period (from 100ms to 2 hours, default is 1 minute). To change the shutdown
* period, the R47 resistor (at the DELAY input pin, see the RE-Mote datasheet)
* has to be changed.
* See the TPL5110 datasheet ((Table 2 and 3) for more information about the R47
* resistor value, below is a table resuming most common periods:
*
* +------------+------------+
* | R47 (Ohm) | Time |
* +------------+------------+
* | 500 | 100ms |
* +------------+------------+
* | 2.5K | 500ms |
* +------------+------------+
* | 5.202K | 1s |
* +------------+------------+
* | 22.021K | 1min |
* +------------+------------+
* | 42.887K | 5min |
* +------------+------------+
* | 57.434K | 10min |
* +------------+------------+
* | 92.233K | 30min |
* +------------+------------+
* | 170K | 2h |
* +------------+------------+
*
* An application can enter the shutdown mode before the shutdown period expires
* by invoking the PM_SHUTDOWN_NOW macro.
* The on-board RTCC can also be used to drive the CC2538 off PM3 power mode, if
* the application requires to retain RAM. Note that while in shutdown mode the
* RE-Mote will be powered off.
*
* @{
*
* \file
* Header file for the RE-Mote Power Management driver
*/
/* -------------------------------------------------------------------------- */
#ifndef POWER_MGMT_H_
#define POWER_MGMT_H_
#include "dev/gpio.h"
/* -------------------------------------------------------------------------- */
#define PM_CMD_PORT_BASE GPIO_PORT_TO_BASE(PM_CMD_PORT)
#define PM_CMD_PIN_MASK GPIO_PIN_MASK(PM_CMD_PIN)
#define PM_DONE_PORT_BASE GPIO_PORT_TO_BASE(PM_DONE_PORT)
#define PM_DONE_PIN_MASK GPIO_PIN_MASK(PM_DONE_PIN)
/* -------------------------------------------------------------------------- */
/** \name Power Management return values
* @{
*/
#define PM_SUCCESS 0
#define PM_ERROR (-1)
#define PM_MAX_BITS 8
/** @} */
/* -------------------------------------------------------------------------- */
/** \name Power Management "done" signal
* @{
*/
#define PM_SHUTDOWN_NOW GPIO_SET_PIN(PM_DONE_PORT_BASE, PM_DONE_PIN_MASK)
/** @} */
/* -------------------------------------------------------------------------- */
/** \name Power Management timing values
* @{
*/
#define PM_1_MILISECOND 1000L
#define PM_2_2_MILISECOND 2200L
#define PM_3_MILISECOND 3000L
#define PM_10_MILISECOND 10000L
/** @} */
/* -------------------------------------------------------------------------- */
/** \name Power Management commands
* @{
*/
typedef enum {
PM_CMD_PWR_ON = 0x34,
PM_CMD_PWR_OFF = 0x35,
PM_CMD_RST_HARD = 0x36,
PM_CMD_RST_TIMED = 0x37, /* Not implemented */
PM_CMD_DTIMER_ON = 0x38,
PM_CMD_DTIMER_OFF = 0x39,
PM_CMD_DTIMER_TIMED = 0x3A, /* Not implemented */
PM_CMD_PARAM_SET_MAX_TIME = 0x3B, /* Not implemented */
PM_CMD_GET_STATE = 0x3C,
PM_CMD_GET_FW_VERSION = 0x3D,
PM_MAX_NUM_CMDS
} pm_cmd_t;
/** @} */
/* -------------------------------------------------------------------------- */
/** \name Power Management status and masks
* @{
*/
typedef enum {
PM_IDLE,
PM_SYSOFF_OFF,
PM_SYSOFF_ON,
PM_TIMER_DISABLED,
PM_TIMER_ENABLED,
PM_AWAITING_RTC_DIS, /* Not implemented */
PM_AWAITING_RTC_EVENT, /* Not implemented */
} pm_state_t;
#define PM_SYSOFF_ON_MASK 0x01
#define PM_TIMER_ENABLED_MASK 0x02
#define PM_AWAITING_RTC_EVENT_MASK 0x04
/** @} */
/* -------------------------------------------------------------------------- */
/** \name Power Management functions
* @{
*/
/** \brief Initializes the Power Management driver
* \return PM_SUCCESS if initialized, else PM_ERROR
*/
int8_t pm_init(void);
/* -------------------------------------------------------------------------- */
/** \brief Enable the shutdown mode, periodically driven by the Nano Timer
* \return PM_SUCCESS if successful, else PM_ERROR
*/
int8_t pm_enable_timer(void);
/* -------------------------------------------------------------------------- */
/** \brief Disable the Nano Timer
* \return PM_SUCCESS if successful, else PM_ERROR
*/
int8_t pm_disable_timer(void);
/* -------------------------------------------------------------------------- */
/** \brief Get the current state of the power management module
* \param state Pointer to a variable to save the state
* \return PM_SUCCESS if successful, else PM_ERROR
*/
int8_t pm_get_state(uint8_t *state);
/* -------------------------------------------------------------------------- */
/** \brief Get the firmware version of the power management module
* \param state Pointer to a variable to save the state
* \return PM_SUCCESS if successful, else PM_ERROR
*/
int8_t pm_get_firmware_version(uint8_t *state);
/* -------------------------------------------------------------------------- */
/** @} */
#endif /* POWER_MGMT_H_ */
/*---------------------------------------------------------------------------*/
/**
* @}
* @}
*/