android待机详细结合代码分析(二)


分类: linux kernel android待机   1427人阅读  评论(0)  收藏  举报


摘要:

此篇在上篇博文基础上,增加对待机后,怎么增加唤醒源的分析


android待机过程 与 irq的开关过程

对于android开发者而言,可能会有疑问为什么我们的手机或者平板,音量按键,屏幕不会亮,而电源按键,屏幕会亮?又或者如何才能让音量按键也有点亮屏的效果(当然纯粹是以开发者角度,与实用性无关)

irq在android待机过程中的总体管理是:

1. 全部irq被disable

2. 部分irq被enable

3. 待机等待irq唤醒


之所以能够这么统一地管理所有的irq,而不用知道是什么应用注册的irq,是通过irq的属性,而这个属性是每个模块在申请注册自己模块中断时候需要考虑清楚的。

我们尝试一下,在待机的时候,是否可以按自己想法,使能部分的irq,比如音量按键。

1. 全部irq被disable

[csharp]  view plain copy
  1. arch_suspend_disable_irqs();  

2. 部分irq被enable

[csharp]  view plain copy
  1. list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) {  
  2.     pr_debug("Suspending type '%s':\n",  
  3.          kobject_name(&cls->kset.kobj));  
  4.   
  5.     list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) {  
  6.         pr_debug(" %s\n", kobject_name(&sysdev->kobj));  
  7.   
  8.         /* Call auxillary drivers first */  
  9.         list_for_each_entry(drv, &cls->drivers, entry) {  
  10.             if (drv->suspend) {//在driver的suspend回调里面,打开要使能的irq,让irq有wakeup功能  
  11.                 ret = drv->suspend(sysdev, state);  
  12.                 if (ret)  
  13.                     goto aux_driver;  
  14.             }  
  15.             WARN_ONCE(!irqs_disabled(),  
  16.                 "Interrupts enabled after %pF\n",  
  17.                 drv->suspend);  
  18.         }  
  19.   
  20.         /* Now call the generic one */  
  21.         if (cls->suspend) {  
  22.             ret = cls->suspend(sysdev, state);  
  23.             if (ret)  
  24.                 goto cls_driver;  
  25.             WARN_ONCE(!irqs_disabled(),  
  26.                 "Interrupts enabled after %pF\n",  
  27.                 cls->suspend);  
  28.         }  
  29.     }  
  30. }  



管理irq,我们只需要知道irq的id是多少就可以,在CPU设计,会有GIC模块,每个irq都能有唯一的id。

在linux中,enable_irq_wake和disable_irq_wake两个函数,只需要传入irq的id,就可以开关这个irq的wake功能。

比如

[csharp]  view plain copy
  1. int irq_wake_id[IRQ_WAKE_MAX];  
  2.   
  3.   
  4. void pm_irqwake_enable(void)  
  5. {  
  6.     enable_irq_wake(irq_wake_id[IRQ_WAKE_TS]);  
  7.     enable_irq_wake(irq_wake_id[IRQ_WAKE_GS]);  
  8.     enable_irq_wake(irq_wake_id[IRQ_WAKE_KEY_MENU]);  
  9.     return;  
  10. }  
  11.   
  12. void pm_irqwake_disable(void)  
  13. {  
  14.     disable_irq_wake(irq_wake_id[IRQ_WAKE_GS]);  
  15.     disable_irq_wake(irq_wake_id[IRQ_WAKE_TS]);  
  16.     disable_irq_wake(irq_wake_id[IRQ_WAKE_KEY_MENU]);  
  17.     return;  
  18. }  

这些irq的id,是可以cat proc/interrupts得到的,当然更好的方法是用函数去获取,我是偷懒直接看完id后,再define。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值