分类: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. React Native封装Android原生UI和Android原生模块,并且集成腾讯云
  3. android 项目中接入flutter模块(部分页面)
  4. 自定义android模块不编译的问题
  5. Android: 系统默认音量
  6. android按键灯流程分析
  7. Android 拦截 HOME 按键
  8. Android 源码编译如何确定模块安装的位置
  9. Android 按键驱动

随机推荐

  1. github项目解析(五)-->android日志框架
  2. Android(安卓)Retrofit 2.0(一)初次见面请
  3. Android不完全退出主Activity的方法
  4. 10个 iOS 用户暂可以嘲笑 Android 的特点
  5. android高仿抖音、点餐界面、天气项目、
  6. Windows电脑:Android Studio 连接不上设备
  7. 2017年起至今的android各版本占比(持续更
  8. Android图表引擎aiCharts for Android v1
  9. Android之设置EditText输入类型(setInput
  10. Android 线性布局