kernel/power/main.c中:

  1. /**
  2. * state - control system power state.
  3. *
  4. * show() returns what states are supported, which is hard-coded to
  5. * 'standby' (Power-On Suspend), 'mem' (Suspend-to-RAM), and
  6. * 'disk' (Suspend-to-Disk).
  7. *
  8. * store() accepts one of those strings, translates it into the
  9. * proper enumerated value, and initiates a suspend transition.
  10. */
  11. static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
  12. char *buf)
  13. {
  14. char *s = buf;
  15. #ifdef CONFIG_SUSPEND
  16. int i;
  17.  
  18. for (i = 0; i < PM_SUSPEND_MAX; i++) {
  19. if (pm_states[i] && valid_state(i))
  20. s += sprintf(s,"%s ", pm_states[i]);
  21. }
  22. #endif
  23. #ifdef CONFIG_HIBERNATION
  24. s += sprintf(s, "%s\n", "disk");
  25. #else
  26. if (s != buf)
  27. /* convert the last space to a newline */
  28. *(s-1) = '\n';
  29. #endif
  30. return (s - buf);
  31. }
  32.  
  33. static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
  34. const char *buf, size_t n)
  35. {
  36. #ifdef CONFIG_SUSPEND
  37. #ifdef CONFIG_EARLYSUSPEND
  38. suspend_state_t state = PM_SUSPEND_ON;
  39. #else
  40. suspend_state_t state = PM_SUSPEND_STANDBY;
  41. #endif
  42. const char * const *s;
  43. #endif
  44. char *p;
  45. int len;
  46. int error = -EINVAL;
  47.  
  48. p = memchr(buf, '\n', n);
  49. len = p ?
  50.  
  51. p - buf : n;
  52.  
  53. /* First, check if we are requested to hibernate */
  54. if (len == 4 && !strncmp(buf, "disk", len)) {
  55. error = hibernate();
  56. goto Exit;
  57. }
  58.  
  59. #ifdef CONFIG_SUSPEND
  60. for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) {
  61. if (*s && len == strlen(*s) && !strncmp(buf, *s, len))
  62. break;
  63. }
  64. if (state < PM_SUSPEND_MAX && *s) {
  65. #ifdef CONFIG_EARLYSUSPEND
  66. if (state == PM_SUSPEND_ON || valid_state(state)) {
  67. error = 0;
  68. request_suspend_state(state);
  69. }
  70. #else
  71. error = enter_state(state);
  72. if (error) {
  73. suspend_stats.fail++;
  74. dpm_save_failed_errno(error);
  75. } else
  76. suspend_stats.success++;
  77. #endif
  78. }
  79. #endif
  80.  
  81. Exit:
  82. return error ? error : n;
  83. }
  84.  
  85. power_attr(state);

state_show()和state_store()即是用户层/sys/power/state的读写操作,power_attr属性的分析见博文:点击打开链接
state_show()显示了支持写入到/sys/power/state的字符串,它能够是:on, mem, standby, disk。

相应代码中的:

  1. typedef int __bitwise suspend_state_t;
  2.  
  3. #define PM_SUSPEND_ON ((__force suspend_state_t) 0)
  4. #define PM_SUSPEND_STANDBY ((__force suspend_state_t) 1)
  5. #define PM_SUSPEND_MEM ((__force suspend_state_t) 3)
  6. #define PM_SUSPEND_MAX ((__force suspend_state_t) 4)

state_store()即是写入操作:

它先推断是否是“disk“, 再比較是否是pm_states数组中的一个,pm_states定义在kernel/power/Suspend.c中:

  1. const char *const pm_states[PM_SUSPEND_MAX] = {
  2. #ifdef CONFIG_EARLYSUSPEND
  3. [PM_SUSPEND_ON] = "on",
  4. #endif
  5. [PM_SUSPEND_STANDBY] = "standby",
  6. [PM_SUSPEND_MEM] = "mem",
  7. };

在android中定义了CONFIG_EARLYSUSPEND,所以进入了kernel/power/Earlysuspend.c中的request_suspend_state函数:

  1. void request_suspend_state(suspend_state_t new_state)
  2. {
  3. unsigned long irqflags;
  4. int old_sleep;
  5.  
  6. spin_lock_irqsave(&state_lock, irqflags);
  7. old_sleep = state & SUSPEND_REQUESTED;
  8. if (debug_mask & DEBUG_USER_STATE) {
  9. struct timespec ts;
  10. struct rtc_time tm;
  11. getnstimeofday(&ts);
  12. rtc_time_to_tm(ts.tv_sec, &tm);
  13. pr_info("request_suspend_state: %s (%d->%d) at %lld "
  14. "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n",
  15. new_state != PM_SUSPEND_ON ? "sleep" : "wakeup",
  16. requested_suspend_state, new_state,
  17. ktime_to_ns(ktime_get()),
  18. tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
  19. tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);
  20. }
  21. if (!old_sleep && new_state != PM_SUSPEND_ON) {
  22. state |= SUSPEND_REQUESTED;
  23. queue_work(suspend_work_queue, &early_suspend_work);
  24. } else if (old_sleep && new_state == PM_SUSPEND_ON) {
  25. state &= ~SUSPEND_REQUESTED;
  26. wake_lock(&main_wake_lock);
  27. queue_work(suspend_work_queue, &late_resume_work);
  28. }
  29. requested_suspend_state = new_state;
  30. spin_unlock_irqrestore(&state_lock, irqflags);
  31. }

