LCM --- LCD Module 简单组成 包含液晶玻璃、Driver IC、LED背光、FPC等
LCD 显示屏常用分辨率: WVGA/FWVGA/QHD/HD720/FHD
LCD 验收规则:
一、LCD软件要求
1. compare_id 必须保证可以正确读取,通过resume 打印信息查看id 读取是否成功与正确, 确认OK后需要删除resume compare_id代码,避免由于频繁resume 读取id导致系统可能发生重启;
2. 整机静电不通过的情况下,软件必须增加esd_check&esd_recover (通用版本IC驱动必须实现, 若不同供应商若无法达到esd, 由其自行解决);
3. LCD 刷新率 控制在50fps-65fps,须通过fps工具(svn->com.edburnette.fps2d_4.apk) 查看实际刷新率数据,特殊情况再行处理,帧率的高低会影响: GPS、闪屏、功耗、射频等,提高或降低LCD帧率, 修改PLL: params->dsi.PLL_CLOCK=202;
4. LCD 代码命名,参考软件架构中的命名方式统一命名,维护以前量产项目也尽量如此处理
打开硬件原理图查看LCD接口部分,了解以下几点
a、给屏供电是用独立的外部2.8V LDO芯片,还是mtk的PMIC输出2.8V。
b、reset引脚和ID引脚的gpio号(兼容多个屏才需要检测ID引脚)。
c、这个lcd屏的mipi接口是多少lane,可查看原理图lcd座子上有几组DATA网络,或者咨询负责硬件设计的人员。
d、建议把供应商提供的屏规格书核对一下,主要查看屏的fpc排线PIN脚和主板原理图中是否能对应上。
————————————————
修改dws文件,统一把preloader、lk、kernel三个地方的都修改了
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/产品名/dct/dct/codegen.dws
vendor/mediatek/proprietary/bootable/bootloader/lk/target/产品名/dct/dct/codegen.dws
kernel-3.18/drivers/misc/mediatek/mach/平台名/产品名/dct/dct/codegen.dws
DCT编辑工具:vendor\mediatek\proprietary\bootable\bootloader\preloader\tools\dct\old_dct\DrvGen.exe
把reset脚、ID脚、外部LDO使能脚配置成默认输出低电平:普通GPIO模式、内部下拉、输出(举例如下)
遇到一些问题的处理方法
1、开机时背光亮了屏幕黑屏:
a、mipi的lane数量有没有配置对、核对硬件原理图
b、核对屏初始化参数是否跟供应商提供的一致,有时候自己改错了
c、测量屏的2.8V供电是否有,复位引脚gpio有没有配置对,必要时用示波器测量时序
d、查看一下开机串口log,有没有屏相关的报错
e、换一块主板或者换个屏试试
f、找负责硬件原理图设计的人员也帮忙看看,实在解决不了再找FAE协助,有可能要修改屏初始化参数
或porch参数
2、开机时花屏:
a、检查一下logo配置是否正确,查看logo原始图片分辨率对不对
b、检查代码中分辨率设置对不对
c、很多时候是需要FAE协助修改屏初始化参数
3、闪屏、白屏、有条纹、竖线、颜色不对等效果问题:
a、先去查看供电、复位时序是否正常
b、有时候需要调整mipi时钟频率(lcm_get_params函数中的PLL_CLOCK)或者porch参数
c、一般是需要FAE协助修改屏初始化参数
d、有时候出现闪屏需要用到屏幕录像来对比分析,命令是adb shell screenrecord /sdcard/record.mp4
————————————————
二、常见效果确认
1. Fliker (闪屏) 是否存在——整屏幕背光闪、边角及灰色界面下闪烁(通过查看主界面、计算器界面等验证)
2. Moire(波纹) 是否存在
2. 色调差异(冷、暖色温)
3. 亮度数据(Lux单位)、对比度数据、色彩数(65K、16K等)
4. 准确记录LCD芯片、玻璃、分辨率、尺寸、模组厂商型号等信息 (svn 目录下对应文档)
三、配置LCM
配置LCM时先要把logo 分辨率指定正确,如: HD分辨率配置为hd720
LCM 命名: 通用代码命名为 Drv芯片_dsi_vdo_common, 客制化代码Drv芯片_dsi_vdo_分辨率_玻璃_KST项目_客户_客户项目
LCM 移植完成后务必确认刷新率即帧率FPS: 要求50fps-65fps, 除非FAE 特别要求,否则不允许超出此范围
LCM 代码分布 在lk和kernel
LK: alps\vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\
Kernel: alps\kernel-3.18\drivers\misc\mediatek\lcm\
四、范例
以gc9503为例,首先,确认模组打样和硬件原理图管脚是否能够对应上,正确后。依据如下步骤:
1.保证当前工程全编译过的前提下(userdebug版本),更改如下内容:
alps\vendor\mediatek\proprietary\bootable\bootloader\lk\project\ magc6735m_65u_1_m0.mk –> CUSTOM_LK_LCM=" nt35523_dsi_vdo_common"(先把之前兼容的屏全部去掉。)
alps\kernel-3.18\arch\arm64\configs\ magc6735m_65u_1_m0_debug_defconfig magc6735m_65u_1_m0_defconfig两个文件更改内容:CONFIG_CUSTOM_KERNEL_LCM="nt35523_dsi_vdo_common" (先把之前兼容的屏全部去掉。)
并核对以下内容:
CONFIG_LCM_HEIGHT="1280"
CONFIG_LCM_WIDTH="720"
CONFIG_MTK_LCM=y
2.alps\vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm在此目录下面单独创建一个nt35532_dsi_vdo_common文件夹,内容可以先参考相类似的屏驱动
alps\vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\ mt65xx_lcm_list.cf增加nt35532_dsi_vdo_common定义,参考别的屏。注意定义要大写。
alps\kernel-3.18\drivers\misc\mediatek\lcm在此目录下面单独创建一个nt35532_dsi_vdo_common文件夹,内容可以先参考相类似的屏驱动,lk和kernel两个驱动文件一样
alps\kernel-3.18\drivers\misc\mediatek\lcm\ mt65xx_lcm_list.c增加nt35532_dsi_vdo_common定义,参考相类似的屏驱动。注意定义要大写。
3.修改驱动文件
a.将模组厂给过来的初始化代码合入lcm_initialization_setting[] = 此函数中,要按照MTK的格式,参考其他屏的配置
b.修改lcm_get_params(LCM_PARAMS *params)
{
........
params->dsi.LANE_NUM = LCM_FOUR_LANE; //4通道
params->dsi.vertical_sync_active = 10;//2
params->dsi.vertical_backporch = 20;//30
params->dsi.vertical_frontporch = 16;//20
params->dsi.horizontal_sync_active = 10;//12
params->dsi.horizontal_backporch = 40;//60
params->dsi.horizontal_frontporch = 30;//60
params->dsi.PLL_CLOCK=200; //clock频率
//esd check配置
params->dsi.esd_check_enable = 1;
params->dsi.customization_esd_check_enable = 1;
params->dsi.lcm_esd_check_table[0].cmd = 0x0A;//9503v做esd-check 分别0A:9C,0B:00,0C:70
params->dsi.lcm_esd_check_table[0].count = 1;
params->dsi.lcm_esd_check_table[0].para_list[0] = 0x9c;
}
对应屏驱动文件中
lcm_compare_id(void){
return 1; //强制返回成功,先不管读ID
……………..
}
c.单独编译lk 和bootimages模块。以上内容保证更改正确,模组厂给的初始化是对应的,一般情况下是可以正常亮的。
如果能正常显示。进入adb shell
输入 # su
# cat /proc/cmdline
能看到加载的是对应的屏驱动。
屏正常显示后如果出现有时屏会闪动。降低时序:lcm_get_params(LCM_PARAMS * params) {
……
params->dsi.PLL_CLOCK=180; //230 改动此内容
以上如果一开机就一直花屏,屏驱动也是跑的对应的驱动,而且此板子之前有兼容其它屏,而且其它屏能够正常显示的。那么这个时候可以考虑找项目换一块屏试试,此情况模组本身的问题概率比较大。
d.正常显示之后,修改读ID部分
对应函数:lcm_compare_id(void)
{
array[0] = 0x00033700;// read id return two byte,version and id
dsi_set_cmdq(array, 1, 1);
read_reg_v2(0xDB, &buffer[0], 1);
read_reg_v2(0xDC, &buffer[1], 1);
device_id = buffer[0]<<8|buffer[1];
return (0x9504 == device_id) ? 1 : 0;
}
此部分可以找屏厂提供。为了方便看打印。将读ID函数重新在lcm_resume(void){
//最前面再次读ID
lcm_compare_id();
……..
}
如果相同IC不同玻璃做兼容:硬件上专门有一个GPIO脚控制,两块屏接在板子上开机 对应的这个脚的电压会不一样,这样才能兼容。
如下图AUX_IN1_LCD_ID这个管脚:
软件上修改参考如下:
static unsigned int lcm_compare_id(void)
{
res = IMM_GetOneChannelValue(AUXADC_LCM_VOLTAGE_CHANNEL,data,&rawdata);
lcm_vol = data[0]*1000+data[1]*10;
........
return ((0x9504 == device_id) && (lcm_vol>200 && lcm_vol<400)) ? 1 : 0;
}
ID电阻对应的电压值:
LCD_ID:
if (lcm_vol > 200 && lcm_vol < 500) //470k
if (lcm_vol > 500 && lcm_vol < 800) //150k
if (lcm_vol > 800 && lcm_vol < 1000) //100k
if (lcm_vol > 1000 && lcm_vol < 1300) //51k
if (lcm_vol < 200)) //NULL
————————————————
关于PLL_CLOCK的计算
1、DSI vdo mode下的数据速率data_rate的大致计算公式为:
(Data rate) = (height + vsa + vbp + vfp) * (width + hsa + hbp + hfp) * total_bit_per_pixel * frame_per_second / total_lane_num
2、DSI cmd mode下的数据速率data_rate的大致计算公式为:
(Data rate) = widthheight1.2* total_bit_per_pixel*frame_per_second/total_lane_num
参数注释:
data_rate : 表示的是数据速率
width,height :屏幕分辨率
VSA VBP VFP :DSI vdo mode的vertical porch配置参数
HSA HBP HFP :DSI vdo mode的horizontal porch配置参数
total_bit_per_pixel :表示的是一个pixel需要用几个bit来表示,比如RGB565的话就是16个bit/RGB888就是24bit
frame_per_second :就是我们通常看到的fps,叫做帧率,表示每秒发送多少个帧,一般是60帧每秒
total_lane_num :表示的是data lane
DSI采用的是双边采样,则clk等于数据速率的一半,也就是说一个clk周期内传送2位,所以你计算出来的值还要除以2,即PLL_CLOCK(clk )= Data rate/2;
————————————————