目录
2.3 struct platform_suspend_ops
1、模块主要功能介绍
PM Core,SR(suspend/resume)主流程,顾名思义就是把Linux Kernel中各个低功耗模块组合在一起,成为睡眠和唤醒流程的主干道,我们称之为SR主流程。其在内核中特性的开关主要受以下宏控制:
CONFIG_PM、CONFIG_SUSPEND、CONFIG_PM_AUTOSLEEP、CONFIG_FREEZER、CONFIG_PM_SLEEP
相关代码主要在kernel/power/目录下
kernel/power/main.c ----提供用户态接口,以及pm notifier相关接口
kernel/power/suspend.c ----Suspend功能的主流程
kernel/power/console.c ----Suspend过程中对控制台的处理逻辑
kernel/power/process.c ----Suspend过程中对进程的处理逻辑
2、主要涉及的数据类型
2.1 suspend_state_t
数据类型定义在include/linux/suspend.h中,表示低功耗要进入的状态,在kernel中主要有4种状态,如下
typedef int __bitwise suspend_state_t;
#define PM_SUSPEND_ON ((__force suspend_state_t) 0)
#define PM_SUSPEND_TO_IDLE ((__force suspend_state_t) 1)
#define PM_SUSPEND_STANDBY ((__force suspend_state_t) 2)
#define PM_SUSPEND_MEM ((__force suspend_state_t) 3)
#define PM_SUSPEND_MIN PM_SUSPEND_TO_IDLE
#define PM_SUSPEND_MAX ((__force suspend_state_t) 4)
1)PM_SUSPEND_ON: 设备处于全电源状态,也就是正常工作状态。
2)PM_SUSPEND_TO_IDLE:外设做完susspend回调后,进入到idle回调,不会disable secondary PM_SUSPEND_STANDBY:设备处于省电状态,但还能够接收某些事件,详细的行为取决与详细的设备。
3)PM_SUSPEND_MEM:suspend to memory,设备进入睡眠状态,但全部的数据还保存在内存中,仅仅有某些外部中断才干够唤醒设备。
4)PM_SUSPEND_MAX:字面意思是suspend到disk中,对应kernel中的hibernate。
大多数的Android设备都仅仅支持当中的两种:PM_SUSPEND_ON 和PM_SUSPEND_MEM,所以后续的讨论中说到suspend的地方,均是指PM_SUSPEND_MEM。
2.2 struct suspend_stats
结构体定义在include/linux/suspend.h中,主要记录低功耗流程中的维测数据
struct suspend_stats {
int success; ----表示睡眠失败的次数
int fail; ----表示睡眠失败的次数
int failed_freeze;
int failed_prepare;
int failed_suspend;
int failed_suspend_late;
int failed_suspend_noirq;
int failed_resume;
int failed_resume_early;
int failed_resume_noirq;
#define REC_FAILED_NUM 2
int last_failed_dev;
char failed_devs[REC_FAILED_NUM][40];
int last_failed_errno;
int errno[REC_FAILED_NUM];
int last_failed_step;
enum suspend_stat_step failed_steps[REC_FAILED_NUM];
};
2.3 struct platform_suspend_ops
该结构体定义在include/linux/suspend.h中,主要记录和平台相关的低功耗主流程相关回调函数
struct platform_suspend_ops {
int (*valid)(suspend_state_t state);
int (*begin)(suspend_state_t state);
int (*prepare)(void);
int (*prepare_late)(void);
int (*enter)(suspend_state_t state);
void (*wake)(void);
void (*finish)(void);
bool (*suspend_again)(void);
void (*end)(void);
void (*recover)(void);
};
1) valid回调:回调以确定平台是否支持给定的系统睡眠状态。有效(即支持的)状态在 /sys/power/state 中公布,即2.1中所描述的suspend_state_t。请注意,如果条件不正确,仍然可能无法进入给定的系统睡眠状态。
2)begin回调:初始化到给定系统睡眠状态的转换,在挂起设备之前执行。@begin传递给平台代码的信息应在@end执行后立刻被忽略掉。如果@begin失败(即返回非零),PM主流程将不会调用@prepare(), @enter() 和@finish()回调。begin回调是可选的,不是一定要实现的。但是一旦实现了,那么传递给@enter()的参数是多余的,应忽略。
3)prepare回调:准备platform进入由@begin() 指示的系统睡眠状态。@begin()在设备挂起之后(即,为每个设备执行了适当的.suspend()方法)和设备驱动程序的late suspend回调之前立即调用。成功时返回0,否则返回负错误代码,在这种情况下,系统无法进入所需的睡眠状态(@prepare_late(),@enter(),和&#