高通默认的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读取方法相关推荐
- 高通平台GPIO漏电问题分析方法
在Android智能手机项目开发过程中,我们经常会遇到GPIO漏电导致系统底电流偏高.故总结一下: 1.首先建议HW将怀疑漏电的GPIO与外围电路彻底断开 2.如果依然漏电,使用命令检查GPIO状态: ...
- 高通平台msm8916修改开机logo【原创】
经过两天的奋战终于把开机logo给搞定了啊. 首先修改开机logo要从哪里入手呢?先分析一下源码看看. ---> 1 void display_image_on_screen() 2 { 3 s ...
- 高通平台lcm 总结
以下几幅图是最近的一段时间对自己模块LCM的一些总结,目前只是完成了一部分,而且描述的不是特别到位,后期会不断更新和修改的. 第一幅是LCM的总体移植框架和组件图.介绍了LCM驱动的分部和调试屏的步骤 ...
- 高通平台modem部分mbn文件的OTA和PDC升级方法
高通平台modem部分mbn文件的OTA和PDC升级方法 最近需要采用一种移动物联网卡,发现在apns-conf.xml增加了对应apn信息后,部分设备采用新的xml就可以支持新卡,但部分设备还不行, ...
- 高通平台 lcd driver 调试小结
一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2 开发环境 And ...
- 高通平台android开发总结
http://www.cnblogs.com/yuzaipiaofei/archive/2012/07/24/4124179.html 1.高通平台android开发总结 1.1 搭建高通平台环境开发 ...
- 高通平台android 环境配置编译及开发经验总结
完全转自:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...
- 高通平台android开发总结 .
http://blog.csdn.net/mirkerson/article/details/7691029 http://blog.csdn.net/mirkerson/article/detail ...
- 高通平台android 环境配置编译及开发经验总结【转】
1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...
最新文章
- 边工作边刷题:70天一遍leetcode: day 97-1
- parse() got an unexpected keyword argument 'transport_encoding'
- Linux系统下GNU Wget 命令用法详解及其参数说明
- 使用AndroidStudio创建自定义gradle插件并被引用实战例子
- 五大常用经典算法—回溯算法
- 重磅!微软发布 Visual Studio Online:Web 版 VS Code + 云开发环境
- uni-app使用前的调研和开发心得
- 机器学习的练功方式(五)——模型选择及调优
- 海量数据库的查询优化及分页算法方案(3)--改善SQL语句[转]
- 开发软件快捷键(持续更新中)
- 《LaTeX写作》——LaTeX编写环境的安装笔记
- 易语言怎么判断文件是否一样_怎么判断自己是否怀孕?
- ubuntu 下 升级 nginx
- html如何做滑动门效果,JS+CSS实现简易的滑动门效果代码
- 微信小程序弹出框样式
- (转载)CruiseControl配置介绍
- python制作u盘病毒_只需十行代码,人人都可以用python实现USB病毒
- 常用端口号与对应的服务
- 微信小程序input输入框屏蔽非法字符
- 英特尔的新硬件套装使制作机器人和无人机更加简单
热门文章
- Git 详细教程之一: Git 简介及其基本工作原理
- 办公自动化(OA),你真的了解吗?
- 西澳计算机专业世界排名,2015年西澳大学全球大学综合排名
- Silverlight实用窍门系列:58.Silverlight中的Binding使用(三)-数据集合绑定
- 北大操作系统陈向群第八章知识点
- CodeBlocks安装与使用入门
- 2018/3/6 工作日志
- ArcGIS绘制全国数据图步骤及注意事项
- 一个企业固定资产折旧案例
- 从一亿个数中找出最大的一万个数或最小的一万个数