1 模块概要
1.1 模块功能介绍
XR871 PM(power manager)即低功耗模块主要用于降低系统功耗。
系统运行时降低功耗主要使用 WFI 和 tickless,默认都开启,不需要用户做任何配置。
WFI 是 cpu 没任务时进入 WFI(wait for interrupt) 状态,WFI 状态比正常工作状态功耗低不少。
Tickless 是在低负载时,关闭不必要的 tick 中断以让 cpu 更多时间在 WFI 状态。
休眠状态包括 sleep 和 standby,用户可以配置此系统支持与否。
休眠是在系统长时间无任务而又需要联网时,关闭多数外设,保留网络通信能力,在收到数据时,能尽快唤醒系统进行处理。
关机是系统只保留 prcm/RTC 部分的电源,只有特定的 wakeup gpio 和 wakeup timer 能复位系统,系统复位后,重新初始化。
1.2 软件结构
系统进入低功耗模式的流程,如果是进入 sleep 或 standby 模式,系统可被唤醒,唤醒后与休眠之前的配置一致,流程如下:
1.3 调用流程
1. 用户触发休眠动作,即调用休眠函数: pm_enter_mode()。
2. 休眠函数会依次调用各设备注册的 suspend 和 suspend_noirq 函数,调用顺序为注册的相反顺序,保证资源的依赖关系不会错误。
各函数依次休眠完成且无错误后,最后一次判断是否有中断发生,如果有中断,则依次唤醒设备,退出休眠;如果无中断发生,则调用 cpu_suspend 函数,保存 cpu 上下文,设置 deepsleep mode,进入 WFI 状态。
3. 硬件模块 WIC 检测到 cpu 进入 deepsleep mode 且处于 WFI 状态时,关闭电源域。
4. WIC 等待唤醒事件的发生。有唤醒事件时,系统重新上电,cpu 从复位函数开始执行。
5. 复位函数检测到上次为休眠行为,则跳入恢复现场函数,现场恢复后,为 suspend_ops->enter() 执行的下一条语句,即开始执行唤醒流程。
6. 依次调用设备的 resume_noirq 和 resume 函数,调用流程与休眠顺序相反,即最后休眠的最先唤醒。
2 模块接口
2.1 模块接口
Reference | Functions | Detail |
PM | HAL_Wakeup_GetEvent | uint32_t HAL_Wakeup_GetEvent(void)
Purpose : 获取唤醒事件
Param : dev:None
returns : 事件定义见 hal_wakeup.h 中 PM_WAKEUP_SRC_xx 定义 |
HAL_Wakeup_SETiO | void HAL_Wakeup_SetIO(uint32_t pn, uint32_t mode)
Purpose : 设置 wakeup gpio
Param : dev:Pn:port num,0~9,编号与实际 gpio 对应关系见 hal_gpio.h
Mode: 0:下降沿唤醒,1:上升沿唤醒
Returns : None |
HAL_Wakeup_ClrIO | void HAL_Wakeup_ClrIO(uint32_t pn)
Purpose : 清除 wakeup gpio
Param : dev:Pn:port num,0~9,编号与实际 gpio 对应关系见 hal_gpio.h
Returns : None |
HAL_Wakeup_SetTimer | int32_t HAL_Wakeup_SetTimer(uint32_t count_32k)
Purpose : 设置 wakeup timer
Param : count_32k:唤醒时间,基于 32k 计数
Returns : 返回状态(0:ok) |
HAL_Wakeup_SetTimer_mS | int32_t HAL_Wakeup_SetTimer_mS(ms)
Purpose : 设置 wakeup timer
Param : ms:唤醒时间,基于 ms
Returns : 返回状态(0:ok) |
pm_register_ops | int pm_register_ops(struct soc_device *dev)
Purpose : 注册设备的休眠唤醒函数实现
Param : dev:设备信息和休眠唤醒函数的实现
必须要实现 dev->driver-> suspend/ resume, 或 dev->driver-> suspend_noirq / resume_noirq.
Returns : 返回状态(0:ok) |
更多详细内容请下载附件查看