Firefly开源社区

打印 上一主题 下一主题

<已解决>驱动suspend问题

363

积分

0

威望

0

贡献

技术达人

Rank: 2

积分
363

<已解决>驱动suspend问题

发表于 2017-6-2 15:28:24      浏览:5310 | 回复:0        打印      只看该作者   [复制链接] 楼主
本帖最后由 HelloBirthday 于 2017-6-4 22:01 编辑

platform驱动,添加了suspend和resume支持,但是在android自动休眠时并未进入suspend函数中。跟踪了部分代码,发现要进入suspend时要调用main.c中的state_store函数,然后一路往下最终才会进入到驱动中的suspend。打log显示从开机显示再到休眠,state_store只进入过一次,休眠的时候未调用。    请问,版主,suspend如何才能在休眠的时候被调用?!!   

RE:
感谢"倒带"和"K神"两位热心帮助,谢谢。
suspend的问题最后终于解决了。android一级睡眠不会调用到驱动的suspend,深度睡眠才会调用到,电源管理机制太过于复杂,我等菜鸟只能望而兴叹。。。。
在追代码时偶然发现wlan的代码有部分会调用到"suspend"功能,当然这里的suspend并不是真正的suspend,可以称之为earlysuspend,linux内核中有这样一种机制:notify机制,earlysuspend正是由notify通知链负责完成的(可参考rfkill-wlan.c代码),在probe中会通过调用fb_register_client()来注册一个notifier回调接口,该回调接口就可以完成我们需要完成的earlysuspend任务,这一部分我了解的也不深。。。
注册好之后什么时候会被调用到呢?
android一级休眠时会关闭背光和显示器,怎么关闭的呢?
是通过ioctl  FBIOBLANK完成的,fbmem.c中fb_blank函数中:fb_notifier_call_chain(FB_EARLY_EVENT_BLANK, &event);这里notify机制通知已经注册在通知链上的notifier,即回调接口。因此,android在一级休眠时自然就能调用到驱动中的"suspend"了。


rfkill-wlan.c节选:
  1. static void rfkill_wlan_early_suspend(void)
  2. {
  3.     //LOG("%s :enter\n", __func__);

  4.     return;
  5. }

  6. static void rfkill_wlan_later_resume(void)
  7. {
  8.    //LOG("%s :enter\n", __func__);

  9.     return;
  10. }

  11. static int rfkill_wlan_fb_event_notify(struct notifier_block *self,
  12.          unsigned long action, void *data)
  13. {

  14.     struct fb_event *event = data;
  15.     int blank_mode = *((int *)event->data);

  16.     switch (blank_mode) {
  17.         case FB_BLANK_UNBLANK:
  18.              rfkill_wlan_later_resume();
  19.              break;
  20.         case FB_BLANK_NORMAL:
  21.              rfkill_wlan_early_suspend();
  22.              break;
  23.         default:
  24.              rfkill_wlan_early_suspend();
  25.              break;
  26.      }

  27.     return 0;
  28. }

  29. static struct notifier_block rfkill_wlan_fb_notifier = {
  30.     .notifier_call = rfkill_wlan_fb_event_notify,
  31. };
复制代码
  1. static int rfkill_wlan_probe(struct platform_device *pdev)
  2. {
  3.     ....
  4.     fb_register_client(&rfkill_wlan_fb_notifier);
  5.     ....
  6. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表