平台: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 definedlcm = 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 definedlcm = 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;}elsereturn NULL;
}

注意,同LK部分不同的是,LK会给kernel传递一个命令行参数,而这个参数中就有可能包括屏的驱动,例如:

lcm=1-hx8389b_qhd_dsi_vdo

这部分代码其实同LK的差不多,只是参数lcm_name字段就有可能不为空,即在LK中已经找到了合适的屏驱动,kernel中就不用再去匹配了。

mtk lcm驱动加载流程相关推荐

  1. android wifi驱动加载流程

    本文基于android 7.0 海思 Hi3798MV200 平台 WiFi驱动加载流程: 一..进入高级设置,无线设置界面(WifiSettings.java)打开WiFi开关(SwitchBar) ...

  2. linux驱动加载流程分析

    linux驱动加载流程分析 内核是如何加载驱动的,有些是编译到内核里面,有些事编译成ko,让系统自动加载.总的说来,在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动 ...

  3. lcm驱动加载及调用流程-MT6739

    使用mt6739平台4.4内核,按下开机键,液晶开始显示,从而进入LK加载lcm的阶段 LK执行流程: 开机执行vendor/mediatek/proprietary/bootable/bootloa ...

  4. linux Pci字符驱动基本加载流程

    今天有朋友问我linux系统Pci字符驱动加载流程,简单整理了一下,顺便做个记录. 首先说下需要包含的头文件: 一个完整的字符驱动一般包含下面这些头文件: #include <linux/typ ...

  5. camera驱动开机加载流程

    camera驱动 图片不好上传,可以跟着源码去看,MT6735下面的 也可以查看有道云链接:点击打开链接 一.模块加载函数 模块加载函数位于kd_sensorlist.c文件中,kd_sensorli ...

  6. matlab 读取voi文件,VOI虚拟化下的Windows网卡驱动加载方法与流程

    本发明涉及计算机技术领域,特别涉及VOI虚拟化下的Windows网卡驱动加载方法. 背景技术: 在VOI虚拟化方案中,首先需要确保网卡驱动能够提前加载到系统中,才能够实现通过网络来引导操作系统启动.现 ...

  7. Dubbo(十)之配置加载流程

    转载自  Dubbo配置加载流程 Dubbo 中的配置加载流程介绍 此篇文档主要讲在应用启动阶段,Dubbo框架如何将所需要的配置采集起来(包括应用配置.注册中心配置.服务配置等),以完成服务的暴露和 ...

  8. Android 系统(169)---Android 7.0 插卡后APN信息的加载流程

    Android 7.0 插卡后APN信息的加载流程.UI界面编辑APN的流程及Android中APN配置相关的漏洞 终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参 ...

  9. Android SIM卡识别加载流程

    文章目录 总述 代码路径 UICC框架 SIM卡识别加载流程 日志分析举例 总述 本文基于Android N(Android 7) 首先要知道SIM卡一般是挂载在CP侧(MODEM侧)的,由MODEM ...

最新文章

  1. Science | 初步的SARS-CoV-2蛋白酶抑制剂在小鼠中显示功效
  2. 如何到达永生?揭示科学之美
  3. CTF(pwn)-格式化字符串漏洞讲解(二) --攻防世界CGfsb
  4. mock java_JAVA的mock工具mockito简介
  5. [算法]有趣算法合辑[21-30]
  6. 关于Gossip协议的几个问题
  7. 【华为大咖分享】6.华为专家揭秘研发效能提升之道(后附PPT下载地址)
  8. 如何在vim中交换两个打开文件(在拆分中)的位置?
  9. CrystalReports2008 SN
  10. 网络协议(4) 详解 TCPIP 协议
  11. HHL论文及代码理解(Generalizing A Person Retrieval Model Hetero- and Homogeneously ECCV 2018)...
  12. 牛!程序媛一口气拿下BAT、美团、vivo、爱奇艺等公司Offer面经总结
  13. 新手指南:到国外域名注册商注册域名
  14. python程序红绿灯识别_使用python创建红绿灯
  15. 一起用Python做个自动化短视频生成脚本,实现热门视频流水线生产!
  16. Unity3D-粒子光圈
  17. 目标定位算法(二)之基于测距的定位算法
  18. tf24: GANs—生成明星脸
  19. 【事件相机整理】角点检测与跟踪总结
  20. zuk 科学计算机,前沿科技:科普ZUK Z1电量百分比设置教程及在设置中加入快速启动开关教程...

热门文章

  1. 基于豹子捕猎的函数寻优算法
  2. 输入年月日,获得下个月的同一天,如果该天不存在,则顺延一天
  3. 读书笔记--电气图连接线的表示方法
  4. 华为云“链”接元宇宙
  5. 量化分析师的Python日记【Q Quant兵器谱之偏微分方程2】
  6. 如何使用edge给chrome下载官方插件
  7. opentelemetry+python+jaeger链路追踪相关使用备注
  8. 机器学习之分类、回归、标注问题
  9. 达梦数据库DM的知识总结---DCA
  10. 马踏棋盘的问题——贪心算法