linux系统LCD驱动(三):mtk lcd驱动lcm的加载以及初始化

上一篇博文(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值