android休眠流程


   
   
路径kernel/power/main.c 

   1.Android的休眠可以通过以下的配置文件来设置电源状态:   

        .echo "mem" >/sys/power/state

.echo "disk" >/sys/power/state

    2.Wakelock是一种锁机制,只要这把锁被占用,系统就无法进入休眠。wakelock只是其中的一把锁,并且它有两种,超时和不超时的区分。

    在系统启动后,会自己添加一把名为“main”的锁,当系统进入休眠之前需要释放“main”锁,在函数early_suspend()函数的最后一步去释放,但释放之后,还要判断其他锁的状态,来决定是否休眠。

   3.early_suspend在Linux睡眠过程前被调用。

   4.Android休眠

       当用户修改sys/power/state,文件linux_source/kernel/power/main.c中的state_store()函数将被调用。

 

static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
			   const char *buf, size_t n)
{
#ifdef CONFIG_SUSPEND
#ifdef CONFIG_EARLYSUSPEND
	suspend_state_t state = PM_SUSPEND_ON;
#else
	suspend_state_t state = PM_SUSPEND_STANDBY;
#endif
	const char * const *s;
#endif
	char *p;
	int len;
	int error = -EINVAL;

	p = memchr(buf, '\n', n);
	len = p ? p - buf : n;

	/* First, check if we are requested to hibernate */
	if (len == 4 && !strncmp(buf, "disk", len)) {
		error = hibernate();
  goto Exit;
	}

#ifdef CONFIG_SUSPEND
	for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) {
		if (*s && len == strlen(*s) && !strncmp(buf, *s, len))
			break;
	}
	if (state < PM_SUSPEND_MAX && *s)
#ifdef CONFIG_EARLYSUSPEND
		if (state == PM_SUSPEND_ON || valid_state(state)) {
			error = 0;
			request_suspend_state(state);
		}
#else
		error = enter_state(state);
#endif
#endif

 Exit:
	return error ? error : n;
}

      1)Linux休眠会执行error=enter_state(state);

      2)  android休眠会执行 request_suspend_state(state);

           在request_suspend_state()中,会调用early_suspend_work的工作队列已进入early_suspend()函数,在进入early_suspend中,先判断state,确保状态为suspend后调用具体的suspend方法(Linux_source/arch/xxx/mach-xxx/pm.c)

     5唤醒:也是在suspend中实现,跳出循环,一步步的还原,但是有也做法是用watchdog来重启系统

          

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值