sdk-ameba-v4.0c_180328/component/common/mbed/targets/hal/rtl8711b/sleep.c
2019-04-02 16:34:25 +08:00

248 lines
8.4 KiB
C
Executable file

/** mbed Microcontroller Library
******************************************************************************
* @file sleep.c
* @author
* @version V1.0.0
* @date 2016-08-01
* @brief This file provides mbed API for SLEEP.
******************************************************************************
* @attention
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*
* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
******************************************************************************
*/
#include "sleep_ex_api.h"
#include "cmsis.h"
SLEEP_WAKEUP_EVENT DStandbyWakeupEvent={0};
/**
* @brief To make the system entering the Clock Gated power saving.
* This function just make the system to enter the clock gated
* power saving mode and pending on wake up event waitting.
* The user application need to configure the peripheral to
* generate system wake up event, like GPIO interrupt,
* G-Timer timeout, etc. befor entering power saving mode.
* @param wakeup_event: A bit map of wake up event.
* This parameter can be any combination of the following values:
* @arg SLEEP_WAKEUP_BY_STIMER
* @arg SLEEP_WAKEUP_BY_GPIO_INT
* @arg SLEEP_WAKEUP_BY_WLAN
* @arg SLEEP_WAKEUP_BY_SDIO
* @arg SLEEP_WAKEUP_BY_USB
* @arg SLEEP_WAKEUP_BY_GPIO
* @arg SLEEP_WAKEUP_BY_UART
* @arg SLEEP_WAKEUP_BY_I2C
* @arg SLEEP_WAKEUP_BY_RTC
* @param sleep_duration: the system sleep duration in ms, only valid
* for SLEEP_WAKEUP_BY_STIMER wake up event.
* @retval None
*/
void sleep_ex(uint32_t wakeup_event, uint32_t sleep_duration)
{
__asm volatile( "cpsid i" );
SOCPS_SleepInit();
/* user setting have high priority */
SOCPS_SetWakeEvent(wakeup_event, ENABLE);
if (sleep_duration > 0) {
SOCPS_SET_REGUTIMER(sleep_duration, 0xFFFFFFFF);
}
SOCPS_SleepPG();
}
/**
* @brief To make the system entering the Clock Gated power saving.
* This function just make the system to enter the clock gated
* power saving mode and pending on wake up event waitting.
* The user application need to configure the peripheral to
* generate system wake up event, like GPIO interrupt
* , G-Timer timeout, etc. befor entering power saving mode.
* @param wakeup_event: A bit map of wake up event.
* This parameter can be any combination of the following values:
* @arg SLEEP_WAKEUP_BY_STIMER
* @arg SLEEP_WAKEUP_BY_GPIO_INT
* @arg SLEEP_WAKEUP_BY_WLAN
* @arg SLEEP_WAKEUP_BY_SDIO
* @arg SLEEP_WAKEUP_BY_USB
* @arg SLEEP_WAKEUP_BY_GPIO
* @arg SLEEP_WAKEUP_BY_UART
* @arg SLEEP_WAKEUP_BY_I2C
* @arg SLEEP_WAKEUP_BY_RTC
* @param sleep_duration: the system sleep duration in ms, only valid
* for SLEEP_WAKEUP_BY_STIMER wake up event.
* @param clk_sourec_enable: the option for SCLK on(1)/off(0)
* @param sdr_enable: the option for turn off the SDR controller (1:off, 0:on)
* @retval None
*/
void sleep_ex_selective(uint32_t wakeup_event, uint32_t sleep_duration, uint32_t clk_sourec_enable, uint32_t sdr_enable)
{
sleep_ex(wakeup_event, sleep_duration);
}
/**
* @brief To add a wake up event to wake up the system from the
* deep standby power saving mode.
* @param wakeup_event: A bit map of wake up event.
* This parameter can be any combination of the following values:
* @arg STANDBY_WAKEUP_BY_STIMER
* @arg STANDBY_WAKEUP_BY_GPIO
* @arg STANDBY_WAKEUP_BY_RTC
* @param sleep_duration_ms: the system sleep duration in ms, only valid
* for STANDBY_WAKEUP_BY_STIMER wake up event.
* @param gpio_active: for a GPIO pin to wake up the system by goes high or low
* This parameter can be any combination of the following values:
* @arg WAKEUP_BY_GPIO_NONE
* @arg WAKEUP_BY_GPIO_WAKEUP0_LOW
* @arg WAKEUP_BY_GPIO_WAKEUP0_HIG
* @arg WAKEUP_BY_GPIO_WAKEUP1_LOW
* @arg WAKEUP_BY_GPIO_WAKEUP1_HIG
* @arg WAKEUP_BY_GPIO_WAKEUP2_LOW
* @arg WAKEUP_BY_GPIO_WAKEUP2_HIG
* @arg WAKEUP_BY_GPIO_WAKEUP3_LOW
* @arg WAKEUP_BY_GPIO_WAKEUP3_HIG
* @retval None
*/
void standby_wakeup_event_add(uint32_t wakeup_event, u32 gpio_active)
{
DStandbyWakeupEvent.wakeup_event |= wakeup_event;
if (gpio_active != 0) {
DStandbyWakeupEvent.gpio_option |= gpio_active;
}
}
/**
* @brief To delete a wake up event for wakeing up the system from the
* deep standby power saving mode.
* @param wakeup_event: A bit map of wake up event.
* This parameter can be any combination of the following values:
* @arg STANDBY_WAKEUP_BY_STIMER
* @arg STANDBY_WAKEUP_BY_GPIO
* @arg STANDBY_WAKEUP_BY_RTC
* @retval None
*/
void standby_wakeup_event_del(uint32_t wakeup_event)
{
DStandbyWakeupEvent.wakeup_event &= ~wakeup_event;
}
/**
* @brief To make the system entering the Deep Standby power saving.
* The CPU, memory and part fo peripheral power is off when
* entering deep standby power saving mode. The program needs
* to be reload from the flash at system resume.
* @retval None
*/
void deepstandby_ex(uint32_t sleep_duration_ms)
{
__asm volatile( "cpsid i" );
/* Clear event */
SOCPS_ClearWakeEvent();
/* power mode option: */
SOCPS_DstandbyInit();
if (DStandbyWakeupEvent.wakeup_event & STANDBY_WAKEUP_BY_STIMER) {
DStandbyWakeupEvent.timer_duration = sleep_duration_ms;
}
/* user setting have high priority */
if (DStandbyWakeupEvent.wakeup_event != 0) {
SOCPS_SetWakeEvent(DStandbyWakeupEvent.wakeup_event, ENABLE);
}
if (DStandbyWakeupEvent.gpio_option != WAKEUP_BY_GPIO_NONE) {
SOCPS_WakePinsCtrl(DStandbyWakeupEvent.gpio_option);
}
if (DStandbyWakeupEvent.timer_duration > 0) {
SOCPS_SET_REGUTIMER(DStandbyWakeupEvent.timer_duration, 0xFFFFFFFF);
}
SOCPS_DeepStandby_RAM();
}
/**
* @brief To make the system entering the Deep Sleep power saving mode.
* The CPU, memory and peripheral power is off when entering
* deep sleep power saving mode. The program needs to be reload
* and all peripheral needs be re-configure when system resume.
* @param wakeup_event: A bit map of wake up event.
* This parameter can be any combination of the following values:
* @arg DSLEEP_WAKEUP_BY_TIMER
* @arg DSLEEP_WAKEUP_BY_GPIO
* @param sleep_duration: the system sleep duration in ms, only valid
* for DSLEEP_WAKEUP_BY_TIMER wake up event.
* @retval None
*/
void deepsleep_ex(uint32_t wakeup_event, uint32_t sleep_duration)
{
__asm volatile( "cpsid i" );
SOCPS_DsleepInit();
if (sleep_duration > 0) {
SOCPS_SET_REGUTIMER(sleep_duration, 0xFFFFFFFF);
}
SOCPS_DeepSleep_RAM();
}
/**
* @brief get deep sleep wakeup reason.
* @retval BIT(0): Timer, BIT(2): GPIO
*/
int deepsleep_get_bootup_reason()
{
int Reason = SOCPS_DsleepWakeReason();
if (Reason & BIT_SYSON_DSLP_WTIMER33)
return DSLEEP_WAKEUP_BY_TIMER;
else if (Reason & BIT_SYSON_DSLP_GPIO)
return DSLEEP_WAKEUP_BY_GPIO;
else
return 0;
}
/**
* @brief get deep standby wakeup reason.
* @retval BIT(29): GPIO, BIT(28): REGU A33, BIT(13): RTC, BIT(0): ANA
*/
int deepstandby_get_bootup_reason()
{
int Reason = SOCPS_DstandbyWakeReason();
if (Reason & BIT_SYSON_WEVT_GPIO_DSTBY_STS)
return STANDBY_WAKEUP_BY_GPIO;
else if (Reason & BIT_SYSON_WEVT_A33_STS)
return STANDBY_WAKEUP_BY_STIMER;
else if (Reason & BIT_SYSON_WEVT_RTC_STS)
return STANDBY_WAKEUP_BY_RTC;
else
return 0;
}
/**
* @brief get deep standby gpio wakeup reason.
* @retval BIT(24): _PA_18, BIT(25): _PA_5, BIT(26): _PA_22, BIT(27): _PA_23
*/
int deepstandby_get_bootup_reason_gpio() {
int reason_gpio = 0;
reason_gpio = SOCPS_DstandbyWakeReason_gpio();
if (reason_gpio & BIT_SYS_WAKEPIN0_WEVENT_STS)
return WAKUP_0;
else if (reason_gpio & BIT_SYS_WAKEPIN1_WEVENT_STS)
return WAKUP_1;
else if (reason_gpio & BIT_SYS_WAKEPIN2_WEVENT_STS)
return WAKUP_2;
else if (reason_gpio & BIT_SYS_WAKEPIN3_WEVENT_STS)
return WAKUP_3;
}
/******************* (C) COPYRIGHT 2016 Realtek Semiconductor *****END OF FILE****/