用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即可。

  • 小结

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

irq_set_irq_wake函数的作用是设置一个中断来唤醒系统。它接收两个参数,一个是中断号irq,另一个是唤醒状态on。当on为1时,表示要使中断能够唤醒系统;当on为0时,表示要禁止中断唤醒系统。 在函数内部,它首先获取中断描述符irq_desc,并进行相应的处理。如果on为1,并且中断的唤醒深度(wake_depth)为0,那么它会调用set_irq_wake_real函数来设置中断的唤醒状态,并将wake_depth设置为0。同时,它还会使用irqd_set函数来设置中断数据结构中的IRQD_WAKEUP_STATE标志位,表示该中断可以唤醒系统。 如果on为0,并且中断的唤醒深度为0,那么它会打印警告信息,并且在wake_depth减少之后,调用set_irq_wake_real函数来禁止中断的唤醒状态。同时,它还会使用irqd_clear函数来清除中断数据结构中的IRQD_WAKEUP_STATE标志位,表示该中断不能唤醒系统。 总之,irq_set_irq_wake函数可以用于设置一个中断是否能够唤醒系统。这在中断处理函数中可能会使用到,当处理内容耗时较短且没有交互行为时,可以使用该函数来设置中断来唤醒系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [中断唤醒系统流程【转】](https://blog.csdn.net/weixin_34265814/article/details/90134135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Linux唤醒系统irq处理流程(2/2)](https://blog.csdn.net/hello_yj/article/details/125085435)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值