mtk lcm驱动加载流程 (转载)
平台:mt6582 + Android 4.4
前面就说过,在mtk代码中支持屏是可兼容的,通过调用驱动中的compare_id函数来匹配驱动和屏,这里来细看一下代码。
1. LK部分(mediatek/platform/mt6582/lk/disp_drv.c)
- OOL DISP_DetectDevice(void)
- {
- //LCD_STATUS ret;
- DISP_LOG("shi=>%s, %d\n", __func__, __LINE__);
- lcm_drv = disp_drv_get_lcm_driver(NULL);
- if (NULL == lcm_drv)
- {
- printk("%s, disp_drv_get_lcm_driver() returns NULL\n", __func__);
- return FALSE;
- }
- disp_dump_lcm_parameters(lcm_params);
- return TRUE;
- }
在DISP_DetectDevice函数中调用了disp_drv_get_lcm_driver。
- const LCM_DRIVER *disp_drv_get_lcm_driver(const char *lcm_name)
- {
- LCM_DRIVER *lcm = NULL;
- printk("[LCM Auto Detect], we have %d lcm drivers built in\n", lcm_count);
- printk("[LCM Auto Detect], try to find driver for [%s]\n",
- (lcm_name==NULL)?"unknown":lcm_name);
- if(lcm_count ==1)
- {
- // we need to verify whether the lcm is connected
- // even there is only one lcm type defined
- lcm = lcm_driver_list[0];
- lcm->set_util_funcs(&lcm_utils);
- lcm->get_params(&s_lcm_params);
- u4IndexOfLCMList = 0;
- lcm_params = &s_lcm_params;
- lcm_drv = lcm;
- /*
- disp_drv_init_ctrl_if();
- disp_drv_set_driving_current(lcm_params);
- disp_drv_init_io_pad(lcm_params);
- if(lcm_drv->compare_id)
- {
- if(LCM_TYPE_DSI == lcm_params->type){
- init_dsi(FALSE);
- }
- if(lcm_drv->compare_id() == TRUE)
- {
- printk("[LCM Specified] compare id success\n");
- isLCMFound = TRUE;
- }
- else
- {
- printk("[LCM Specified] compare id fail\n");
- printk("%s, lcm is not connected\n", __func__);
- if(LCM_TYPE_DSI == lcm_params->type)
- DSI_Deinit();
- }
- }
- else
- */
- {
- isLCMFound = TRUE;
- }
- printk("[LCM Specified]\t[%s]\n", (lcm->name==NULL)?"unknown":lcm->name);
- goto done;
- }
- else
- {
- unsigned int i;
- for(i = 0;i < lcm_count;i++)
- {
- lcm_params = &s_lcm_params;
- lcm = lcm_driver_list[i];
- printk("[LCM Auto Detect] [%d] - [%s]\t", i, (lcm->name==NULL)?"unknown":lcm->name);
- lcm->set_util_funcs(&lcm_utils);
- memset((void*)lcm_params, 0, sizeof(LCM_PARAMS));
- lcm->get_params(lcm_params);
- disp_drv_init_ctrl_if();
- disp_drv_set_driving_current(lcm_params);
- disp_drv_init_io_pad(lcm_params);
- if(lcm_name != NULL)
- {
- if(!strcmp(lcm_name,lcm->name))
- {
- printk("\t\t[success]\n");
- isLCMFound = TRUE;
- u4IndexOfLCMList = i;
- lcm_drv = lcm;
- goto done;
- }
- else
- {
- printk("\t\t[fail]\n");
- }
- }
- else
- {
- if(LCM_TYPE_DSI == lcm_params->type){
- init_dsi(FALSE);
- MASKREG32(DSI_BASE + 0x10, 0x2, 0x2);
- }
- if(lcm->compare_id != NULL && lcm->compare_id())
- {
- printk("\t\t[success]\n");
- isLCMFound = TRUE;
- lcm_drv = lcm;
- u4IndexOfLCMList = i;
- goto done;
- }
- else
- {
- lcm_drv = lcm;
- if(LCM_TYPE_DSI == lcm_params->type){
- DSI_Deinit();
- DSI_PHY_clk_switch(false);
- }
- printk("\t\t[fail]\n");
- }
- }
- }
- }
- done:
- if(LCM_TYPE_DSI == lcm_params->type)
- {
- int ret = 0;
- unsigned int data_array[3];
- char buffer[4];
- init_dsi(FALSE);
- MASKREG32(DSI_BASE + 0x10, 0x2, 0x2);
- data_array[0] = 0x00043700;
- DSI_set_cmdq(data_array, 1, 1);
- ret = DSI_dcs_read_lcm_reg_v2(0x0A, &buffer,1);
- if(ret == 0)
- {
- isLCMConnected = 0;
- printk("lcm is not connected\n");
- }
- else
- {
- isLCMConnected = 1;
- printk("lcm is connected\n");
- }
- DSI_Deinit();
- }
- return lcm_drv;
- }
lcm_count变量是通过mt65xx_lcm_list.c中的lcm_driver_list计算得来的,如果在ProjectConfig.mk中只配置了一个屏,那么lcm_count值就为1,否则就不会1。
如果lcm_count值为1,那么直接获取lcm_driver_list这个数组的第一个元素并把它赋值给一个全局变量lcm_drv,调用屏相关的
set_util_funcs和get_params函数,所以如果只有一个屏驱动话,那是很简单的,也不用去匹配,直接拿来用就是了。
如果lcm_count值不为1呢,也就是有多个屏驱动呢,那么来看看是如何匹配的。
首先是for循环,依次遍历lcm_driver_list这个数组,如果lcm_name这个变量不为NULL,那么直接匹配lcm_name和屏驱动
中的name字段是否相同,如果匹配成功,也就找到了相应的屏驱动,但是需要注意的是在LK中,这个变量值是为空的,有
DISP_DetectDevice函数为证,所以说LK中肯定不会走这部分代码。那么是接下来的else部分,在else代码中,首先是判断屏驱动中的
compare_id是否为空,如果不空的话,还会调用compare_id函数来匹配屏和驱动,如果两者都满足,那说明找到了合适的驱动,否则继续循
环。所以匹配屏和驱动还是靠驱动中的compare_id函数来实现的。
注意:这里会有一个问题,如果是多个屏驱动的话,当前面都没有匹配成功的话,将使用最后一个屏驱动,请看代码:
- lcm_drv = lcm;
- if(LCM_TYPE_DSI == lcm_params->type){
- DSI_Deinit();
- DSI_PHY_clk_switch(false);
- }
- printk("\t\t[fail]\n");
2. kernel部分(mediatek/platform/mt6582/kernel/drivers/video/disp_hal.c)
LK部分代码看完了,那么再来看kernel部分。
- const LCM_DRIVER *disphal_get_lcm_driver(const char *lcm_name, unsigned int *lcm_index)
- {
- LCM_DRIVER *lcm = NULL;
- bool isLCMFound = false;
- printk("[LCM Auto Detect], we have %d lcm drivers built in\n", lcm_count);
- printk("[LCM Auto Detect], try to find driver for [%s]\n",
- (lcm_name==NULL)?"unknown":lcm_name);
- if(lcm_count == 1)
- {
- // we need to verify whether the lcm is connected
- // even there is only one lcm type defined
- lcm = lcm_driver_list[0];
- lcm->set_util_funcs(&lcm_utils);
- *lcm_index = 0;
- printk("[LCM Specified]\t[%s]\n", (lcm->name==NULL)?"unknown":lcm->name);
- isLCMFound = true;
- goto done;
- }
- else
- {
- int i;
- for(i = 0;i < lcm_count;i++)
- {
- lcm = lcm_driver_list[i];
- printk("[LCM Auto Detect] [%d] - [%s]\t", i, (lcm->name==NULL)?"unknown":lcm->name);
- lcm->set_util_funcs(&lcm_utils);
- memset((void*)&s_lcm_params, 0, sizeof(LCM_PARAMS));
- lcm->get_params(&s_lcm_params);
- disphal_init_ctrl_if();
- LCD_Set_DrivingCurrent(&s_lcm_params);
- LCD_Init_IO_pad(&s_lcm_params);
- if(lcm_name != NULL)
- {
- if(!strcmp(lcm_name,lcm->name))
- {
- printk("\t\t[success]\n");
- *lcm_index = i;
- isLCMFound = true;
- goto done;
- }
- else
- {
- printk("\t\t[fail]\n");
- }
- }
- else
- {
- if(LCM_TYPE_DSI == lcm_params->type)
- {
- init_dsi(FALSE);
- }
- if(lcm->compare_id != NULL && lcm->compare_id())
- {
- printk("\t\t[success]\n");
- isLCMFound = true;
- *lcm_index = i;
- goto done;
- }
- else
- {
- if(LCM_TYPE_DSI == lcm_params->type)
- DSI_Deinit();
- printk("\t\t[fail]\n");
- }
- }
- }
- }
- done:
- if (isLCMFound)
- {
- memset((void*)&s_lcm_params, 0, sizeof(LCM_PARAMS));
- lcm->get_params(&s_lcm_params);
- return lcm;
- }
- else
- return NULL;
- }
注意,同LK部分不同的是,LK会给kernel传递一个命令行参数,而这个参数中就有可能包括屏的驱动,例如:
lcm=1-hx8389b_qhd_dsi_vdo
这部分代码其实同LK的差不多,只是参数lcm_name字段就有可能不为空,即在LK中已经找到了合适的屏驱动,kernel中就不用再去匹配了。
mtk lcm驱动加载流程 (转载)的更多相关文章
- android源码解析(十七)-->Activity布局加载流程
版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...
- Cocos Creator 资源加载流程剖析【一】——cc.loader与加载管线
这系列文章会对Cocos Creator的资源加载和管理进行深入的剖析.主要包含以下内容: cc.loader与加载管线 Download部分 Load部分 额外流程(MD5 Pipe) 从编辑器到运 ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- Dubbo 配置的加载流程
配置加载流程 在SpringBoot应用启动阶段,Dubbo的读取配置遵循以下原则 Dubbo支持了多层级的配置,按照预先定义的优先级自动实现配置之间的覆盖,最终所有的配置汇总到数据总线URL后,驱动 ...
- angular源码分析:angular的整个加载流程
在前面,我们讲了angular的目录结构.JQLite以及依赖注入的实现,在这一期中我们将重点分析angular的整个框架的加载流程. 一.从源代码的编译顺序开始 下面是我们在目录结构哪一期理出的an ...
- 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转
最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...
- (DT系列四)驱动加载中, 如何取得device tree中的属性
本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属性是如何取得的.一:系统级初始化DT_MACHINE_START 主要是定义"struct m ...
- 【转】(DT系列四)驱动加载中, 如何取得device tree中的属性
原文网址:http://www.cnblogs.com/biglucky/p/4057488.html 本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属 ...
- Android5.1图库Gallery2代码分析数据加载流程
图片数据加载流程. Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->Photo ...
随机推荐
- 13、mysql/触发器
1. mysql mysql基础 1)mysql存储结构: 数据库 -> 表 -> 数据 sql语句 2)管理数据库: 增加: create database 数据库 default ...
- 【转】MYSQL入门学习之三:全文本搜索
转载地址:http://www.2cto.com/database/201212/173873.html 一.理解全文本搜索 www.2cto.com 1.MyISAM支持全文本搜索,而Inn ...
- [团队项目]SCRUM项目6.0 7.0 (新)
6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...
- 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)
阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...
- Linux 文件操作总结
http://blog.163.com/he_junwei/blog/static/19793764620152592737741/ ioctl?? lseek?? 文件是linux中的一个重要概念. ...
- WebForm跨页面传值---内置对象
一.Response Response - 响应请求对象 string path = "Default2.aspx": (1)Response.Redirect(path); -- ...
- WinForm窗体及其控件的自适应
3步骤: 1.在需要自适应的Form中实例化全局变量 AutoSizeFormClass.cs源码在下方 AutoSizeFormClass asc = new AutoSizeFormClass ...
- 十一、Swing
1.Swing常用窗体 (1)JFrame框架窗体 JFrame窗体是一个容器,是Swing程序中各组件的载体. 语法:JFrame jf = new JFrame(title); Container ...
- Bootstrap_基本HTML模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- .Net面試4套
一 1. 面向对象的思想主要包括什么? 答: 继承,多态,封装,类,对象,接口,聚集,聚合,泛化 2. 什么是ASP.net中的用户控件 答: 用户控件就是使用.ascx作为扩展名的文件,其将多种服务 ...