MTK lcm 驱动加载流程 android M

直有一种强迫症,不把整个流程屡清楚就是蓝瘦香菇。做项目读博客多了,也就慢慢地搞清楚了。

安卓系统从power键按下释放,到lcm驱动显示,整个驱动的加载流程as follows:

lk阶段,还是先执行main.c (vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\kernel)

其中执行 platform_init(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\platform.c)  

其中调用mt_disp_init((void*)g_fb_base);(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\mt_disp_drv.c

其中就调用到primary_display_init(NULL);(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\primary_display.c这里kernel和lk下各有一个这个文件,应该是先调用lk中的,不对的请指正)

primary_display_init中的流程就比较清楚了:

pgc->plcm = disp_lcm_probe( lcm_name……

lcm_param = disp_lcm_get_params(pgc->plcm);

ret = disp_lcm_init(pgc->plcm);

 

其中重点分析下 disp_lcm_probe(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\disp_lcm.c其中disp_lcm.c是与ic原始驱动(lk层)最直接关联的函数,几乎上一一对应,要读懂呀!

check_lcm_node_from_DT() == 0 读取dts节点信息?

if (_lcm_count() == 0) 得到lcm的数量,如果为0返回NULL,如果为1,则

lcm_drv = lcm_driver_list[0]; 读取这个数组的第一个元素;

lcm_driver_list数组从mt65xx_lcm_list.c中extern过来的

这个数组中在添加lcm驱动的时候添加了各个驱动的lcm_drv

比如,我们要添加名为Eighty_80的lcm驱动

那么我们就会在mt65xx_lcm_list.c的LCM_DRIVER*lcm_driver_list[]中添加

#if defined(EIGHTY_80)

         &Eighty_80_lcm_drv,

#endif

其中&Eighty_80_lcm_drv则对应驱动文件中的lcm_drv

这样看的话,lcm_drv= lcm_driver_list[0];就是取得驱动文件中的lcm_drv

 

如果为大于一个lcm,则lcm_drv=lcm_driver_list[i],遍历取得各个lcm驱动的lcm_drv

之后会if(lcm_drv->compare_id() != 0)

这个函数会调用到lk中驱动文件的compare_id函数,返回lcd的id,(刚做的时候我也不知道lk的驱动和kernel的驱动不一样,后来才知道)

如果id存在,就会break跳出遍历,打印dprintf(INFO,"wewill use lcm: %s\n";告诉系统使用当前这个lcm

这样的话遍历的目的就是取得机器上当前所使用的lcm的各种信息

之后会将这个lcm的各类信息传递给kernel…………这里 disp_lcm_probe就结束了

 

再回到primary_display_init()

前面pgc->plcm= disp_lcm_probe,将当前使用的lcm驱动模型赋值给pgc->plcm

之后的disp_lcm_***(pgc->plcm)(就一个disp_lcm_get_params 和 disp_lcm_init)就是调用到这个lcm驱动文件中的对应函数,进行初始化,load参数。

 

到这里就把lcm加载流程串通了。

lk(对lcm)做了几件事:

a. led_init() (本质上就仅仅是关背光,路径:/lk/platform/mt6537/mt_leds.c中的mtxx_backlight_off())   

 b: compare id   

c.get_params   

d.lcm_init

e:load_boot_logo

f: show_boot_logo

g:mtxx_backlight_on()(本质上就是开背光,路径:/lk/platform/mt6537/mt_leds.c中的mtxx_backlight_on(),直接调用硬件驱动setbacklight,这与kernel启动后对背光的cust有很大的区别

我这里使用的是mt6735平台,Android M,所以代码因为版本的差异有所不同,这就是我最讨厌mtk的地方,不对各个平台进行具体的说明,导致开发新手hin茫然!

最后,吃水不忘挖井人:

参考文档:

MTK_Android_Boot_Up_Flow(customer).pdf  这是mtk官网出的开机加载步骤

mtk设备模型之LCM--学习http://blog.csdn.net/gnnulzy/article/details/52622742

这是参考的一个帖子,比我写的生动形象,感谢前辈


你可能感兴趣的:(MTK平台)