栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 = ;
            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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868171.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号