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

原文地址::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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值