android MTK驱动背光唤醒流程
在標準的android驅動中,睡眠喚醒流程非常清晰,能夠較方便的更改lcd喚醒時間和led背光的點亮時間,但是也很容易出現問題,比如說閃屏,喚醒慢!
出現閃屏有兩個原因
1、開背光時間在喚醒lcd前!
2、開背光時間在喚醒lcd后,但是沒有等lcd刷屏就點亮背光!
我按照標準驅動流程去分析mtk的做法
他的video最初的注冊位置是
Mediatekkerneldriversvideomtkfb.c里面
入口函數
module_init(mtkfb_init);
在函數int__initmtkfb_init(void)中有這樣一句
register_early_suspend(&mtkfb_early_suspend_handler);
是注冊睡眠機制函數
只要注冊這里就是把mtkfb_early_suspend_handler下面的結構體里面的函數
.suspend=mtkfb_early_suspend,
.resume=mtkfb_late_resume,
睡眠、喚醒交給系統來管理
他的調用順序和
.level=EARLY_SUSPEND_LEVEL_DISABLE_FB,這個值有關系
去找找背光的驅動
module_init(mt65xx_leds_init);背光入口函數
在mt65xx_leds_init中注冊平臺類設備
ret=platform_driver_register(&mt65xx_leds_driver);
他函數注冊信息是
staticstructplatform_drivermt65xx_leds_driver={
.driver ={
.name ="leds-mt65xx",
.owner =THIS_MODULE,
},
.probe =mt65xx_leds_probe,
.remove =mt65xx_leds_remove,
//.suspend =mt65xx_leds_suspend,
.shutdown=mt65xx_leds_shutdown,
};
我們也可以再手機adbshell里面查找到相關的信息
/sys/bus/platform/devices/leds-mt65xx
/sys/devices/platform/leds-mt65xx
但是沒有找到這里的設置路徑???奇怪!!那背光燈設置是在什么地方呢????
在mt65xx_leds_probe函數中
有這樣一條代碼
g_leds_data[i]->cdev.brightness_set=mt65xx_led_set;
難道是直接給上層節點直接設置??
繼續跟代碼
仔細分析代碼mt65xx_leds_probe函數
if(strcmp(g_leds_data[i]->cdev.name,"lcd-backlight")==0)
{
rc=device_create_file(g_leds_data[i]->cdev.dev,&dev_attr_duty);
if(rc)
{
LEDS_DEBUG("[LED]device_create_filedutyfail!
");
}
rc=device_create_file(g_leds_data[i]->cdev.dev,&dev_attr_div);
if(rc)
{
LEDS_DEBUG("[LED]device_create_filedutyfail!
");
}
rc=device_create_file(g_leds_data[i]->cdev.dev,&dev_attr_frequency);
if(rc)
{
LEDS_DEBUG("[LED]device_create_filedutyfail!
");
}
rc=device_create_file(g_leds_data[i]->cdev.dev,&dev_attr_pwm_register);
if(rc)
{
LEDS_DEBUG("[LED]device_create_filedutyfail!
");
}
bl_setting=&g_leds_data[i]->cust;
}
建立了節點之后呢??????????
不得不佩服mtk弄個鳥東西搞這么復雜
進入
/sys/devices/platform/leds-mt65xx/leds/lcd-backlight/
發現有
Brightness
用這種可以設置背光燈亮度
echo255>brightness
Brightness這東西在哪里來的?
在代碼kerneldriversledsled-class.c
里面有subsys_initcall(leds_init);
用subsys_initcall
有這樣代碼
staticstructdevice_attributeled_class_attrs[]={
__ATTR(brightness,0644,led_brightness_show,led_brightness_store),
__ATTR(max_brightness,0444,led_max_brightness_show,NULL),
#ifdefCONFIG_LEDS_TRIGGERS
__ATTR(trigger,0644,led_trigger_show,led_trigger_store),
#endif
__ATTR_NULL,
};
生成了brightness節點
上層直接調用……
為什么?????
打log發現在resumelcd后就會調用brightness寫值
他沒有用
.level=EARLY_SUSPEND_LEVEL_DISABLE_FB,這個來管理
優點
不會有我開始說的那兩種bug,什么時候點亮lcd是由上層控制,上層去判斷有沒有刷屏!
流程已經寫死,只要開發者不破壞此模式就不會有bug
缺點
破壞了源代碼的流程,已經完全是一體,真正出現問題比較難改!
關于上層怎么去判斷什么時候去點亮背光,這個問題,現在還沒跟,以后有時間慢慢跟,不過做驅動,跟到這里已經可以滿足驅動的要求了!
總結
以上是生活随笔為你收集整理的android MTK驱动背光唤醒流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟人生4吸血鬼零弱点秘籍是什么(MuM
- 下一篇: FastAdmin 表格排序