唤醒linux系统休眠的方法

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

查看该系统支持的睡眠模式

[root@RK356X:/]# cat /sys/power/state
freeze mem

常用的休眠方式有freeze,standby, mem, disk
• freeze: 冻结I/O设备,将它们置于低功耗状态,使处理器进入空闲状态,唤醒最快,耗电比其它standby, mem, disk方式高
• standby:除了冻结I/O设备外,还会暂停系统,唤醒较快,耗电比其它 mem, disk方式高
• mem:将运行状态数据存到内存,并关闭外设,进入等待模式,唤醒较慢,耗电比disk方式高
• disk: 将运行状态数据存到硬盘,然后关机,唤醒最慢

进入睡眠的命令

//一直休眠:
echo "mem" > /sys/power/state
echo "freeze" > /sys/power/state //RTC定时唤醒:
rtcwake -s 15 -m freeze -d /dev/rtc0
rtcwake -s 30 -m mem -d /dev/rtc0//打印出系统的锁,查看系统当前所处状态:
cat /sys/kernel/debug/wakeup_sources//查看之前休眠的状态,以及成功休眠唤醒多少次,失败多少次及在哪里失败:
cat /sys/kernel/debug/suspend_stats

步骤

博主今天要讨论的,就是一个按键如何唤醒系统,类似于手机的电源键。

这个功能并不是新功能,所以 Linux 内部有一个 demo 可以使用,先教大家如何使用该 demo,然后较大家如何撰写中断唤醒系统驱动。

官方 demo:

demo 目录:/kernel4.19/drivers/input/keyboard/gpio_keys.c

该驱动是专门为按键准备的,是一个身经百战的驱动,任何时候测试按键中断或者中断唤醒系统都可以用它,很多时候比自己写的驱动靠谱。

要想使用该驱动,首先在该目录的 Makefile 中增加:

obj-y  += gpio_keys.o

设备树中增加:

gpio-keys {    //唤醒按钮compatible = "gpio-keys";#address-cells = <1>;#size-cells = <0>;autorepeat;key0 {label = "GPIO Key Enter";linux,code = <KEY_ENTER>;gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;// gpio-key,wakeup;wakeup-source;  //add};
};

compatible 属性是 “gpio-keys”,gpio_keys.c 文件的674行会匹配这个属性,匹配到了该驱动就会运行。

linux,code 属性是按键值,Linux 对所有按键事件都有编号,所以KEY_ENTER 实际是一个数字,是驱动向上层报告的一个按键值。

gpios 属性是标明哪一个 GPIO 口,低电平触发,大家可以自己选一个 GPIO。

gpio-key,wakeup 是代表此GPIO支持中断唤醒,你也可以写成:wakeup-source。新老版本而已。

休眠中电源控制:
修改dts: regulator-state-mem

//例如
regulator-state-mem {regulator-off-in-suspend;//在休眠中关闭
};regulator-state-mem {regulator-on-in-suspend;//在休眠中打开
};

修改就是这么简单,不过语法要符合各位手中的开发板平台。然后编译出内核和设备树文件,下载到板子中。(Linux 内核根目录会有 .config 文件,确保 CONFIG_PM_SLEEP=y 有打开)

如果驱动加载成功,在 /proc/interrupts 中可以看到:


从左往右第一列是软件中断号(唯一)。

第二列是 CPU,表示该中断在该CPU上触发了多少次,多核会有多列。

第三列是中断控制器,imx6ull开发板根中断控制器是GPC,外部中断控制器是gpio-mxc,两者是级联关系。

第四列是硬件中断号,也就是GPIO口编号。

第五列表示该中断是边沿触发还是电平触发。

第六列是中断名称,可以找到一个 GPIO Key Enter,如果驱动加载成功就能看到,如果失败就看不到。

验证方法
在内核中,休眠方式有很多种,可以通过下面命令查看(详看前文)

# cat /sys/power/state

进入休眠:

# echo mem > /sys/power/state

系统进入睡眠后,基本都会停掉UI、停掉串口,串口无法操作,如下图所示。

按下按键,系统恢复:

当然这里的 log 并不完整,输入 dmesg 可以看到完整 log:


PM:power manager

具体干了什么,图中有解释,分为 suspend 过程和 resume 过程。

其实一个中断让它支持唤醒系统,最主要是多了两个函数:suspend、resume。

suspend 函数在系统整体 suspend 的时候,会调用每个外设注册的 suspend,我们在这个函数中调用 enable_irq_wake,表示该中断在系统休眠时是 enable 状态。

resume 函数在系统整体 resume 的时候,会调用每个外设注册的 resume 函数,在 resume 函数中调用 disable_irq_wake ,表示该中断在系统运行时不需要。两者成对使用。

具体参看下面文章,写的很好:

http://www.wowotech.net/irq_subsystem/irq_handle_procedure.html

大家也可以研究一下 gpio_keys.c,该驱动看起来比较复杂,但是很完善,毕竟身经百战,什么因素都考虑到了,测试就用它!

参考文章

