电源管理

概述

PM 模块提供电源管理功能。

功能特性

  • 提供电源管理基础功能。

  • 支持相关设备注册参与电源管理。

  • 支持投票控制低功耗功能。

  • 支持休眠管理功能。

  • 唤醒源管理

  • 关机模式

深度睡眠

系统在空闲时自动进入休眠状态,当有唤醒源中断产生或系统 timer 到时时唤醒系统继续运行。

系统在深度睡眠期间,外设和cpu将停止工作并掉电,内存处于深度睡眠保持模式

  • 依赖关系

    系统进入休眠状态时软件和大部分外设不能继续工作,故进入休眠前需检查所有模块的状态,确保对系统电源无依赖方可进入休眠

    所有对电源有依赖的模块可调用 wq_power_mgnt_register_node() 注册依赖到电源管理,系统进入休眠前将检查依赖情况

    依赖检查的回调原型:

    1typedef uint32_t (*idle_check_callback)(uint32_t time_ms);
    

    参数 time_ms: 系统请求的休眠时间。 返回值 uint32_t: 模块空闲的时间,以毫秒为单位。

    系统当前已添硬件外设的依赖关系,如果外设正在工作,则系统不会进入休眠状态

  • 保存与恢复

    系统进入休眠后,大部分外设将处于掉电状态,唤醒后,将处于复位状态,需要对睡眠前的外设状态进行保存并在唤醒后进行恢复

    当前系统已对休眠时掉电的外设添加了保存和恢复,应用无需关心,唤醒后可继续正常使用。

  • 唤醒源

    进入低功耗模式后,已下中断具备对系统的唤醒能力:

    • AONGPIO, 仅*电平*中断支持唤醒, 仅ACORE

    • CHARGER, 5v/3.3v, 仅支持电平中断唤醒, 仅ACORE

    • TOUCH_KEY, 内置触摸设备中断, 仅ACORE

    • DEBOUNCE, 按键中断, 仅ACORE

    • IPC, 核间通信, 仅ACORE

    • BT, 仅BCORE

    系统在无外部唤醒源时,在os指定的时间也会自动唤醒,故使用 os_delay()os_timer 也可使系统在指定时间继续工作

    备注

    说明: 配置唤醒源时,应先单独配置中断,再开启对应的唤醒源,例如配置AONGPIO00 高电平唤醒

    1wq_gpio_open_as_interrupt(WQ_GPIO_A00, WQ_GPIO_INT_LEVEL_HIGH, NULL);
    2wq_gpio_wakeup_enable(WQ_GPIO_A00);
    3wq_power_mgnt_enable_shutdown_wakeup_source(WQ_DS_WAKEUP_SRC_GPIO);
    
  • 禁止低功耗状态

    在特定场景下,可能需要临时禁止系统进入低功耗状态已提高系统响应速度,可使用 wq_power_mgnt_keep_active() 使系统 禁止 进入低功耗状态 wq_power_mgnt_release_keep_active() 允许 进入低功耗状态

关机

系统仅保留极少模块用于唤醒,其余模块关闭且下电。使芯片处于极低功耗模式下,并且在指定唤醒源产生时使系统开机,从头还是初始化并加载运行软件。

相当于低功耗模式,关机模式时将关闭memory,故系统被唤醒时只能从rom阶段开始启动

API 介绍

Defines

DBGLOG_LIB_PM_INFO(fmt, arg...)
DBGLOG_LIB_PM_ERROR(fmt, arg...)
DBGLOG_LIB_PM_WARNING(fmt, arg...)

Typedefs

typedef uint32_t (*idle_check_callback)(uint32_t time_ms)

System idle check callback function type.

Param time_ms:

System request to sleep time in millisecond

Return:

uint32_t Allow to sleep time in millisecond

Functions

void *wq_power_mgnt_get_sleep_block_node(void)

Return the busy check function that block system enter deepsleep.

返回:

void* callback function pointer of busy node

WQ_RET wq_power_mgnt_register_node(idle_check_callback cb)

Register a system idle check module.

参数:

cb -- [in] idle check callback

返回:

WQ_RET WQ_RET_OK for success

WQ_RET wq_power_mgnt_unregister_node(idle_check_callback cb)

Unregister a system idle check module.

参数:

cb -- [in] idle check callback

返回:

WQ_RET WQ_RET_OK for success

WQ_RET wq_power_mgnt_early_init(void)

This function is to init power managment.

返回:

WQ_RET WQ_RET_OK for success else error.

