IRQF_TRIGGER_MASK:
IRQF_TRIGGER_RISING 0X1
IRQF_TRIGGER_FALLING 0X2
IRQF_TRIGGER_HIGH 0X4
IRQF_TRIGGER_LOW 0X8
1) 如果设备具有唤醒系统的功能,请在probe函数中调用device_init_wakeup()和dev_pm_set_wake_irq()(注意调用顺序,先device_init_wakeup()再dev_pm_set_wake_irq())。系统suspend的时候会自动帮助我们enable_irq_wake()和disable_irq_wake()。如果你是i2c设备,连probe函数里面也可以不用调用了。只需要在设备的dts中添加wakeup-source属性即可。i2c core会自动帮我们完成这些操作。
2) 既然dts现在这么流行了,你又何必不用呢!设备dts中的interrupts属性都会指明中断触发type!怎么获取这个flag呢?irqd_get_trigger_type()可以通过dts获取irq的触发type。所以request_threaded_irq()的第四个参数irqflags可以使用irqd_get_trigger_type()获得。如果你的内核版本更新的话,还可以更简单,irqflags传入0即可,在request_threaded_irq()中会自动帮我们调用irqd_get_trigger_type()获取。
当然了,我们现在的常用request_thread_irq函数里,总是对顶半部不太关注,传NULL进去使用默认的顶半部。这个情况下,flag里必须要有IRQF_ONESHOT。所以,这里会有一点冲突。
3) 如果中断下半部使用工作队列,请成对使用pm_stay_awake()和pm_relax()。否则,谁也无法保证系统不会再一次的睡眠。