power命令_kernel power41

power命令_kernel power411/*kernel/power/earlysuspend.c2*3*Copyright(C)2005-2008Google,Inc.4*5*ThissoftwareislicensedunderthetermsoftheGNUGeneralPublic6*Licenseve…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 

 

 
 1 /* kernel/power/earlysuspend.c  2  *  3  * Copyright (C) 2005-2008 Google, Inc.  4  *  5  * This software is licensed under the terms of the GNU General Public  6  * License version 2, as published by the Free Software Foundation, and  7  * may be copied, distributed, and modified under those terms.  8  *  9  * This program is distributed in the hope that it will be useful,  10  * but WITHOUT ANY WARRANTY; without even the implied warranty of  11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  12  * GNU General Public License for more details.  13  *  14 */  15  16 #include <linux/earlysuspend.h>  17 #include <linux/module.h>  18 #include <linux/mutex.h>  19 #include <linux/rtc.h>  20 #include <linux/wakelock.h>  21 #include <linux/workqueue.h>  22  23 #include "power.h"  24  25 enum {  26 DEBUG_USER_STATE = 1U << 0,  27 DEBUG_SUSPEND = 1U << 2,  28 DEBUG_VERBOSE = 1U << 3,  29 };  30 static int debug_mask = DEBUG_USER_STATE;  31 module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);  32  33 static DEFINE_MUTEX(early_suspend_lock);  34 static LIST_HEAD(early_suspend_handlers);  35 static void early_suspend(struct work_struct *work);  36 static void late_resume(struct work_struct *work);  37 static DECLARE_WORK(early_suspend_work, early_suspend);  38 static DECLARE_WORK(late_resume_work, late_resume);  39 static DEFINE_SPINLOCK(state_lock);  40 enum {  41 SUSPEND_REQUESTED = 0x1,  42 SUSPENDED = 0x2,  43 SUSPEND_REQUESTED_AND_SUSPENDED = SUSPEND_REQUESTED | SUSPENDED,  44 };  45 static int state;  46  47 void register_early_suspend(struct early_suspend *handler)  48 {  49 struct list_head *pos;  50  51 mutex_lock(&early_suspend_lock);  52 list_for_each(pos, &early_suspend_handlers) {  53 struct early_suspend *e;  54 e = list_entry(pos, struct early_suspend, link);  55 if (e->level > handler->level)  56 break;  57  }  58 list_add_tail(&handler->link, pos);  59 if ((state & SUSPENDED) && handler->suspend)  60 handler->suspend(handler);  61 mutex_unlock(&early_suspend_lock);  62 }  63 EXPORT_SYMBOL(register_early_suspend);  64  65 void unregister_early_suspend(struct early_suspend *handler)  66 {  67 mutex_lock(&early_suspend_lock);  68 list_del(&handler->link);  69 mutex_unlock(&early_suspend_lock);  70 }  71 EXPORT_SYMBOL(unregister_early_suspend);  72 
 

