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电源管理-休眠与唤醒相关推荐

  1. 休眠后gpio状态_浅谈Digi XBee模块的休眠模式

    浅谈Digi XBee模块的休眠模式 2020-3-25 Digi XBee S2C模块,如果仅连接电源线可以测得,在待机情况下,大约是10.5mA左右的电流,在休眠时的功耗可以低到0.5uA.可以知 ...

  2. 休眠后gpio状态_STM32休眠与唤醒

    这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32的待机模式和停机模式.让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式. voidEXTI1_ ...

  3. 休眠后gpio状态_STM32中GPIO的8种工作模式总结

    STM32 中 GPIO 的 8 种工作模式总结 一.推挽输出:可以输出高.低电平,连接数字器件 ; 推挽结构一般是指 两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一 个截止.高低 ...

  4. Linux电源管理(10)_autosleep

    Linux电源管理(10)_autosleep 作者:wowo 发布于:2014-9-18 23:42 分类:电源管理子系统 1. 前言 Autosleep也是从Android wakelocks补丁 ...

  5. linux 电源管理 唤醒,Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]

    转发请注明出处: 最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识.为了备忘和理清思路现整理成文,以便日后查阅. 移动设备由于自身的限制有一个硬伤就是电量的消耗问题.由于电池的电量有限,所 ...

  6. linux 电源管理 Generic PM之Suspend功能

    Linux电源管理(6)_Generic PM之Suspend功能 作者:wowo 发布于:2014-8-22 21:40 分类:电源管理子系统 1. 前言 Linux内核提供了三种Suspend: ...

  7. Linux电源管理(6)_Generic PM之Suspend功能【重磅文章】-- wowo

    文章目录 1. 前言 2. Suspend功能有关的代码分布 1)PM Core 2)Device PM 3)Platform dependent PM 3. suspend&resume过程 ...

  8. linux大多数进程都是sleep,Linux电源管理(5)_Hibernate和Sleep功能介绍

    Linux电源管理(5)_Hibernate和Sleep功能介绍 作者:wowo 发布于:2014-6-10 16:11 分类:电源管理子系统 1. 前言 Hibernate和Sleep两个功能是Li ...

  9. Linux电源管理(5)_Hibernate和Sleep功能介绍【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic ...

最新文章

  1. day03-正则表达式
  2. Integer.valueof(null)报错
  3. jfinal mysql增删改查_Jfinal简单实现增删改查
  4. ​30种EMC标准电路分享,再不收藏就晚了!
  5. setInterval 和setTimeout 清空定时器,返回值,赋值为null的区别
  6. P1078 文化之旅
  7. css索引_CSS中的Z索引:它是什么以及它做什么
  8. LeetCode(169)——求众数(JavaScript)
  9. Android 网络HTML查看器
  10. 同一账号,后一用户登录,前一个用户则被踢掉
  11. python+opencv移动侦测(帧差法)
  12. 离线语音合成使用——科大讯飞or云知音or百度语音
  13. PyCharm插件安装
  14. Python调用摄像头
  15. 皮皮虾vs最右短视频分析
  16. IJCAI 2022|边界引导的伪装目标检测模型BGNet
  17. IOS微信内置浏览器音频加载问题
  18. 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测
  19. ECSHOP 银联在线支付 PHP 银联商务
  20. web前端期末大作业——基于HTML+CSS制作河南旅游网页设计

热门文章

  1. SAP RFC user 最小权限
  2. sublimeclang里面使用相对路径
  3. SharePoint要在master page中动态显示List数据的几种方式
  4. ReactOS,硬件抽象层,HAL概述
  5. ISA Server 2004 0x80004005错误
  6. mysql 批量添加字段前缀_MySQL中批量前缀表的sql语句
  7. C# IIS配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
  8. pla3d打印材料密度_模具粉必看!总有一款粉末能解决您的问题-毅速3D打印研制...
  9. 获取【请求体】数据的3种方式 request.getInputStream() request.getInputStream() request.getReader()
  10. 顺序队列,循环队列,链队列