(一)系统环境
使用的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即可。
- 小结
配置过程不难,通过探索其过程学到更多的知识,理解休眠唤醒系统的流程,体会内核代码设计组织的精妙,还是有不少的收获的。