register_early_suspend(struct early_suspend *handler)会按照level从小到大的方式,将handler依次挂在early_suspend_handlers链表头上。
if (e->level > handler->level)判断链表节点e的level大于要插入的handler的level时就break当前遍历,用list_add_tail(&handler->link, pos);将handler->link插到pos节点的前面。

 73 static void early_suspend(struct work_struct *work) 74 { 75 struct early_suspend *pos; 76 unsigned long irqflags; 77 int abort = 0; 78 79 mutex_lock(&early_suspend_lock); 80 spin_lock_irqsave(&state_lock, irqflags); 81 if (state == SUSPEND_REQUESTED) 82 state |= SUSPENDED; 83 else 84 abort = 1; 85 spin_unlock_irqrestore(&state_lock, irqflags); 86 87 if (abort) { 88 if (debug_mask & DEBUG_SUSPEND) 89 pr_info("early_suspend: abort, state %d\n", state); 90 mutex_unlock(&early_suspend_lock); 91 goto abort; 92 } 93 94 if (debug_mask & DEBUG_SUSPEND) 95 pr_info("early_suspend: call handlers\n"); 96 list_for_each_entry(pos, &early_suspend_handlers, link) { 97 if (pos->suspend != NULL) { 98 if (debug_mask & DEBUG_VERBOSE) 99 pr_info("early_suspend: calling %pf\n", pos->suspend); 100 pos->suspend(pos); 101 } 102 } 103 mutex_unlock(&early_suspend_lock); 104 105 suspend_sys_sync_queue(); 106 abort: 107 spin_lock_irqsave(&state_lock, irqflags); 108 if (state == SUSPEND_REQUESTED_AND_SUSPENDED) 109 wake_unlock(&main_wake_lock); 110 spin_unlock_irqrestore(&state_lock, irqflags); 111 } 112 113 static void late_resume(struct work_struct *work) 114 { 115 struct early_suspend *pos; 116 unsigned long irqflags; 117 int abort = 0; 118 119 mutex_lock(&early_suspend_lock); 120 spin_lock_irqsave(&state_lock, irqflags); 121 if (state == SUSPENDED) 122 state &= ~SUSPENDED; 123 else 124 abort = 1; 125 spin_unlock_irqrestore(&state_lock, irqflags); 126 127 if (abort) { 128 if (debug_mask & DEBUG_SUSPEND) 129 pr_info("late_resume: abort, state %d\n", state); 130 goto abort; 131 } 132 if (debug_mask & DEBUG_SUSPEND) 133 pr_info("late_resume: call handlers\n"); 134 list_for_each_entry_reverse(pos, &early_suspend_handlers, link) { 135 if (pos->resume != NULL) { 136 if (debug_mask & DEBUG_VERBOSE) 137 pr_info("late_resume: calling %pf\n", pos->resume); 138 139 pos->resume(pos); 140 } 141 } 142 if (debug_mask & DEBUG_SUSPEND) 143 pr_info("late_resume: done\n"); 144 abort: 145 mutex_unlock(&early_suspend_lock); 146 } 147 

early_suspend(struct work_struct *work)和late_resume(struct work_struct *work)分别在第37、38行被声明为了early_suspend_work和late_resume_work,以便在
request_suspend_state(suspend_state_t new_state)中的suspend_work_queue工作队列中使用。

ealry_suspend(struct work_struct *work)中最关键的一句list_for_each_entry(pos, &early_suspend_handlers, link),表示按照level等级排列的顺序,依次调用pos所指向的各个
驱动中注册的ealrysuspend 指向的suspend handler。

late_resume(struct work_struct *work)中list_for_each_entry_reverse(pos, &early_suspend_handlers, link),表示按照level等级的逆序,依次调用pos所指向的各个
驱动中注册的earlysuspend 指向的resume handler。
 
这里有一个很有用的调试信息:pr_info("late_resume: calling %pf\n", pos->resume); %pf可以打印被调函数的函数名。
148 void request_suspend_state(suspend_state_t new_state) 149 { 150 unsigned long irqflags; 151 int old_sleep; 152 153 spin_lock_irqsave(&state_lock, irqflags); 154 old_sleep = state & SUSPEND_REQUESTED; 155 if (debug_mask & DEBUG_USER_STATE) { 156 struct timespec ts; 157 struct rtc_time tm; 158 getnstimeofday(&ts); 159 rtc_time_to_tm(ts.tv_sec, &tm); 160 pr_info("request_suspend_state: %s (%d->%d) at %lld " 161 "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n", 162 new_state != PM_SUSPEND_ON ? "sleep" : "wakeup", 163 requested_suspend_state, new_state, 164 ktime_to_ns(ktime_get()), 165 tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, 166 tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec); 167 } 168 if (!old_sleep && new_state != PM_SUSPEND_ON) { 169 state |= SUSPEND_REQUESTED; 170 queue_work(suspend_work_queue, &early_suspend_work); 171 } else if (old_sleep && new_state == PM_SUSPEND_ON) { 172 state &= ~SUSPEND_REQUESTED; 173 wake_lock(&main_wake_lock); 174 queue_work(suspend_work_queue, &late_resume_work); 175 } 176 requested_suspend_state = new_state; 177 spin_unlock_irqrestore(&state_lock, irqflags); 178 } 179 180 suspend_state_t get_suspend_state(void) 181 { 182 return requested_suspend_state; 183 }


