休眠后gpio状态_1.Linux电源管理-休眠与唤醒

1.休眠方式

在内核中,休眠方式有很多种,可以通过下面命令查看

常用的休眠方式有freeze,standby, mem, disk

freeze:冻结I/O设备,将它们置于低功耗状态,使处理器进入空闲状态,唤醒最快,耗电比其它standby, mem, disk方式高

standby:除了冻结I/O设备外,还会暂停系统,唤醒较快,耗电比其它 mem, disk方式高

mem:将运行状态数据存到内存,并关闭外设,进入等待模式,唤醒较慢,耗电比disk方式高

disk:       将运行状态数据存到硬盘,然后关机,唤醒最慢

示例:

2.唤醒方式

当我们休眠时,如果想唤醒,则需要添加中断唤醒源,使得在休眠时,这些中断是设为开启的,当有中断来,则会退出唤醒,常见的中断源有按键,USB等.

3.以按键驱动为例(基于内核3.10.14)

在内核中,有个input按键子系统"gpio-keys"(位于driver/input/keyboard/gpio.keys.c),该平台驱动platform_driver已经在内核中写好了(后面会简单分析)

我们只需要在内核启动时,注册"gpio-keys"平台设备platform_device,即可实现一个按键驱动.

方式1-修改对应板卡的defconfig文件,添加宏:

方式2-进入make menuconfig

3.2修改好后,接下来写my_button.c文件,来注册platform_device

上面的arch_initcall()表示:

会将button_base_init函数放在内核链接脚本.initcall3.init段中,然后在内核启动时,会去读链接脚本,然后找到button_base_init()函数,并执行它.

通常,在内核中,platform 设备的初始化(注册)用arch_initcall()调用

而驱动的注册则用module_init()调用,因为module_init()在arch_initcall()之后才调用

因为在init.h中定义:

3.3然后将my_button.c文件添加到Makefile中

编译内核后,便实现一个简单的按键唤醒休眠了.

接下来开始分析platform_driver(位于driver/input/keyboard/gpio.keys.c),看看是如何注册按键和实现唤醒的.

4.1该文件里有常用的函数有

设置按键和input_dev,注册input-key子系统

设置GPIO,设置input结构体支持的按键值,设置中断,设置防抖动机制

按键中断函数,如果是中断源,则通过pm_stay_awake()通知pm子系统唤醒,英文电影推荐如果有防抖动,则延时并退出,否则通过schedule_work()来调用gpio_keys_gpio_work_func()一次

定时器超时处理函数,用来实现防抖动,里面会通过schedule_work()来调用一次gpio_keys_gpio_work_func();

处理gpio事件函数,用来上报input事件,并判断按键中断源,如果是的话,则调用pm_relax(),通知pm子系统唤醒工作结束

通知pm(power manager), 唤醒休眠

休眠函数,休眠之前会被调用

唤醒函数,唤醒之前被调用

SIMPLE_DEV_PM_OPS宏位于pm.h,它将会定义一个dev_pm_ops结构体,用来被pm子系统调用,实现休眠唤醒

gpio_keys_probe()函数定义如下所示:

dev->power.should_wakeup来做不同的操作

4.4 其中gpio_keys_suspend()休眠函数定义如下所示:

从上面函数可以看到,进入休眠之前,我们需要调用enable_irq_wake()来设置唤醒源

4.5 然后在中断函数中,判断是否需要上报唤醒事件,中断函数如下所示:

其中gpio_keys_gpio_work_func()函数如下所示:

从上面两个函数可以看到,唤醒休眠时,需要使用两个函数实现:

在中断前调用pm_stay_awake(),中断结束时再调用一次pm_relax()函数.

4.6 如果想延时唤醒,也可以使用另一种唤醒休眠,则只需要一个函数实现:

4.7 接下来来看gpio_keys_setup_key(),如何设置按键的(只加了重要的部分)

通过gpio.keys.c,得出唤醒流程:

休眠时:

唤醒后:

中断时,有两种唤醒PM模式

模式1-使用两个函数实现:

进入中断时调用一次pm_stay_awake().

退出时也调用一次pm_relax(bdata->input->dev.parent);

模式2-只需一个函数实现:

进入中断时调用pm_wakeup_event(struct device *dev, unsigned int msec).

5.接下来,我们自己写个按键字符驱动,实现休眠唤醒

应用测试代码如下:

试验:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变换之时钟实现

为了更好的利用学过的知识&#xff0c;扎实一下知识&#xff0c;也方便日后的复习&#xff0c;则需要做一些东西热身热身一下 以下是实现的代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title>…

计算机用户名登陆管理员权限,关于win10勿删用户账号下管理员身份导致无法登录系统的问题...

我昨天在控制面板-用户-管理计算机内置账户&#xff0c;在“Zhao Yikang”用户名(另外还有administrator用户&#xff0c;名我没动)属性里面&#xff0c;“隶属于”那个界面里面&#xff0c;删除了administrator账户&#xff0c;同时还保留有一个user账户没动没删。之后重启电脑…

实例31:python

#题目&#xff1a;请输入星期几的第一个字母来判断一下是星期几 #!/usr/bin/python -- coding: UTF-8 -- letter input(“please input:”) #while letter ! ‘Y’: if letter ‘S’: print (‘please input second letter:’) letter input(“please input:”) if lette…

python聚类分析结果很差_python中的聚类分析:value错误:x和y的大小必须相同

我尝试了以下代码&#xff0c;但在执行时&#xff0c;显示以下错误&#xff1a;(ValueError: x and y must be the same size)代码&#xff1a;import pandas as pdimport matplotlib.pyplot as pltfrom sklearn.preprocessing import StandardScalerfrom sklearn.cluster impo…

实例32:python

