ameba_ws2812b/component/os/freertos/freertos_pmu.c
2015-11-17 10:30:14 +08:00

96 lines
2.3 KiB
C

#include "FreeRTOS.h"
#include "freertos_pmu.h"
#include "platform_autoconf.h"
#include "sleep_ex_api.h"
#include "wlan_intf.h"
static uint32_t wakelock = DEFAULT_WAKELOCK;
static uint32_t wakeup_event = DEFAULT_WAKEUP_EVENT;
_WEAK void rltk_wlan_pre_sleep_processing (void) {
// Add dummy function for MP
}
_WEAK void rltk_wlan_post_sleep_processing (void) {
// Add dummy function for MP
}
/* ++++++++ FreeRTOS macro implementation ++++++++ */
/*
* It is called in idle task.
*
* @return true : System is ready to check conditions that if it can enter sleep.
* false : System keep awake.
**/
int freertos_ready_to_sleep() {
return wakelock == 0;
}
/*
* It is called when freertos is going to sleep.
* At this moment, all sleep conditons are satisfied. All freertos' sleep pre-processing are done.
*
* @param expected_idle_time : The time that FreeRTOS expect to sleep.
* If we set this value to 0 then FreeRTOS will do nothing in its sleep function.
**/
void freertos_pre_sleep_processing(unsigned int *expected_idle_time) {
#ifdef CONFIG_SOC_PS_MODULE
unsigned int stime;
/* To disable freertos sleep function and use our sleep function,
* we can set original expected idle time to 0. */
stime = *expected_idle_time;
*expected_idle_time = 0;
#ifdef CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD
#ifdef CONFIG_POWER_SAVING
if (wakeup_event & SLEEP_WAKEUP_BY_WLAN) {
rltk_wlan_pre_sleep_processing();
}
#endif
#endif
sleep_ex(wakeup_event, stime);
#ifdef CONFIG_LITTLE_WIFI_MCU_FUNCTION_THREAD
#ifdef CONFIG_POWER_SAVING
if (wakeup_event & SLEEP_WAKEUP_BY_WLAN) {
rltk_wlan_post_sleep_processing();
}
#endif
#endif
#else
// If PS is not enabled, then use freertos sleep function
#endif
}
/* -------- FreeRTOS macro implementation -------- */
void acquire_wakelock(uint32_t lock_id) {
wakelock |= lock_id;
}
void release_wakelock(uint32_t lock_id) {
wakelock &= ~lock_id;
}
uint32_t get_wakelock_status() {
return wakelock;
}
void add_wakeup_event(uint32_t event) {
wakeup_event |= event;
}
void del_wakeup_event(uint32_t event) {
wakeup_event &= ~event;
// To fulfill tickless design, system timer is required to be wakeup event
wakeup_event |= SLEEP_WAKEUP_BY_STIMER;
}