作家
登录

Linux系统休眠(System Suspend)和设备中断处理

作者: 来源: 2017-07-17 13:18:26 阅读 我要评论

三、体系中断唤醒接口:enable_irq_wake() 和 disable_irq_wake()

有些中断可以将体系大年夜睡眠状况中唤醒,我们称之“可以唤醒体系的中断”,当然,“可以唤醒体系的中断”须要设备才能启动唤醒体系如许的功能。如许的中断一般在工作状况的时刻就是作为通俗I/O interrupt出现,只要在预备使能唤醒体系功能的时刻,才会提议一些特其余设备和设定。

如许的设备和设定有可能是和硬件体系(例如SOC)上的旌旗灯号处理逻辑相干的,我们可以推敲下面的HW block图:

外设的中断旌旗灯号被送到“通用的中断旌旗灯号处理模块”和“特定中断旌旗灯号接收模块”。正常工作的时刻,我们会turn >

  • static bool suspend_device_irq(struct irq_desc *desc
  •  
  •  
  • …… 
  •  
  • if (irqd_is_wakeup_set(&desc->irq_data)) { 
  •  
  • irqd_set(&desc->irq_data, IRQD_WAKEUP_ARMED); 
  •  
  • return true
  •  
  •  
  • 省略Disable 中断的代码 
  •  
  •  
  • 也就是说,一旦调用enable_irq_wake设定了该设备的中断作为体系suspend的唤醒源,那么在该外设的中断不会被disable,只是被标记一个IRQD_WAKEUP_ARMED的标记。对于那些不是wakeup source的中断,在suspend_device_irq 函数中会标记IRQS_SUSPENDED并disable该设备的irq。在体系唤醒过程中(resume_device_irqs),被diable的中断会从新enable。

    当然,如不雅在suspend的过程中产生了某些事宜(例如wakeup source产生了有效旌旗灯号),大年夜而导致本次suspend abort,那么这个abort事宜也会通知到PM core模块。事宜并不须要被急速通知到PM core模块,一般而言,suspend thread会在某些点上去检查pending的wakeup event。

    在体系suspend的过程中,每一个来自wakeup source的中断都邑终止suspend过程或者将体系唤醒(如不雅体系已经进入suspend状况)。然则,在履行了suspend_device_irqs之后,通俗的中断被樊篱了,这时刻,即便HW触发了中断旌旗灯号也无法履行其interrupt handler。作为wakeup source的IRQ会如何呢?固然它的中杜绫腔有被mask掉落,然则其interrupt handler也不会履行(这时刻的HW Signal只是用来唤醒体系)。独一有机会履行的interrupt handler是那些标记IRQF_NO_SUSPEND flag的IRQ,因为它们的中断始终是enable的。当然,这些中断不该该调用enable_irq_wake进行唤醒源的设定。

    1. static int suspend_enter(suspend_state_t state, bool *wakeup) 
    2.  
    3.  
    4. …… 
    5.  
    6. 各个设备的late suspend阶段 
    7.  
    8. 各个设备的noirq suspend阶段 
    9.  
    10. if (state == PM_SUSPEND_FREEZE) { 
    11.  
    12. freeze_enter(); 
    13.  
    14. goto Platform_wake; 
    15.  
    16.  
    17. …… 
    18.  
    19.  

    Freeze和suspend的前面的操作根本是一样的:起首冻结体系中的过程,然后是suspend体系中的形形色色的device,不一样的处地点noirq suspend完成之后,freeze不会disable那些non-BSP的处理器和syscore suspend阶段,而是调用freeze_enter函数,把所有的处理器推送到idle状况。这时刻,任何的enable的中断都可以将体系唤醒。而这也就意味着那些标记IRQF_NO_SUSPEND(其IRQ没有在suspend_device_irqs过程中被mask掉落)是有才能将处理器大年夜idle状况中唤醒(不过,须要留意的是:这种旌旗灯号并不会触发一个体系唤醒旌旗灯号),而通俗中断因为其IRQ被disable了,是以无法唤醒idle状况中的处理器。

    那些可以或许唤醒体系的wakeup interrupt呢?因为个中杜绫腔有被mask掉落,是以也可以将体系大年夜suspend-to-idle状况中唤醒。全部过程和将体系大年夜suspend状况中唤醒一样,独一不合的是:将体系大年夜freeze状况唤醒走的中断处理路径,而将体系大年夜suspend状况唤醒走的唤醒处理路径,须要电源治理HW BLOCK中特其余中断处理逻辑的介入。


      推荐阅读

      Windows 10系统internet explorer无法显示该网页怎么办?

    【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路! 在日常平凡工作之余,我们有时会应用ie浏览器来看视频或者浏览消息,可是有不罕用户反竽暌钩说打开ie然落>>>详细阅读


    本文标题:Linux系统休眠(System Suspend)和设备中断处理

    地址:http://www.17bianji.com/lsqh/36241.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)