Firefly开源社区
标题:
<已解决>驱动suspend问题
[打印本页]
作者:
HelloBirthday
时间:
2017-6-2 15:28
标题:
<已解决>驱动suspend问题
本帖最后由 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节选:
static void rfkill_wlan_early_suspend(void)
{
//LOG("%s :enter\n", __func__);
return;
}
static void rfkill_wlan_later_resume(void)
{
//LOG("%s :enter\n", __func__);
return;
}
static int rfkill_wlan_fb_event_notify(struct notifier_block *self,
unsigned long action, void *data)
{
struct fb_event *event = data;
int blank_mode = *((int *)event->data);
switch (blank_mode) {
case FB_BLANK_UNBLANK:
rfkill_wlan_later_resume();
break;
case FB_BLANK_NORMAL:
rfkill_wlan_early_suspend();
break;
default:
rfkill_wlan_early_suspend();
break;
}
return 0;
}
static struct notifier_block rfkill_wlan_fb_notifier = {
.notifier_call = rfkill_wlan_fb_event_notify,
};
复制代码
static int rfkill_wlan_probe(struct platform_device *pdev)
{
....
fb_register_client(&rfkill_wlan_fb_notifier);
....
}
复制代码
欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/)
Powered by Discuz! X3.1