用enable_irq_wake配置键盘输入作为唤醒源

(一)系统环境

使用的linux内核版本信息如下:

Linux version 5.10.217 (lsj73@7-3-new) (arm-linux-gnueabihf-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #29 SMP Tue Aug 20 12:08:17 CST 2024

(二)系统休眠时对于唤醒源的处理

首先了解系统如何知道哪些中断请求可以作为唤醒源(wake irq),以下是系统进入休眠状态的部分函数调用栈:

  |-state_store

    |-pm_suspend

      |-enter_state

        |-suspend_devices_and_enter

          |-suspend_enter       进入挂起状态

            |-dpm_suspend_noirq      对所有设备执行“noirq suspend”回调

              |-device_wakeup_arm_wake_irqs

              |-suspend_device_irqs

                |-suspend_device_irq

                  |-irqd_is_wakeup_set    irq是否设置成了唤醒源

irqd_is_wakeup_set会判断输入的irq是否被设置成为了唤醒源。如果是唤醒源则使用irqd_set(irqd, IRQD_WAKEUP_ARMED)做一下标记。否则禁用该中断请求。

(三)设置键盘输入作为唤醒源

IRQ子系统提供了两个辅助函数enable_irq_wake和unable_irq_wake,供设备驱动程序设置唤醒源。

那么如何在哪个文件哪个函数里面进行这样的修改呢?

初次设置时可以参照RTC如何被设置为唤醒源。这里直接给出方法。查看/proc/interrupus得到系统中断的信息。可以看到键盘输入对应的中断源是uart-pl011。

可以直接用grep找到设备驱动程序对应的文件以及回调函数的位置。

然后在回调函数中添加enable_irq_wake和unable_irq_wake即可。

  • 小结

配置过程不难,通过探索其过程学到更多的知识,理解休眠唤醒系统的流程,体会内核代码设计组织的精妙,还是有不少的收获的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值