1. 概述
1.1 编写目的
本文档的目的在于简要介绍一下H6
SDK所支持的 standby行为,以及为了支持 standby,各驱动
模块所需工作及其注意的事项。
2. 模块介绍
2.1 模块功能介绍
对于
嵌入式设备尤其是移动设备来说,功耗是系统的重要指标,系统设计的重要目标之一就是要尽可能地降低功耗。
standby 模块,在特定策略控制下,通过与
CPU,内存、显示屏、
GPU 等相协调,支持对一系列电压和频率的块速调节,从而降低嵌入式系统的功耗。
standby 模块,具有以下特点:
• 支持 super standby + extended_standby;
• 支持 standby 模式下:唤醒源的增加;
• 在 extended_standby 的支持下,支持在特定场景下,进入 standby 的可能(如:usb_standby,normal standby,misc_standby)。
2.2 模块配置介绍
2.2.1 Menuconfig 配置
1. 运行
MAKE ARCH=
arm64 menuconfig,见下图界面;
2. 选择
power Management
options, 按下图所示配置即可:
2.2.2 Extended_standby 下对唤醒源的配置
standby 总是和唤醒源联系在一起的,唤醒源描述的是使得系统退出 standby 状态的条件。
extended_standby 将参与动态运行时,各种场景下的功耗管理。在这些场景下的供电依赖关系与唤醒源之间需要保持一致性,才能满足系统的工作需求。
Extended_standby 的配置,是支持动态更改的,因而,对其唤醒源的配置,也是支持动态更改的。因而,extended_standby 的配置包⼊两个方面:
• 供电依赖关系(能够支持对唤醒源的检测);
• 唤醒源。
2.2.3 调试打印信息配置
通过以下命令:
$echo 0xff > /sys/power/aw_pm/debug_mask
更改 debug_mask 的配置,可控制 standby 的打印。
每一个 bit 控制不同内容的打印,如下:
typedef enum{
PM_STANDBY_PRINT_STANDBY = (1U << 0),
PM_STANDBY_PRINT_RESUME = (1U << 1),
PM_STANDBY_
enable_JTAG = (1U << 2),
PM_STANDBY_PRINT_PORT = (1U << 3),
PM_STANDBY_PRINT_IO_STATUS = (1U << 4),
PM_STANDBY_PRINT_CACHE_TLB_MISS = (1U << 5),
PM_STANDBY_PRINT_CCU_STATUS = (1U << 6),
PM_STANDBY_PRINT_PWR_STATUS = (1U << 7),
PM_STANDBY_PRINT_CPUS_IO_STATUS = (1U << 8),
PM_STANDBY_PRINT_CCI400_REG = (1U << 9),
PM_STANDBY_PRINT_GTBUS_REG = (1U << 10),
PM_STANDBY_TEST = (1U << 11),
PM_STANDBY_PRINT_RESUME_IO_STATUS = (1U << 12)
}debug_mask_flag;
2.3
内核对 standby 支持
内核导出了两个符号:standby_type, standby_level, 同时提供了一个场景接口,以利于各模块实现对 standby 的支持:
• 根据目标:区分 normal standby和super standby.
• 根据掉电情况:区别对待设备;
• 根据场景:区分系统当前处在的场景,关心该场景的模块,需要对其进行特殊处理;
变量介绍:
• standby_type: 表目标,支持 NORMAL_STANDBY,SUPER_STANDBY;
• standby_level:表结果,支持STANDBY_WITH_POWER_OFF,STANDBY_WITH_POWER;
• check_scene_locked: 获取系统当前处在的场景,talking, usb, bootfast, or
ETC…
2.4 普通模块对 super standby 的支持
各模块需要实现 suspend+resume 接口,以支持超级 standby, 确保系统唤醒后,能正常稳定的工作,流程如下:
1. 包⼊头文件
linux/pm.h;
2. 判断 standby 类型, 并进行相应处理;
3. 关心场景的模块,还需判断场景,进行处理。
建议:super standby 和 normal standby 使用相同的代码,不对 normal standby 进行特殊处理,可减少代码的维护量,且对系统性能影响不大。
示例:
if (check_scene_locked(SCENE_XXXX_STANDBY) == 0) {
// process for the scene you care.
} else {
// process for super standby and normal standby. }
更多详细内容请下载附件查看