|
<已解决>驱动suspend问题
发表于 2017-6-2 15:28:24
浏览:7445
|
回复: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节选:- 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);
- ....
- }
复制代码
|
|