mirror of
https://github.com/jialexd/sdk-ameba-v4.0c_180328.git
synced 2024-11-28 17:20:30 +00:00
249 lines
8.4 KiB
C
249 lines
8.4 KiB
C
|
/** 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****/
|