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 代码命名,参考软件架构中的命名方式统一命名,维护以前量产项目也尽量如此处理
二、常见效果确认
1. Fliker (闪屏) 是否存在——整屏幕背光闪、边角及灰色界面下闪烁(通过查看主界面、计算器界面等验证)
2. Moire(波纹) 是否存在
2. 色调差异(冷、暖色温)
3. 亮度数据(Lux单位)、对比度数据、色彩数(65K、16K等)
4. 准确记录LCD芯片、玻璃、分辨率、尺寸、模组厂商型号等信息 (svn 目录下对应文档)
三、配置LCM
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