在项目中,一般具有中断唤醒的社保会有一个interrupt pin硬件连接到SOC的gpio pin,一般来说,当设备需要唤醒系统的时候,会通过改变interrupt pin电平状态,而SOC会检测到这个变化,将SOC的boot cpu(noboot cpu在suspend的时候被disable了)从sleep状态唤醒,该设备通过相关子系统通知上层应用做出相应的处理.这就是中断唤醒过程.
为了使能设备的唤醒能力,
1.设备驱动会在系统suspend的时候通过enable_irq_wake(irq)接口使能设备SOC引脚的中断唤醒能力.注意是设置irq的state为IRQD_WAKEUP_STATE,
2.在driver的probe函数中调用dev_pm_set_wake_irq()和device_init_wakeup().因为suspend的过程会通过dev_pm_arm_wake_irq()打开所有的wakeup source的irq wake功能.
系统睡眠echo “mem” > /sys/power/state 过程会调用driver的suspend接口.
当边沿中断触发后,唤醒boot cpu,并不会马上调用中断处理函数,首先执行syscore resume(clocks,driver,gpio等的resume)->arch_suspend_enable_irqs,-------->然后就是执行中断流程了.