#按相反的顺序输出列表的值。 #!/usr/bin/python -- coding: UTF-8 -- a [‘one’, ‘two’, ‘three’] for i in a[::-1]: print (i)

整样运用计算机考试,2017年9月计算机二级考试《MS Office高级应用》上机操作题(2)...

字处理题12012级企业管理专业的林楚楠同学选修了“供应链管理”课程&#xff0c;并撰写了题目为“供应链中的库存管理研究”的课程论文。论文的排版和参考文献还需要进一步修改&#xff0c;根据以下要求&#xff0c;帮助林楚楠对论文进行完善。(1)在考生文件夹下&#xff0c;将…

mysql search yum_CentOS 7 yum安装配置mysql

首先去官网下载要用的yum源传送门&#xff1a;http://dev.mysql.com/downloads/repo/yum/yum源文件&#xff1a;/home/mysql57-community-release-el7-8.noarch.rpm是一个rpm包&#xff0c;如果是Gnome&#xff0c;可以选择centos7的软件包安装程序安装即可。也可以用命令的方式…

Django缓存和内置信号

缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中&#xff0c;当用户再次请求时&#xff0c;直接去缓存中拿&#xff0c;避免对数据库的频繁操作&#xff0c;加快数据的显示时间&#xff0c;需要知道的是&#xff0c;缓存里面的数据一般都设置有超时…

实例33:python

#题目&#xff1a;按逗号分隔列表。 #!/usr/bin/python -- coding: UTF-8 -- L [1,2,3,4,5] s1 ‘,’.join(str(n) for n in L) print (s1)

大工19春计算机文化基础在线测试1,大工19春《计算机文化基础》在线测试1(含答案)...

1.[单选题]第四代计算机所采用的主要逻辑元件是( )。奥鹏作业答案奥鹏大连理工大学作业A.晶体管B.小规模集成电路C.电子管D.大规模和超大规模集成电路正确答案:——D——2.[单选题]二进制数11111010所对应的十进制数是( )。A.250B.252C.253D.255正确答案:——A——3.[单选题]下…

f2 柱状图滚动 钉钉小程序_详解钉钉小程序组件之自定义模态框(弹窗封装实现)...

背景开发钉钉小程序中需要用到模态框 文档里也没有 自己搞一个…效果大概长这个样点击指定按钮&#xff0c;弹出模态框&#xff0c;里面的内容可以自定义&#xff0c;可以是简单的文字提示&#xff0c;也可以输入框等复杂布局。操作完点击取消或确定关闭。开始封装上图所示文件…

Python List reverse()方法

描述 reverse() 函数用于反向列表中元素。 语法 reverse()方法语法&#xff1a; list.reverse() 参数 • NA。 返回值 该方法没有返回值&#xff0c;但是会对列表的元素进行反向排序。 实例 以下实例展示了 reverse()函数的使用方法&#xff1a; #!/usr/bin/python aList [12…

你的第一个Django程序

本文使用Pycharm、Django 2.0.9、Python 3.6环境&#xff0c;本文大纲 建立Django项目建立页面什么是URLconf和ROOT_URLCONFDjango怎么处理URL请求关于URL尾部的“/” 反斜线1. 建立一个Django项目 Application name如果填写会自动帮你建立一个APP&#xff0c;而且APP是必须的&…

闪电对计算机或网络设备的威胁,计算机网络的雷电防护_计算机网络

摘?要 雷电对计算机网络稳定性造成了很多的危害。雷电主要通过电源线、网络线和接地反击的途径来侵入设备&#xff0c;造成设备损坏。如何来确保设备的安全&#xff0c;本文从网络系统的防护、网络线路的防护、及其防雷工程中需要特别考虑过电压防护几个方面提出了防护措施。关…

分割法和填补法_“聚合”法与“分割”法

一门新的思维与实践的科学“聚合”法是宗脉学中“宗脉”关系的根本原则&#xff0c;这是一门新的思维与实践的科学&#xff0c;它的研究角度和方法都不同于任何以往唯物主义与唯心主义学派。“宗”即是整体&#xff0c;本质&#xff0c;聚和&#xff0c;“脉”是本质的分支与脉…

Python join()方法

描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。 语法 join()方法语法&#xff1a; str.join(sequence) 参数 • sequence – 要连接的元素序列。 返回值 返回通过指定字符连接序列中元素后生成的新字符串。 实例 以下实例展示了join()的使用方…

[USACO 2017 Feb Gold] Tutorial

Link: 传送门 A: 分层图最短路&#xff08;其实就是最短路转移时多记录一维的数据 #include <bits/stdc.h>using namespace std; #define X first #define Y second typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN105; int n,…

平板xmind怎么添加父主题_xmind 怎么插入子主题

XMind添加主题方法一&#xff1a;XMind地址&#xff1a;网页链接点击标题栏中的【插入】&#xff0c;在弹出的内下拉窗口中便可看见容主题、子主题、自由主题等选项&#xff0c;我们点击想要添加的主题类型&#xff0c;然后直接点击便会对应的在导图中生成新的空白主题&#xf…

实例34:python

#练习函数调用。 #!/usr/bin/python -- coding: UTF-8 -- def hello_world(): print (‘hello world’) def three_hellos(): for i in range(3): hello_world() if name ‘main’: three_hellos() #1&#xff1a;__name__是一个变量。前后加了下划线是因为是因为这是系统…

NumPy数组创建例程

NumPy - 数组创建例程 新的ndarray对象可以通过任何下列数组创建例程或使用低级ndarray构造函数构造。 numpy.empty 它创建指定形状和dtype的未初始化数组。 它使用以下构造函数&#xff1a; numpy.empty(shape, dtype float, order C)构造器接受下列参数&#xff1a; 序号参…