Linux Power Management接口
PM subsystem是以sysfs为接口.接口的位置在 /sys/power/目录下.以Andorid手机为例:
/sys/power/state 控制系统电源状态,从这个文件里可以读出来系统支持的所有状态,如:
"standby"----->Power-On Suspend
"mem"--------->Suspend-to-RAM
"disk"---------->Suspend-to-disk
kernel/include/linux/suspend.h
#define PM_SUSPEND_ON ((__force suspend_state_t) 0)
#define PM_SUSPEND_STANDBY ((__force suspend_state_t) 1)
#define PM_SUSPEND_MEM ((__force suspend_state_t) 3)
#define PM_SUSPEND_MAX ((__force suspend_state_t) 4)
kernel/kernel/power/suspend.c
const char *const pm_states[PM_SUSPEND_MAX] = {
[PM_SUSPEND_STANDBY] = "standby",
[PM_SUSPEND_MEM] = "mem",
};
kernel/kernel/power/main.c
/**
* state - control system power state.
*
* show() returns what states are supported, which is hard-coded to
* 'standby' (Power-On Suspend), 'mem' (Suspend-to-RAM), and
* 'disk' (Suspend-to-Disk).
*
* store() accepts one of those strings, translates it into the
* proper enumerated value, and initiates a suspend transition.
*/
static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
char *s = buf;
#ifdef CONFIG_SUSPEND
int i;
for (i = 0; i < PM_SUSPEND_MAX; i++) {
/*检查pm_states中包含的电源狀态是否可用,并调用 valid_state函数来检查,
* valid_state函数会调用platform下注册的valid来检测state的有效性,platform_suspend_ops的实现一般在
*kernel/archn/arm/mach-omap2/pm.c
*/
if (pm_states[i] && valid_state(i))
s += sprintf(s,"%s ", pm_states[i]);
}
#ifdef CONFIG_HIBERNATION
s += sprintf(s, "%s\n", "disk");
#else
if (s != buf)
/* convert the last space to a newline */
*(s-1) = '\n';
#endif
return (s - buf);
}