原文地址::linux IO引脚唤醒深度休眠,驱动修改步骤_夜星辰2022的博客-CSDN博客
相关文章
1、linux 休眠唤醒流程----linux 休眠唤醒流程_qwaszx523的博客-CSDN博客
2、中断唤醒系统流程----中断唤醒系统流程
3、Linux电源管理(6)_Generic PM之Suspend功能----Linux电源管理(6)_Generic PM之Suspend功能
4、手把手教你中断唤醒系统---- 手把手教你中断唤醒系统 - 腾讯云开发者社区-腾讯云
5、
唤醒linux系统休眠的方法
当我们休眠时,如果想唤醒,则需要添加中断唤醒源,使得在休眠时,这些中断是设为开启的,当有中断来,则会退出唤醒。常见的中断源有RTC、按键、USB。
查看该系统支持的睡眠模式
[root@RK356X:/]# cat /sys/power/state
freeze mem
1
2
常用的休眠方式有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
1
2
3
4
5
6
7
8
9
10
11
12
13
步骤
博主今天要讨论的,就是一个按键如何唤醒系统,类似于手机的电源键。
这个功能并不是新功能,所以 Linux 内部有一个 demo 可以使用,先教大家如何使用该 demo,然后较大家如何撰写中断唤醒系统驱动。
官方 demo:
demo 目录:/kernel4.19/drivers/input/keyboard/gpio_keys.c
该驱动是专门为按键准备的,是一个身经百战的驱动,任何时候测试按键中断或者中断唤醒系统都可以用它,很多时候比自己写的驱动靠谱。
要想使用该驱动,首先在该目录的 Makefile 中增加:
obj-y += gpio_keys.o
1
设备树中增加:
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
};
};
1
2
3
4
5
6
7
8
9
10
11
12
13
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;//在休眠中打开
};
1
2
3
4
5
6
7
8
修改就是这么简单,不过语法要符合各位手中的开发板平台。然后编译出内核和设备树文件,下载到板子中。(Linux 内核根目录会有 .config 文件,确保 CONFIG_PM_SLEEP=y 有打开)
如果驱动加载成功,在 /proc/interrupts 中可以看到:
从左往右第一列是软件中断号(唯一)。
第二列是 CPU,表示该中断在该CPU上触发了多少次,多核会有多列。
第三列是中断控制器,imx6ull开发板根中断控制器是GPC,外部中断控制器是gpio-mxc,两者是级联关系。
第四列是硬件中断号,也就是GPIO口编号。
第五列表示该中断是边沿触发还是电平触发。
第六列是中断名称,可以找到一个 GPIO Key Enter,如果驱动加载成功就能看到,如果失败就看不到。
验证方法
在内核中,休眠方式有很多种,可以通过下面命令查看(详看前文)
# cat /sys/power/state
1
进入休眠:
# echo mem > /sys/power/state
1
系统进入睡眠后,基本都会停掉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
————————————————
版权声明:本文为CSDN博主「夜星辰2022」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37787043/article/details/124652931