initial commit
This commit is contained in:
248
lib/amb1_sdk/common/mbed/targets/hal/rtl8711b/sleep.c
Normal file
248
lib/amb1_sdk/common/mbed/targets/hal/rtl8711b/sleep.c
Normal file
@@ -0,0 +1,248 @@
|
||||
/** 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
|
||||
* @ANA and other return 0
|
||||
*/
|
||||
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****/
|
||||
Reference in New Issue
Block a user