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 代码命名,参考软件架构中的命名方式统一命名,维护以前量产项目也尽量如此处理

打开硬件原理图查看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;
————————————————

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值