分类:linux kernelandroid待机 1427人阅读 评论(0) 收藏 举报 android 代码分析 each menu system linux


摘要:

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


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("Suspendingtype'%s':\n",
  3. kobject_name(&cls->kset.kobj));
  4. list_for_each_entry(sysdev,&cls->kset.list,kobj.entry){
  5. pr_debug("%s\n",kobject_name(&sysdev->kobj));
  6. /*Callauxillarydriversfirst*/
  7. list_for_each_entry(drv,&cls->drivers,entry){
  8. if(drv->suspend){//在driver的suspend回调里面,打开要使能的irq,让irq有wakeup功能
  9. ret=drv->suspend(sysdev,state);
  10. if(ret)
  11. gotoaux_driver;
  12. }
  13. WARN_ONCE(!irqs_disabled(),
  14. "Interruptsenabledafter%pF\n",
  15. drv->suspend);
  16. }
  17. /*Nowcallthegenericone*/
  18. if(cls->suspend){
  19. ret=cls->suspend(sysdev,state);
  20. if(ret)
  21. gotocls_driver;
  22. WARN_ONCE(!irqs_disabled(),
  23. "Interruptsenabledafter%pF\n",
  24. cls->suspend);
  25. }
  26. }
  27. }



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

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

比如

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

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

更多相关文章

  1. flutter与android混合开发一:Android原生项目创建flutter模块、An
  2. android的makefile分析
  3. Android(安卓)Makefile分析
  4. React Native封装Android原生UI和Android原生模块,并且集成腾讯云
  5. Kotlin实现Android顶部导航栏与模块联动
  6. android 项目中接入flutter模块(部分页面)
  7. Android之Input子系统事件分发流程
  8. 自定义android模块不编译的问题
  9. Android: 系统默认音量

随机推荐

  1. Android入门教程 sharedpreferences的用
  2. 设置TextView文字居中
  3. Android内存管理机制
  4. Android的UI结构试图工具hierarchyviewer
  5. Android(安卓)RelativeLayout 属性
  6. Android(安卓)4.0.3 CTS 测试
  7. 《Android面试宝典》学习笔记(第二章:布局)
  8. Android异步处理一:使用Thread+Handler实
  9. Android(安卓)软键盘功能键(EditText)
  10. Android补间动画原理介绍