request_suspend_state(suspend_state_t new_state)
会被kernel/power/main.c中的state show调用,main.c将会在下一章详细说明。
request_suspend_state(suspend_state_t new_state)传入的参数new_state的类型suspend_state_t为一个typedef类型的变量:typedef int __bitwise suspend_state_t;

当new_state为0时,request_suspend_state调用queue_work(suspend_work_queue, &late_resume_work);分支进行late唤醒。
当new_state为3时,request_suspend_state调用queue_work(suspend_work_queue, &early_suspend_work);分支进行浅度休眠。

当系统休眠/唤醒时,串口上会出现如下打印:
request_suspend_state: sleep (0->3) at 6442598858519 (2012-02-05 01:31:08.172285684 UTC)
request_suspend_state: wakeup (3->0) at 6464854624023 (2012-02-05 01:31:30.428053438 UTC)

0代表唤醒,3代表休眠。
0->3 从唤醒到休眠(sleep);
3->0 从休眠到唤醒(wakeup);

转载于:https://www.cnblogs.com/watson/p/3780296.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192188.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ar面部识别_免费人脸识别sdk

    ar面部识别_免费人脸识别sdk如何看待Arcsoft 免费人脸认知引擎SDK?

  • 国内团队博客汇总_中国最成功的团队

    国内团队博客汇总_中国最成功的团队京东前端团队凹凸实验室蘑菇街技术博客奇迹空间科技有限公司百度技术沙龙百度web前端团队FEX饿了么物流悦跑圈技术团队并发编程网阿里中间件团队博客阿里技术沙龙天猫无线团队淘宝前端团队FED美团点评技术团队奇虎360技术博客alloyteam腾讯全端腾讯Bugly腾讯wetestIBMdeveloperWorks中国Glow

  • python向量叉乘_矢量的点乘和叉乘公式

    python向量叉乘_矢量的点乘和叉乘公式向量的内积(点乘)定义概括地说,向量的内积(点乘/数量积)。对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,如下所示,对于向量a和向量b:a和b的点积公式为:这里要求一维向量a和向量b的行列数相同。注意:点乘的结果是一个标量(数量而不是向量)定义:两个向量a与b的内积为a·b=|a||b|cos∠(a,b),特别地,0·a=a·0=0;若a,b是非零向量,则a…

  • java递归查询父节点_java递归例子

    java递归查询父节点_java递归例子一、需求项目里要让用户能够设置所选择教材的章课节,以针对章课节提供相应的题目供用户做题。设计:用户设置了教材后,首次登录,进行章节设置时。默认为用户选择第一章、第一课、第一节。思路:用户访问页面,章一栏显示所有章,课一栏显示第一章下所有课程,节一栏显示第一章、第一课下的所有节。然后获取用户当前选择的章课节信息。如果当前用户没有设置过该教材的章课节,就为其设置默认的第一章、第一课、第一节。数据库设计…

  • sklearn安装教程_cmd安装软件命令

    sklearn安装教程_cmd安装软件命令sklearn库sklearn是scikit-learn的简称,是一个基于Python的第三方模块。sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的调用sklearn库中提供的模块就能完成大多数的机器学习任务。sklearn库是在Numpy、Scipy和matplotlib的基础上开发而成的,因此在介绍sklearn的安装前,需要先安装这些依赖库。…

    2022年10月17日
  • 网站开启cdn加速的最简单步骤

    网站开启cdn加速的最简单步骤

    2021年10月13日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号