android MTK驱动背光唤醒流程
在標(biāo)準(zhǔn)的android驅(qū)動中,睡眠喚醒流程非常清晰,能夠較方便的更改lcd喚醒時間和led背光的點亮?xí)r間,但是也很容易出現(xiàn)問題,比如說閃屏,喚醒慢!
出現(xiàn)閃屏有兩個原因
1、開背光時間在喚醒lcd前!
2、開背光時間在喚醒lcd后,但是沒有等lcd刷屏就點亮背光!
我按照標(biāo)準(zhǔn)驅(qū)動流程去分析mtk的做法
他的video最初的注冊位置是
Mediatekkerneldriversvideomtkfb.c里面
入口函數(shù)
module_init(mtkfb_init);
在函數(shù)int__initmtkfb_init(void)中有這樣一句
register_early_suspend(&mtkfb_early_suspend_handler);
是注冊睡眠機(jī)制函數(shù)
只要注冊這里就是把mtkfb_early_suspend_handler下面的結(jié)構(gòu)體里面的函數(shù)
.suspend=mtkfb_early_suspend,
.resume=mtkfb_late_resume,
睡眠、喚醒交給系統(tǒng)來管理
他的調(diào)用順序和
.level=EARLY_SUSPEND_LEVEL_DISABLE_FB,這個值有關(guān)系
去找找背光的驅(qū)動
module_init(mt65xx_leds_init);背光入口函數(shù)
在mt65xx_leds_init中注冊平臺類設(shè)備
ret=platform_driver_register(&mt65xx_leds_driver);
他函數(shù)注冊信息是
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,
};
我們也可以再手機(jī)adbshell里面查找到相關(guān)的信息
/sys/bus/platform/devices/leds-mt65xx
/sys/devices/platform/leds-mt65xx
但是沒有找到這里的設(shè)置路徑???奇怪!!那背光燈設(shè)置是在什么地方呢????
在mt65xx_leds_probe函數(shù)中
有這樣一條代碼
g_leds_data[i]->cdev.brightness_set=mt65xx_led_set;
難道是直接給上層節(jié)點直接設(shè)置??
繼續(xù)跟代碼
仔細(xì)分析代碼mt65xx_leds_probe函數(shù)
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;
}
建立了節(jié)點之后呢??????????
不得不佩服mtk弄個鳥東西搞這么復(fù)雜
進(jìn)入
/sys/devices/platform/leds-mt65xx/leds/lcd-backlight/
發(fā)現(xiàn)有
Brightness
用這種可以設(shè)置背光燈亮度
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節(jié)點
上層直接調(diào)用……
為什么?????
打log發(fā)現(xiàn)在resumelcd后就會調(diào)用brightness寫值
他沒有用
.level=EARLY_SUSPEND_LEVEL_DISABLE_FB,這個來管理
優(yōu)點
不會有我開始說的那兩種bug,什么時候點亮lcd是由上層控制,上層去判斷有沒有刷屏!
流程已經(jīng)寫死,只要開發(fā)者不破壞此模式就不會有bug
缺點
破壞了源代碼的流程,已經(jīng)完全是一體,真正出現(xiàn)問題比較難改!
關(guān)于上層怎么去判斷什么時候去點亮背光,這個問題,現(xiàn)在還沒跟,以后有時間慢慢跟,不過做驅(qū)動,跟到這里已經(jīng)可以滿足驅(qū)動的要求了!
總結(jié)
以上是生活随笔為你收集整理的android MTK驱动背光唤醒流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟人生4吸血鬼零弱点秘籍是什么(MuM
- 下一篇: FastAdmin 表格排序