Linux下節能中斷喚醒

來源:互聯網
上載者:User

Linux下節能中斷喚醒

在linux系統進入節能,如進入mem之後,可以通過中斷喚醒系統。選擇在節能模式下,是否支援該中斷喚醒系統是本文要講的內容。

例如,在觸控螢幕的suspend方法中,調用enable_irq_wake,則設定支援觸控螢幕中斷喚醒系統休眠,在resume方法中,調用disable_irq_wake關閉支援。

enable_irq_wake

就該函數而言,可以從兩方面思考。一,必須在進入suspend之前設定支援該中斷,二,在中斷喚醒表中標記對應的中斷號,支援其中斷喚醒。

enable_irq_wake調用函數set_irq_wake(irq,1),跟蹤set_irq_wake.該函數首先獲得中斷描述符,禁止所有中斷,調用set_irq_wake_real設定中斷(步驟一),接著設定desc->status|=IRQ_WAKEUP(步驟二),該status會在進入suspend之前,通過檢查status的標誌位是否有IRQ_WAKEUP來決定是否支援中斷喚醒休眠。

步驟一,set_irq_wake_real,該函數如下,

318 static int set_irq_wake_real(unsigned int irq, unsigned int on)
319 {
320         struct irq_desc *desc = irq_to_desc(irq);
321         int ret = -ENXIO;
322
323         if (desc->chip->set_wake)
324                 ret = desc->chip->set_wake(irq, on);
325
326         return ret;
327 }
        該函數實際調用的是中斷相關晶片的set_wake操作。
    對於freescale的mx25而言(與體系相關),在MACHINE_START中,通過machine_desc,不同的體系有不同的machine_desc,配置中斷,在set_irq_handler被調用時,有set_irq_chip設定chip操作,set_irq_chip實際就是不同的中斷號對應的chip指標指向mxc_avic_chip.
    static struct irq_chip mxc_avic_chip = {
    .ack = mxc_mask_irq,
    .mask = mxc_mask_irq,
    .unmask = mxc_unmask_irq,
    .set_wake = mxc_set_wake_irq,
};
    Chip的所有操作,包括startup,enable,disable都是在上述方法的基礎上封裝的,具體與寄存器配置有關。
    Set_wake方法實際就是mxc系列在suspend期間允許相關中斷的寄存器配置操作。
   
        步驟二,desc->status|=IRQ_WAKEUP,
    關於IRQ_WAKEUP,有兩處涉及,
   (1)check_wakeup_irqs,該函數被sysdev_suspend所調用。在準備進入suspend時,會調用sysdev_suspend,該函數中通過調用check_wakeup_irqs,檢查設定IRQ_WAKEUP的中斷是否還有在pending狀態,即進入中斷未退出的,如果有,則禁止進入suspend。
   (2)對於不同的體系,進入節能配置允許中斷喚醒的操作各不相同。所以Linux下有platform_suspend_ops提供出來,從而區別不同的方法統一操作。
    在late_initcall(mx25_pm_init)中,調用suspend_set_ops的方法設定platform_suspend_ops設定ops.
struct platform_suspend_ops mx25_suspend_ops = {
    .begin = mx25_pm_begin,
    .valid = mx25_pm_valid,
    .prepare = mx25_suspend_prepare,
    .enter = mx25_suspend_enter,
    .finish = mx25_suspend_finish,
};
    在sysdev_suspend成功之後,會調用mx25的enter方法,即mx25_suspend_enter,該函數最終調用mxc_cpu_lp_set(“mem”模式suspend)。該函數中,
    if ((desc->status & IRQ_WAKEUP) != 0)
                 lpimr &= ~(1 << (i - 32));
    配置lpimr寄存器,該寄存器就是允許休眠中斷喚醒的中斷設定。
      
    整體上睡眠中斷喚醒的流程就這樣,而disable_irq_wakeup與enable_irq_wakeup只是簡單的類似操作。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.