高通默认的LCM 兼容做法是通过ADC实现的。
相关代码:
bootable/bootloader/lk/target/M9PLUS/oem_panel.c
函数oem_panel_select中:
    pm8x41_enable_mpp_as_adc(LCM_MPP_ID -1);
    lcd_id_v = pm8x41_adc_channel_read(VADC_LCD_ID);
这种LCM兼容方式的代码设计比较简单,很容易实现LCM兼容,但是存在一些局限,首先需要硬件和平台上的支
持,还有就是,其可兼容的LCM数量很有限。
下面说说另一种识别LCM的方式,即通过MIPI通信读LCM ID。
首先看一下高通平台上LK部分LCM驱动的初始化流程。LK部分的LCM驱动比较关键,它不仅仅要负责开机过程的
显示任务,还要传参给kernel的LCM驱动,指导kernel选择对应的LCM参数。
整个流程里面,要做LCM兼容,我们主要关注这两个函数:oem_panel_select()和mdss_dsi_panel_initialize()。
另外还要添加一个读LCM ID的函数mdss_dsi_read_panel_id(),该函数由mdss_dsi_panel_initialize()调用。
以屏otm8018b和st7701做兼容为例。
oem_panel_select()函数在android/bootloader/lk/target/$pro/oem_panel.c文件中,里面加入代码:
    if(0xffff == lk_lcd_id || OTM8018B_MANUFACTURER_ID == lk_lcd_id) {
        dprintf(CRITICAL, " **otm8018b**\n");
        panel_id = OTM8018B_BONA_SD_VIDEO_PANEL;
    }else if(ST7701_MANUFACTURER_ID == lk_lcd_id){
        dprintf(CRITICAL, " **st7710**\n");
        panel_id = ST7701_BONA_SD_VIDEO_PANEL;
    }
lk_lcd_id变量是全局变量,在oem_panel.c中定义:
     uint32_t lk_lcd_id = 0xffff;
mdss_dsi_panel_initialize()函数在bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c中定义,代码添加如下:
int mdss_dsi_panel_initialize(struct mipi_dsi_panel_config *pinfo, uint32_t
                broadcast)
{
        int status = 0;
#if (DISPLAY_TYPE_MDSS == 1)
/*add by raindi begin */
    if(0xffff == lk_lcd_id) {
        lk_lcd_id = mdss_dsi_read_panel_id();
        /*otm8018b is default selected in func oem_panel_select().       */
        /*if return 1 ,it will reselect panel by new lk_lcd_id in func oem_panel_select().   */
        if(OTM8018B_MANUFACTURER_ID != lk_lcd_id)
            return 1;
    }
/*add by raindi end */
        if (pinfo->panel_cmds) {
                if (broadcast) {
status = mdss_dual_dsi_cmds_tx(pinfo->panel_cmds,
pinfo->num_of_panel_cmds);
} else {
status = mipi_dsi_cmds_tx(pinfo->panel_cmds,
pinfo->num_of_panel_cmds);
if (!status && target_panel_auto_detect_enabled())
status =
mdss_dsi_read_panel_signature(pinfo->signature);
}
}
#endif
return status;
}
在文件mipi_dsi.c中添加读LCM ID的函数mdss_dsi_read_panel_id()。
/*add by raindi begin*/
extern uint32_t lk_lcd_id;
static char panel_manufacture_id[] = {0xDA, 0x00, 0x06, 0xA0};
static struct mipi_dsi_cmd panel_manufacture_id_cmd[] = {
{sizeof(panel_manufacture_id), panel_manufacture_id},};
static uint32_t mdss_dsi_read_panel_id(void)
{
    char rec_buf[24];
    char *rp = rec_buf;
    uint32_t *lp,ret,data= 0;
    ret = mipi_dsi_cmds_tx(panel_manufacture_id_cmd, ARRAY_SIZE(panel_manufacture_id_cmd));
    //mdelay(5);
    ret = mipi_dsi_cmds_rx(&rp, 3);
    if(ret < 0) {
        dprintf(CRITICAL,"mipi read panel id faild\n");
    }
    lp = (uint32_t *)rp;
    data = (uint32_t)*lp;
    dprintf(CRITICAL, "[PHC]: panel ID: 0x%x\n", data);
    return data;
}
/*add by raindi end*/
整个兼容方法的思路是,在LCM进行第一遍初始化的时候,使用默认的LCM参数进行初始化,但进行到mipi_dsi.c文件
中的mdss_dsi_panel_initialize()函数的时候,读取当前使用的LCM IC 的ID,如果和默认的屏幕ID一样,则不进行第二
次初始化,若不一样,则重新初始化,这个时候全局变量lk_lcd_id已经被赋值,当第二遍初始化到了oem_panel.c文件
的oem_panel_select()函数中,函数根据lk_lcd_id的值来匹配正确的屏幕变量。匹配完成之后继续未完成的屏幕初始化,
至此整个流程走完,屏幕点亮!
有一个要注意的地方是,当需要第二次初始化时,也就是重新执行函数:
void target_display_init(const char *panel_name)
{
        uint32_t panel_loop = 0;
        uint32_t ret = 0;
        do {
                ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR);
                if (!ret || ret == ERR_NOT_SUPPORTED) {
                        break;
                } else {
                        target_force_cont_splash_disable(true);
                        msm_display_off();
                        target_force_cont_splash_disable(false);
                }
        } while (++panel_loop <= oem_panel_max_auto_detect_panels());
}
我们要确保oem_panel_max_auto_detect_panels()的返回值大于或等于2,否则系统无法进行第二次初始化工作,导致
开机过程屏幕不能正常显示。

