上一篇博文(linux系统LCD驱动(二):mtk lcd驱动fb_info初始化)https://blog.csdn.net/Ian22l/article/details/105929192 提到mtkfb_probe除了进行fb_info的初始化外,还进行lcm的初始化以及lcm底层驱动的接口获取。
static int mtkfb_probe(struct platform_device *pdev)
{
......
is_lcm_inited = disp_lcm_get_init_flag();
primary_display_init(mtkfb_find_lcm_driver(), lcd_fps, is_lcm_inited);
......
}
一:获取lcm驱动名称
一般来说,mtk平台的lcm驱动lk启动的时候就已经加载并对lcm初始化一次了,因为在lk启动阶段主要用来显示logo或者充电显示等等。lk初始化完成后,会往内核传递lcm的名字以及初始化状态,disp_lcm_get_init_flag函数就是获取是否lk初始化状态,已经完成lk初始化这里就返回true,否则返回false.这里获取lk初始化状态的原因是因为如果lk进行了初始化,那么内核就不再进行初始化,如果再进行初始化,系统启动的时候就很容易出现白屏。但还是要获取lcm驱动的其他接口,例如supend以及resume.,主要在系统休眠唤醒的时候调用到。
unsigned int disp_lcm_get_init_flag(void)
{
unsigned int lcm_init_flag = 0;
lcm_init_flag = *((unsigned int *)(g_fb_rsv_mem_vbase + LCM_INIT_FLAG_ADDR_OFF));
DISPMSG("Disp LCM init flag: 0x%x!\n", lcm_init_flag);
return (lcm_init_flag == LCM_INIT_READY) ? 1 : 0;
}
mtkfb_find_lcm_driver获取lk传递到内核的参数,当中包含这lcm模块的名字,在内核加载lcd驱动的时候获取该名字。
char *mtkfb_find_lcm_driver(void)
{
_parse_tag_videolfb();
DISPMSG("%s, %s\n", __func__, mtkfb_lcm_name);
return mtkfb_lcm_name;
}
二:内核加载lcm驱动以及初始化
primary_display_init函数会进行很多lcd控制器的一些初始化以及lcm驱动的加载,并且根据is_lcm_inited的状态是否要对lcm进行上电初始化。
int primary_display_init(char *lcm_name, unsigned int lcm_fps,
int is_lcm_inited)
{
......
/* Part1: LCM */
//通过lcm名字去加载lcm底层驱动
pgc->plcm = disp_lcm_probe(lcm_name, LCM_INTERFACE_NOTDEFINED,
is_lcm_inited);
if (unlikely(pgc->plcm == NULL)) {
DISPDBG("disp_lcm_probe returns null\n");
ret = DISP_STATUS_ERROR;
goto done;
} else {
DISPCHECK("disp_lcm_probe SUCCESS\n");
}
.......
/*根据is_lcm_inited判断是否已经lk初始化*/
if (is_lcm_inited) {
//初始化后就什么都不执行
/* ??? why need */
/* no need lcm power on,because lk power on lcm */
/* ret = disp_lcm_init(pgc->plcm, 0); */
} else {
//没有初始化则在内核进行初始化
/* lcm not inited:
* 1. fpga no lk(verify done);
* 2. evb no lk(need verify)
*/
if (use_cmdq) {
/* make sure dsi configuration done before lcm init */
_cmdq_flush_config_handle(1, NULL, 0);
_cmdq_reset_config_handle();
}
/*pgc->plcm是上面disp_lcm_probe根据名字加载到的lcm驱动*/
ret = disp_lcm_init(pgc->plcm, 1);
}
}
三:lcm驱动的加载
从上面看出lcm驱动是通过disp_lcm_probe加载,我们看下它是如何加载到我们想要的lcm驱动的。代码如下
struct disp_lcm_handle *disp_lcm_probe(char *plcm_name,
enum LCM_INTERFACE_ID lcm_id, int is_lcm_inited


1645

被折叠的 条评论
为什么被折叠?



