2021-03-02 21:25:27 +08:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD>(power manager)
|
|
|
|
|
*
|
|
|
|
|
* Copyright (c) 2021, <morro_luo@163.com>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*
|
|
|
|
|
* Change Logs:
|
|
|
|
|
* Date Author Notes
|
2021-03-07 18:40:49 +08:00
|
|
|
|
* 2021-03-02 Morro Initial version.
|
2021-03-02 21:25:27 +08:00
|
|
|
|
******************************************************************************/
|
|
|
|
|
#include "pm.h"
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
|
|
/**
|
2021-03-07 18:40:49 +08:00
|
|
|
|
* @brief pm<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
typedef struct {
|
|
|
|
|
const pm_adapter_t *adt;
|
|
|
|
|
bool enable;
|
|
|
|
|
}pm_watch_t;
|
|
|
|
|
|
|
|
|
|
static pm_watch_t pm_watch;
|
2021-03-02 21:25:27 +08:00
|
|
|
|
|
2021-03-07 18:40:49 +08:00
|
|
|
|
static const pm_item_t pm_tbl_start SECTION("pm.item.0");
|
2021-03-02 21:25:27 +08:00
|
|
|
|
|
2021-03-07 18:40:49 +08:00
|
|
|
|
static const pm_item_t pm_tbl_end SECTION("pm.item.2");
|
2021-03-02 21:25:27 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @brief ϵͳ<EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static bool system_is_idle(void)
|
|
|
|
|
{
|
|
|
|
|
const pm_item_t *it;
|
|
|
|
|
for (it = &pm_tbl_start + 1; it < &pm_tbl_end; it++) {
|
2021-03-07 18:40:49 +08:00
|
|
|
|
if (it->idle != NULL && !it->idle())
|
2021-03-02 21:25:27 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @brief ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static void system_goto_sleep(void)
|
|
|
|
|
{
|
2021-03-07 18:40:49 +08:00
|
|
|
|
const pm_item_t *it;
|
|
|
|
|
const pm_adapter_t *adt;
|
|
|
|
|
unsigned int sleep_time;
|
2021-03-02 21:25:27 +08:00
|
|
|
|
unsigned int tmp;
|
2021-03-07 18:40:49 +08:00
|
|
|
|
|
|
|
|
|
adt = pm_watch.adt;
|
|
|
|
|
|
|
|
|
|
sleep_time = adt->max_sleep_time;
|
2021-03-02 21:25:27 +08:00
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>
|
|
|
|
|
for (it = &pm_tbl_start + 1; it < &pm_tbl_end; it++) {
|
2021-03-07 18:40:49 +08:00
|
|
|
|
if (it->sleep_notify == NULL)
|
2021-03-02 21:25:27 +08:00
|
|
|
|
continue;
|
2021-03-07 18:40:49 +08:00
|
|
|
|
tmp = it->sleep_notify(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>õ<EFBFBD><C3B5>豸<EFBFBD>ڴ<EFBFBD><DAB4>´λ<C2B4><CEBB><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
if (tmp && tmp < sleep_time) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>е<EFBFBD><D0B5><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
2021-03-02 21:25:27 +08:00
|
|
|
|
sleep_time = tmp;
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-07 18:40:49 +08:00
|
|
|
|
adt->goto_sleep(sleep_time);
|
2021-03-02 21:25:27 +08:00
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>
|
|
|
|
|
for (it = &pm_tbl_start + 1; it < &pm_tbl_end; it++) {
|
2021-03-07 18:40:49 +08:00
|
|
|
|
if (it->wakeup_notify == NULL)
|
2021-03-02 21:25:27 +08:00
|
|
|
|
continue;
|
2021-03-07 18:40:49 +08:00
|
|
|
|
it->wakeup_notify();
|
2021-03-02 21:25:27 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @retval adt - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void pm_init(const pm_adapter_t *adt)
|
|
|
|
|
{
|
2021-03-07 18:40:49 +08:00
|
|
|
|
pm_watch.adt = adt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @retval none
|
|
|
|
|
*/
|
|
|
|
|
void pm_enable(void)
|
|
|
|
|
{
|
|
|
|
|
pm_watch.enable = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @retval none
|
|
|
|
|
*/
|
|
|
|
|
void pm_disable(void)
|
|
|
|
|
{
|
|
|
|
|
pm_watch.enable = false;
|
2021-03-02 21:25:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @retval none
|
|
|
|
|
*/
|
|
|
|
|
void pm_process(void)
|
|
|
|
|
{
|
2021-03-07 18:40:49 +08:00
|
|
|
|
if (!pm_watch.enable || !system_is_idle())
|
2021-03-02 21:25:27 +08:00
|
|
|
|
return;
|
|
|
|
|
system_goto_sleep();
|
2021-03-07 18:40:49 +08:00
|
|
|
|
}
|