MTK平台LCM移植与调试

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

  1. 配置LCM时先要把logo 分辨率指定正确,如: HD分辨率配置为hd720
  2. LCM 命名: 通用代码命名为 Drv芯片_dsi_vdo_common, 客制化代码Drv芯片_dsi_vdo_分辨率_玻璃_KST项目_客户_客户项目
  3. LCM 移植完成后务必确认刷新率即帧率FPS: 要求50fps-65fps, 除非FAE 特别要求,否则不允许超出此范围
  4. 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这个管脚:

MTK平台LCM移植与调试_第1张图片

 

软件上修改参考如下:

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

你可能感兴趣的:(lcd调试)