安卓系统从power键按下释放,到lcm驱动显示,整个驱动的加载流程as follows:
LK阶段:
首先执行main.c(vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6739/src/core/main.c)文件,然后执行
platform_init(/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6739/platform.c),然后执行mt_disp_init((void *)g_fb_base);
然后执行disp_lcm_probe -->
其中重点分析下 disp_lcm_probe(vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6739/disp_lcm.c)
check_lcm_node_from_DT() == 0 读取dts节点信息?
if (_lcm_count() == 0) 得到lcm的数量,如果为0返回NULL,如果为1,则
(_lcm_count()返回的是lcm_count,而lcm_count是从mt65xx_lcm_list.c中extern过来的lcm_count= sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *))
lcm_drv = lcm_driver_list[0]; 读取这个数组的第一个元素;
lcm_driver_list数组从mt65xx_lcm_list.c中extern过来的
这个数组中在添加lcm驱动的时候添加了各个驱动的lcm_drv
比如,我们要添加名为Eighty_80的lcm驱动
那么我们就会在vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/mt65xx_lcm_list.c添加
+extern LCM_DRIVER Eighty_80_lcm_drv;
并且在LCM_DRIVER *lcm_driver_list[]中添加
#if defined(EIGHTY_80)
&Eighty_80_lcm_drv,//对应lcm驱动的主函数
#endif
其中&Eighty_80_lcm_drv则对应驱动文件中的lcm_drv
这样的话,lcm_drv= lcm_driver_list[0];就是取得驱动文件中的lcm_drv
如果为大于一个lcm驱动,首先是for循环,依次遍历lcm_driver_list这个数组:lcm_drv=lcm_driver_list[i],遍历取得各个lcm驱动的lcm_drv
之后会做判断if(lcm_drv->compare_id() != 0)
这个函数会调用到lk中lcm ic 驱动文件的compare_id函数,返回lcd的id,如果id存在,就会break跳出遍历,告诉系统使用当前这个lcm,这样的话遍历的目的就是取得机器上当前所使用的lcm的各种信息
之后会将这个lcm的各类信息传递给kernel…………这里 disp_lcm_probe就执行完
–>然后执行到primary_display_init(vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6739/primary_display.c)
–> 执行pgc->plcm= disp_lcm_probe,将当前使用的lcm驱动模型赋值给pgc->plcm
–> 之后执行ret = disp_lcm_init(pgc->plcm)就是调用到这个lcm驱动文件中的各个函数,进行初始化,load参数等等。到这里就把lcm lk加载流程串通了。
KERNEL阶段:
驱动入口函数:mtkfb_init(kernel-4.4/drivers/misc/mediatek/video/mt6739/videox/mtkfb.c)–> 执行mtkfb_driver的mtkfb_probe
–> 执行_parse_tag_videolfb(mtkfb.c) --> primary_display_init(kernel-4.4/drivers/misc/mediatek/video/mt6739/videox/primary_display.c)
–> mtkfb_find_lcm_driver(mtkfb.c)
–> mtkfb_fbinfo_init(mtkfb.c)初始化fbi
–>disp_lcm_probe():
check_lcm_node_from_DT() == 0 读取dts节点信息?
if (_lcm_count() == 0) 得到lcm的数量,如果为0返回NULL,如果为1,则
lcm_drv = lcm_driver_list[0]; if (plcm_name == NULL) 读取lcm_driver_list这个数组的第一个元素,isLCMFound = true;isLCMInited = false;
if (strcmp(lcm_drv->name, plcm_name):比较lcm_drv->name和 plcm_name,如果kernel lcm name和lk lcm name不同,return NULL;
lcm_driver_list数组从mt65xx_lcm_list.c(kernel-4.4/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c)中extern过来的
这个数组中在添加lcm驱动的时候添加了各个驱动的lcm_drv
执行lcm_drv = lcm_driver_list[i]遍历取得各个lcm驱动的lcm_drv, if (!strcmp(lcm_drv->name, plcm_name))如果kernel lcm name和lk lcm name一致,
isLCMFound = true;isLCMInited = true;lcmindex = i; 然后break 跳出遍历。去执行相应lcm ic驱动的函数。