这段代码的意思是当进入suspend前运行early_suspend_work,当从suspend状态恢复后运行late_resume_work。

这个文件里定义了它们:

  1. static DECLARE_WORK(early_suspend_work, early_suspend);
  2. static DECLARE_WORK(late_resume_work, late_resume);

early_suspend()将运行驱动程序中使用register_early_suspend()注冊了的suspend()函数。

late_resume()将运行驱动程序中使用register_early_suspend()注冊了的resume()函数。

/sys/power/state的更多相关文章

  1. 从sys/power/state分析并实现S3C2416的睡眠和唤醒

    环境: PC: debian-7.6.0 ARM CPU: S3C2416 Linux-Kernel: 3.6.0(FriendlyARM) U-boot: 1.3.4 一.问题来源 依据须要,在S3 ...

  2. linux power button

    最近需要使用到power button按键,linux中有gpio keys的机制,只要注册即可. device注册 arch/arm/mach-mx6/board-mx6q_sabresd.c #d ...

  3. Linux下Power Management开发总结

    本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 1. 前言 在 <开发流程>中介绍了PM开发的一般流程,重点是好的模型.简单有效的接口参数.可量化的测试环境以及可独性强的输出 ...

  4. Suspend to RAM和Suspend to Idle分析,以及在HiKey上性能对比

    Linux内核suspend状态 Linux内核支持多种类型的睡眠状态,通过设置不同的模块进入低功耗模式来达到省电功能.目前存在四种模式:suspend to idle.power-on standb ...

  5. Android系统启动过程

    首先Android框架架构图: Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用. 启动的过程如下图所示:(图片来自网上,后面有地址)   下面将从And ...

  6. 系统进程 zygote(二)—— zygote.rc 脚本

    夕阳已在沉沉的淡化,这黄昏的美,有谁能描画?莽莽的天涯,哪里是我的家,哪里是我的家?爱人呀,我这般的想着你,你那里可也有丝毫的牵挂?—— 徐志摩·海边的梦 ilocker:关注 Android 安全( ...

  7. Zygote进程【1】——Zygote的诞生

    在Android中存在着C和Java两个完全不同的世界,前者直接建立在Linux的基础上,后者直接建立在JVM的基础上.zygote的中文名字为"受精卵",这个名字很好的诠释了zy ...

  8. CentOS 7下关于systemd的一些唠叨话一:systemd的特点和使用

    摘要 近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经逐渐淡出历史舞台,新的 UpStart 和 systemd 各有特点,越来越多的 Linux 发行版 ...

  9. Linux 休眠,挂起(待机),关机等几个命令的区别及如何实现;如何启用Ubuntu的休眠模式

    这里对linux 的几个命令整理下,有:休眠,挂起,待机,关机等几个命令的区别及如何实现. 休眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,所有设备都停止工作.当再次使用时需按开关机键,机器将 ...

随机推荐

  1. 【IDEA】(4)---很好用的DEBUG功能

    IDEA-DEBUG功能 一.常用快捷键 快捷键并不是完全一样的,我这边是MAC安装的IDEA, 这边最主要还是知道DEBUG时常用的功能. 1.快捷键 F7 #进入下一步,如果当前行是一个方法,则进 ...

  2. [转]利用 NPOI 變更字體尺寸及樣式

    本文转自:http://blog.cscworm.net/?p=1650 利用 NPOI 變更字體尺寸及樣式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  3. 汇编程序10:计算长度为C字节的数据和

    assume cs:code code segment mov ax,0ffffh //起始段地址 mov ds,ax mov bx,0 //偏移变量 mov dx,0 //保存结果 mov cx,1 ...

  4. golang 字符串替换截取

    package main import "fmt" func main() { str := "XBodyContentX" content := str[1 ...

  5. 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址

    昨天因为要从JFrame控件获取密码,注意到一个问题,那就是用toString方法得到的不一定是你想要的,如下: jPasswordField是JFrame中的密码输入框,如果用下面的方法是得不到密码 ...

  6. js数据管理的思考

    最近要做一个农场项目,涉及到很多js数据管理的需求,这里也做下总结,不断的总结,再修正内容,也是快速进步的方法. 数据管理几个方面考虑: * 设置(更新)字段值 * 检索,根据id, index, 属 ...

  7. Spring 的优秀工具类盘点---转

    第 1 部分: 文件资源操作和 Web 相关工具类 http://www.ibm.com/developerworks/cn/java/j-lo-spring-utils1/ 文件资源操作 文件资源的 ...

  8. windows phone媒体应用开发

    MediaElement 可以播放许多不同类型的音频和视频媒体. MediaElement 是一个可以在其表面显示视频的矩形区域,也可以播放音频.MediaElement 支持触控输入事件. 使用属性 ...

  9. 三星的Knox Warranty Bit原理

    它是如何触发的? 这个值的状态是烧录在主板上,无法刷写修改, 从0到1 不可逆,除非替换硬件 If a non-Knox boot loader or kernel has been installe ...

  10. OpenVX

    OpenVX openvx  1. 编译 尝试编译openvx_sample,下载相关代码. 下载的sample code直接使用make可以生成libopenvx.so. 使用python Buil ...