您的位置:首页 > 运维架构 > Linux

Linux Power Management源码分析(一)

2013-11-16 13:39 169 查看
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PM Linux 源码