一直有一种强迫症,不把整个流程屡清楚就是蓝瘦香菇。做项目读博客多了,也就慢慢地搞清楚了。
安卓系统从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_dev.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)
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)就是调用到这个lcm驱动文件中的各个函数,进行初始化,load参数等等。
到这里就把lcm加载流程串通了。
我这里使用的是mt6735平台,android M,所以代码因为版本的差异有所不同,这就是我最讨厌mtk的地方,不对各个平台进行具体的说明,导致开发新手hin茫然!
最后,吃水不忘挖井人:
参考文档:
MTK_Android_Boot_Up_Flow(customer).pdf 这是mtk官网出的开机加载步骤
mtk设备模型之LCM--学习http://blog.csdn.net/gnnulzy/article/details/52622742
这是参考的一个帖子,比我写的生动形象,感谢前辈