• 中断唤醒系统流程 (wowotech.net) http://www.wowotech.net/irq_subsystem/irq_handle_procedure.html
• 手把手教你中断唤醒系统 - 云+社区 - 腾讯云 (tencent.com) https://cloud.tencent.com/developer/article/1926709?from=15425
• Linux电源管理(6)_Generic PM之Suspend功能 (wowotech.net) http://www.wowotech.net/pm_subsystem/suspend_and_resume.html

linux IO引脚唤醒深度休眠,驱动修改步骤相关推荐

  1. linux界面唤醒,Linux计算机实现自动唤醒和关闭的方法步骤详解

    描述 不要成为一个电能浪费者.如果你的电脑不需要开机就请把它们关机.出于方便和计算机宅的考虑,你可以通过配置你的 Linux 计算机实现自动唤醒和关闭. 宝贵的系统运行时间 有时候有些电脑需要一直处在 ...

  2. Linux环境thinkphp配置以及数据源驱动修改

    项目中需要用到thinkphp,以下简称tp. linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 thinkphp版:3.2.3 1.安 ...

  3. Linux的电源管理-休眠与唤醒

    写在前面 为了理清新平台系统休眠和唤醒的流程,通过学习其他平台的电源管理方法,曲径通幽, 达到目的. 刚接手新平台,且相应的资料不多,很容易让人力不从心;我在网上寻找了学习资源,发现韦东山对S3C24 ...

  4. 低功耗深度休眠后无法唤醒、烧录程序,怎么办?(华大半导体HC32L136)

    问题陈述: 某日,本人在调测华大半导体单片机(HC32L136)低功耗时,一时恍惚,在没有唤醒中断的情况下,将上电延时函数删除,使系统上电后就立即进入低功耗深度休眠,导致无法唤醒.烧录程序,多次使用复 ...

  5. linux 休眠定时唤醒_LINUX 休眠唤醒问题

    问题:LINUX中,通过电源管理驱动(自行开发!)调用LINUX内/kernel/power/内的功能函数,实现将系统资源SUSPENDING,后等待外部中断(按鍵或USB等)或定时中断,把系统唤醒. ...

  6. [I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A(对比原子和NXP官方测试板的网络芯片LAN8720A , KSZ8081 (也是飞凌)唯独复位引脚不同595芯片也涉及改动)

    I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部MAC+外部 PHY 芯片的方案. I.MX6UL/ULL 有两个网络接 ...

  7. 单片机IO引脚驱动能力的提高

    早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经常用的就是74LS244(单向 ...

  8. 论单片机IO引脚驱动能力的提高

    单片机IO引脚驱动能力的提高 早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经 ...

  9. linux:framebuffer驱动之ssd1363驱动和fbtft驱动修改

    环境:ubuntu18.04虚拟机和imx6q开发平台 目录 前言 1.添加ssd1363驱动到fbtft 2.亮度调节 前言 手里有一块ssd1363芯片的屏幕,查了很多关于framebuffer驱 ...

最新文章

  1. DNN(DotNetNuke)研究资源
  2. python教程app下载地址_python教程
  3. mysql怎么用_面试官都是这样发问的,连环冲锋炮,看你怎么抵挡(上)
  4. Android 百度鹰眼轨迹SDK(v2.1.6)
  5. ORACLE数据库在导入导出时序列不一致的问题
  6. numpy的基本使用2
  7. .NET跨平台实践:Linux .Net Core自宿主应用程序瘦身记
  8. 算法编程:找一个数在一系列数中出现次数一半以上
  9. 你看到过哪些简短有内涵的一看就想发朋友圈的句子?
  10. 关于URL路径的基本使用
  11. oracle导出dmp文件报错904,EXP-00008: 遇到 ORACLE 错误 904 ORA-01003
  12. Word各级标题格式设置和自动排序(标题序号)设置
  13. access数据库剔除重复项_使用Access数据库的站长看过来——如何自动去掉数据库中的重复文章...
  14. 推荐一款3D插件可以用纯html+css打造3D效果
  15. 秒换算 天 时 分 秒
  16. 基于导向滤波的暗通道先验去雾算法(Python,可直接运行)
  17. 计算机网络自顶向下方法 第三章 运输层 3.6 拥塞控制原理
  18. CentOS 7 root 密码破解及 grub2 加密
  19. 待业在家,晚上10点接到HR面试电话,我拒绝了
  20. TCP/IP详解第一卷第一章重点摘要

热门文章

  1. CSS透明度之rgba和opacity的区别
  2. 软件开发工期估算系列(3)——見積もり値の「幼虫」「サナギ」「成虫」
  3. 上海电信的iptv穿越dd-wrt
  4. Vue3分割线(Divider)
  5. 电脑修改用户(User)文件夹名称
  6. 【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(19):不定积分(补充知识)
  7. catia如何整列加工_CATIA机械加工工艺教程
  8. 即构抓娃娃H5方案全球首家支持HTTPS,抓娃娃先从安全抓起!
  9. C/C++ 费诺编码实现
  10. 电信运营商云计算战略和发展现状