WQ_RET wq_power_mgnt_init(uint32_t lowpower_thr_ms)

This function is to init power managment module after os inited. for threshold - when larger then this threshold, the corresponding sleep mode would be enter. the check priority if 0 is used, then this means always sleep if chance.

参数:

lowpower_thr_ms -- is lowpower thr.

返回:

WQ_RET WQ_RET_OK for success else error.

WQ_RET wq_power_mgnt_set_sleep_thr(uint32_t time_ms)

Set the threshold of min sleep time.

参见

WQ_RET

参数:

time_ms -- lowpower threshold time ms.

返回:

WQ_RET

WQ_RET wq_power_mgnt_get_sleep_thr(uint32_t *time_ms)

Set the threshold of min sleep time.

参见

WQ_RET

参数:

time_ms -- [out] deep sleep threshold pointer.

返回:

WQ_RET

void wq_power_mgnt_perf_get(uint32_t *chip_ms, uint32_t *bt_ms, uint32_t *sw_ms, uint32_t *lp_cnt)

This function is to get performance parameter.

参数:
  • chip_ms -- chip in lowpower millsecond.

  • bt_ms -- bcore in lowpower millsecond.

  • sw_ms -- current core lowpower millsecond.

  • lp_cnt -- current core lowpower count.

void wq_power_mgnt_keep_active(void)

Keep local domain at active mode.

void wq_power_mgnt_release_keep_active(void)

Stop keep local domain at active mode.

void wq_power_mgnt_shutdown(void)

System enter shutdown mode.

备注

Once this API is called, the system will immediately enter shutdown state. This API will not return

WQ_RET wq_power_mgnt_enable_deepsleep_wakeup_source(WQ_DS_WAKEUP_SRC src)

Enable wakeup source at deepsleep mode.

参见

WQ_RET

参数:

src -- [in] wakeup src

返回:

WQ_RET

WQ_RET wq_power_mgnt_disable_deepsleep_wakeup_source(WQ_DS_WAKEUP_SRC src)

Disable wakeup source at deepsleep mode.

参见

WQ_RET

参数:

src -- [in] wakeup src

返回:

WQ_RET

WQ_RET wq_power_mgnt_enable_shutdown_wakeup_source(WQ_DS_WAKEUP_SRC src)

Enable wakeup source at shutdown mode.

参见

WQ_RET

参数:

src -- [in] wakeup src

返回:

WQ_RET

WQ_RET wq_power_mgnt_disable_shutdown_wakeup_source(WQ_DS_WAKEUP_SRC src)

Disable wakeup source at shutdown mode.

参见

WQ_RET

参数:

src -- [in] wakeup src

返回:

WQ_RET

WQ_RET wq_power_mgnt_set_shutdown_wakeup_time(uint32_t time_ms)

Set wakeup time from shutdown mode.

参见

WQ_RET

备注

Time start from api invoked

参数:

time_ms -- [in] time in millsecond, 0 for disable wakeup timer, The valid range is 1-131071999.

返回:

WQ_RET

Typedefs

typedef struct pm_device pm_device_t

Enums

enum WQ_PM_DEVICE_PRIORITY

Values:

enumerator WQ_PM_DEVICE_PRIORITY_0
enumerator WQ_PM_DEVICE_PRIORITY_1
enumerator WQ_PM_DEVICE_PRIORITY_2
enumerator WQ_PM_DEVICE_PRIORITY_3
enumerator WQ_PM_DEVICE_PRIORITY_4
enumerator WQ_PM_DEVICE_PRIORITY_5
enumerator WQ_PM_DEVICE_PRIORITY_6
enumerator WQ_PM_DEVICE_PRIORITY_7

Functions

void *wq_pm_device_get_sleep_block(void)
pm_device_t *wq_pm_device_create(WQ_PM_DEVICE_PRIORITY priority)
WQ_RET wq_pm_device_destory(pm_device_t *dev)
uint32_t wq_pm_device_save(void)
uint32_t wq_pm_device_restore(void)
WQ_RET wq_pm_device_init(void)
uint32_t wq_pm_device_get_sleep_time(bool clear)
void wq_pm_device_get_save_restore_time(uint32_t *save, uint32_t *restore)
struct pm_device

Public Members

struct list_head node
WQ_RET (*save)(void *data)
WQ_RET (*restore)(void *data)
bool (*busy)(void)
void *data
uint32_t data_len
WQ_PM_DEVICE_PRIORITY priority