休眠后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.接下来,我们自己写个按键字符驱动,实现休眠唤醒
应用测试代码如下:
试验:
休眠后gpio状态_1.Linux电源管理-休眠与唤醒相关推荐
- 休眠后gpio状态_浅谈Digi XBee模块的休眠模式
浅谈Digi XBee模块的休眠模式 2020-3-25 Digi XBee S2C模块,如果仅连接电源线可以测得,在待机情况下,大约是10.5mA左右的电流,在休眠时的功耗可以低到0.5uA.可以知 ...
- 休眠后gpio状态_STM32休眠与唤醒
这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32的待机模式和停机模式.让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式. voidEXTI1_ ...
- 休眠后gpio状态_STM32中GPIO的8种工作模式总结
STM32 中 GPIO 的 8 种工作模式总结 一.推挽输出:可以输出高.低电平,连接数字器件 ; 推挽结构一般是指 两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一 个截止.高低 ...
- Linux电源管理(10)_autosleep
Linux电源管理(10)_autosleep 作者:wowo 发布于:2014-9-18 23:42 分类:电源管理子系统 1. 前言 Autosleep也是从Android wakelocks补丁 ...
- linux 电源管理 唤醒,Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]
转发请注明出处: 最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识.为了备忘和理清思路现整理成文,以便日后查阅. 移动设备由于自身的限制有一个硬伤就是电量的消耗问题.由于电池的电量有限,所 ...
- linux 电源管理 Generic PM之Suspend功能
Linux电源管理(6)_Generic PM之Suspend功能 作者:wowo 发布于:2014-8-22 21:40 分类:电源管理子系统 1. 前言 Linux内核提供了三种Suspend: ...
- Linux电源管理(6)_Generic PM之Suspend功能【重磅文章】-- wowo
文章目录 1. 前言 2. Suspend功能有关的代码分布 1)PM Core 2)Device PM 3)Platform dependent PM 3. suspend&resume过程 ...
- linux大多数进程都是sleep,Linux电源管理(5)_Hibernate和Sleep功能介绍
Linux电源管理(5)_Hibernate和Sleep功能介绍 作者:wowo 发布于:2014-6-10 16:11 分类:电源管理子系统 1. 前言 Hibernate和Sleep两个功能是Li ...
- Linux电源管理(5)_Hibernate和Sleep功能介绍【转】
本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic ...
最新文章
- day03-正则表达式
- Integer.valueof(null)报错
- jfinal mysql增删改查_Jfinal简单实现增删改查
- ​30种EMC标准电路分享,再不收藏就晚了!
- setInterval 和setTimeout 清空定时器,返回值,赋值为null的区别
- P1078 文化之旅
- css索引_CSS中的Z索引:它是什么以及它做什么
- LeetCode(169)——求众数(JavaScript)
- Android 网络HTML查看器
- 同一账号,后一用户登录,前一个用户则被踢掉
- python+opencv移动侦测(帧差法)
- 离线语音合成使用——科大讯飞or云知音or百度语音
- PyCharm插件安装
- Python调用摄像头
- 皮皮虾vs最右短视频分析
- IJCAI 2022|边界引导的伪装目标检测模型BGNet
- IOS微信内置浏览器音频加载问题
- 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测
- ECSHOP 银联在线支付 PHP 银联商务
- web前端期末大作业——基于HTML+CSS制作河南旅游网页设计
热门文章
- SAP RFC user 最小权限
- sublimeclang里面使用相对路径
- SharePoint要在master page中动态显示List数据的几种方式
- ReactOS,硬件抽象层,HAL概述
- ISA Server 2004 0x80004005错误
- mysql 批量添加字段前缀_MySQL中批量前缀表的sql语句
- C# IIS配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
- pla3d打印材料密度_模具粉必看!总有一款粉末能解决您的问题-毅速3D打印研制...
- 获取【请求体】数据的3种方式 request.getInputStream() request.getInputStream() request.getReader()
- 顺序队列,循环队列,链队列