高通平台MSM8916 LCM ID读取方法相关推荐

  1. 高通平台GPIO漏电问题分析方法

    在Android智能手机项目开发过程中,我们经常会遇到GPIO漏电导致系统底电流偏高.故总结一下: 1.首先建议HW将怀疑漏电的GPIO与外围电路彻底断开 2.如果依然漏电,使用命令检查GPIO状态: ...

  2. 高通平台msm8916修改开机logo【原创】

    经过两天的奋战终于把开机logo给搞定了啊. 首先修改开机logo要从哪里入手呢?先分析一下源码看看. ---> 1 void display_image_on_screen() 2 { 3 s ...

  3. 高通平台lcm 总结

    以下几幅图是最近的一段时间对自己模块LCM的一些总结,目前只是完成了一部分,而且描述的不是特别到位,后期会不断更新和修改的. 第一幅是LCM的总体移植框架和组件图.介绍了LCM驱动的分部和调试屏的步骤 ...

  4. 高通平台modem部分mbn文件的OTA和PDC升级方法

    高通平台modem部分mbn文件的OTA和PDC升级方法 最近需要采用一种移动物联网卡,发现在apns-conf.xml增加了对应apn信息后,部分设备采用新的xml就可以支持新卡,但部分设备还不行, ...

  5. 高通平台 lcd driver 调试小结

    一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2  开发环境 And ...

  6. 高通平台android开发总结

    http://www.cnblogs.com/yuzaipiaofei/archive/2012/07/24/4124179.html 1.高通平台android开发总结 1.1 搭建高通平台环境开发 ...

  7. 高通平台android 环境配置编译及开发经验总结

    完全转自:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...

  8. 高通平台android开发总结 .

    http://blog.csdn.net/mirkerson/article/details/7691029 http://blog.csdn.net/mirkerson/article/detail ...

  9. 高通平台android 环境配置编译及开发经验总结【转】

    1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...

最新文章

  1. 边工作边刷题:70天一遍leetcode: day 97-1
  2. parse() got an unexpected keyword argument 'transport_encoding'
  3. Linux系统下GNU Wget 命令用法详解及其参数说明
  4. 使用AndroidStudio创建自定义gradle插件并被引用实战例子
  5. 五大常用经典算法—回溯算法
  6. 重磅!微软发布 Visual Studio Online:Web 版 VS Code + 云开发环境
  7. uni-app使用前的调研和开发心得
  8. 机器学习的练功方式(五)——模型选择及调优
  9. 海量数据库的查询优化及分页算法方案(3)--改善SQL语句[转]
  10. 开发软件快捷键(持续更新中)
  11. 《LaTeX写作》——LaTeX编写环境的安装笔记
  12. 易语言怎么判断文件是否一样_怎么判断自己是否怀孕?
  13. ubuntu 下 升级 nginx
  14. html如何做滑动门效果,JS+CSS实现简易的滑动门效果代码
  15. 微信小程序弹出框样式
  16. (转载)CruiseControl配置介绍
  17. python制作u盘病毒_只需十行代码,人人都可以用python实现USB病毒
  18. 常用端口号与对应的服务
  19. 微信小程序input输入框屏蔽非法字符
  20. 英特尔的新硬件套装使制作机器人和无人机更加简单

热门文章

  1. Git 详细教程之一: Git 简介及其基本工作原理
  2. 办公自动化(OA),你真的了解吗?
  3. 西澳计算机专业世界排名,2015年西澳大学全球大学综合排名
  4. Silverlight实用窍门系列:58.Silverlight中的Binding使用(三)-数据集合绑定
  5. 北大操作系统陈向群第八章知识点
  6. CodeBlocks安装与使用入门
  7. 2018/3/6 工作日志
  8. ArcGIS绘制全国数据图步骤及注意事项
  9. 一个企业固定资产折旧案例
  10. 从一亿个数中找出最大的一万个数或最小的一万个数