android系统待机和休眠


      安卓系统待机一会就进入了深度睡眠,终端都没响应。信息如下:

[cpp]  view plain  copy
  1. ] request_suspend_state: sleep (0->3) at 175730206087 (2017-09-27 01:28:31.556133562 UTC)  
  2. [  175.738202] s3cfb_early_suspend is called  
  3. [  175.741885] (s3cfb_backlight_off, 546): LCD_PWM_OFF  
  4. [  175.756345] (s3cfb_backlight_off, 588): VGA_EN_OFF  
  5. [  175.764283] (s3cfb_backlight_off, 603): BK_VDD_OFF  
  6. [  176.004117] <<-GTP-INFO->> Esd suspended!  
  7. [  176.038412] PM: Syncing filesystems ... done.  
  8. [  176.065360] Freezing user space processes ... (elapsed 0.01 seconds) done.  
  9. [  176.086237] Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.  
  10. [  176.106202] Suspending console(s) (use no_console_suspend to debug)  

从信息看来,android系统把用户空间的任务都停止掉了,wifi和触摸屏都没响应,只有点击电源键安卓系统才能唤醒。跟踪代码,发现最后一步系统电源管理进入了enter_state,从而执行了深度休眠的操作。

源文件:kernel/power/suspend.c

[cpp]  view plain  copy
  1. int enter_state(suspend_state_t state)  
  2. {  
  3.     int error;  
  4.   
  5.     if (!valid_state(state))  
  6.         return -ENODEV;  
  7.   
  8.     if (!mutex_trylock(&pm_mutex))  
  9.         return -EBUSY;  
  10.   
  11.     printk(KERN_INFO "PM: Syncing filesystems ... ");  
  12.     sys_sync();  
  13.     printk("done.\n");  
  14.   
  15.     pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);  
  16.     error = suspend_prepare();  
  17.     if (error)  
  18.         goto Unlock;  
  19.   
  20.     if (suspend_test(TEST_FREEZER))  
  21.         goto Finish;  
  22.   
  23.     pr_debug("PM: Entering %s sleep\n", pm_states[state]);  
  24.     error = suspend_devices_and_enter(state);  
  25.   
  26.  Finish:  
  27.     pr_debug("PM: Finishing wakeup.\n");  
  28.     suspend_finish();  
  29.  Unlock:  
  30.     mutex_unlock(&pm_mutex);  
  31.     return error;  
  32. }  
2.分析

       android系统有earlysuspend和suspend两种休眠,earlysuspend是浅度睡眠,suspend是深度休眠。这个是由linux电源管理控制的,电源管理的接口是“/sys/power/state”和"/sys/power/wake_lock","/sys/power/wake_unlock",这个是linux是否休眠和是否进入深度休眠的关键点。只有wake_lock上锁了,linux系统就不会进入深度休眠。

       

3.解决

        从上分析可知,只要linux保持有一个唤醒锁,系统就不会进入深度休眠。那么解决问题的思路是在linux启动的时候添加一个唤醒锁就行了。在init.rc文件里面添加一个初始化项:

[cpp]  view plain  copy
  1. echo "PowerManagerService.noSuspend" > /sys/power/wake_lock  
问题解决。

参考资料:

扫描二维码关注公众号,回复: 1106908 查看本文章

1.Android 内核驱动——电源管理 :http://blog.sina.com.cn/s/blog_67d955460100xlyh.html

2.Android后台的linux一直保持唤醒状态,不进入睡眠:http://www.cnblogs.com/yajing-zh/p/4891780.html

猜你喜欢

转载自blog.csdn.net/rayxiang520/article/details/80361145