linux IO引脚唤醒深度休眠,驱动修改步骤
唤醒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引脚唤醒深度休眠,驱动修改步骤相关推荐
- linux界面唤醒,Linux计算机实现自动唤醒和关闭的方法步骤详解
描述 不要成为一个电能浪费者.如果你的电脑不需要开机就请把它们关机.出于方便和计算机宅的考虑,你可以通过配置你的 Linux 计算机实现自动唤醒和关闭. 宝贵的系统运行时间 有时候有些电脑需要一直处在 ...
- Linux环境thinkphp配置以及数据源驱动修改
项目中需要用到thinkphp,以下简称tp. linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 thinkphp版:3.2.3 1.安 ...
- Linux的电源管理-休眠与唤醒
写在前面 为了理清新平台系统休眠和唤醒的流程,通过学习其他平台的电源管理方法,曲径通幽, 达到目的. 刚接手新平台,且相应的资料不多,很容易让人力不从心;我在网上寻找了学习资源,发现韦东山对S3C24 ...
- 低功耗深度休眠后无法唤醒、烧录程序,怎么办?(华大半导体HC32L136)
问题陈述: 某日,本人在调测华大半导体单片机(HC32L136)低功耗时,一时恍惚,在没有唤醒中断的情况下,将上电延时函数删除,使系统上电后就立即进入低功耗深度休眠,导致无法唤醒.烧录程序,多次使用复 ...
- linux 休眠定时唤醒_LINUX 休眠唤醒问题
问题:LINUX中,通过电源管理驱动(自行开发!)调用LINUX内/kernel/power/内的功能函数,实现将系统资源SUSPENDING,后等待外部中断(按鍵或USB等)或定时中断,把系统唤醒. ...
- [I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A(对比原子和NXP官方测试板的网络芯片LAN8720A , KSZ8081 (也是飞凌)唯独复位引脚不同595芯片也涉及改动)
I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部MAC+外部 PHY 芯片的方案. I.MX6UL/ULL 有两个网络接 ...
- 单片机IO引脚驱动能力的提高
早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经常用的就是74LS244(单向 ...
- 论单片机IO引脚驱动能力的提高
单片机IO引脚驱动能力的提高 早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经 ...
- linux:framebuffer驱动之ssd1363驱动和fbtft驱动修改
环境:ubuntu18.04虚拟机和imx6q开发平台 目录 前言 1.添加ssd1363驱动到fbtft 2.亮度调节 前言 手里有一块ssd1363芯片的屏幕,查了很多关于framebuffer驱 ...
最新文章
- DNN(DotNetNuke)研究资源
- python教程app下载地址_python教程
- mysql怎么用_面试官都是这样发问的,连环冲锋炮,看你怎么抵挡(上)
- Android 百度鹰眼轨迹SDK(v2.1.6)
- ORACLE数据库在导入导出时序列不一致的问题
- numpy的基本使用2
- .NET跨平台实践:Linux .Net Core自宿主应用程序瘦身记
- 算法编程:找一个数在一系列数中出现次数一半以上
- 你看到过哪些简短有内涵的一看就想发朋友圈的句子?
- 关于URL路径的基本使用
- oracle导出dmp文件报错904,EXP-00008: 遇到 ORACLE 错误 904 ORA-01003
- Word各级标题格式设置和自动排序(标题序号)设置
- access数据库剔除重复项_使用Access数据库的站长看过来——如何自动去掉数据库中的重复文章...
- 推荐一款3D插件可以用纯html+css打造3D效果
- 秒换算 天 时 分 秒
- 基于导向滤波的暗通道先验去雾算法(Python,可直接运行)
- 计算机网络自顶向下方法 第三章 运输层 3.6 拥塞控制原理
- CentOS 7 root 密码破解及 grub2 加密
- 待业在家,晚上10点接到HR面试电话,我拒绝了
- TCP/IP详解第一卷第一章重点摘要