112 lines
2.3 KiB
C
Raw Normal View History

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
}