自学内容网 自学内容网

【Android驱动02】LCM屏幕移植和兼容以及常见问题解决方案

一,lcm 相关概念

1.1) MIPI接口
  一共有三种接口:DBI(也做CPU或MCU接口)、DPI(也叫RGB接口)、DSI.在使用DSI接口时,目前75/77都只支持到2条data lane,加上一条clock lane.使用DPI接口时,根据LCM IC支持的情况,可以选择16bus、18bus传输RGB格式文件。
  
1.2) DSI接口有两种sync 模式
  兼容MIPI DSI协议的外设都支持Command Mode和Video Mode两种操作模式,具体使用哪一种操作模式由具体的外设架构决定,那么这两种操作模式它们有什么区别呢。

Video Mode:
这种操作模式同传统的RGB接口类似,主控制器需要实时的往显示屏上刷新像素数据,因为数据流一般比较大,这种模式只能工作在高速率模式下。这种模式是不需要带有显存的。

Video Mode同样也包含一些简单的命令操作,例如屏的初始化、屏的打开、关闭等等,这个时候是工作在低速模式下的。

Video Mode主要又有三种模式:

  1. Non-burst Mode Sync pulses
  2. Non-burst Mode Sync event
  3. Burst mode

Command Mode:
MIPI主控制器通过命令集往显示器发送像素数据流,所以这种模式必须要有一个显存(frame buffer)用来存储像素数据。

1.3)HS/LP
  HS:high speed , clock切为HS模式,高速模式。
  LP:low power,低电平
  LCM在开机的时候,使用LP下发init code,
continuous clock/no-continuous clock模式

二,LCM时钟配置

2.1.MIPI接口的PLL计算
MT6582 LCM Driver中配置:params->dsi.PLL_CLOCK = 234;
DSI vdo mode下的数据速率data_rate的计算公式为:

Data rate= (width+VSA+VBP+VFP)*(height+HSA+HBP+HFP)* total_bit_per_pixel*frame_per_second/total_lane_num

2.2.DSI cmd mode下的数据速率data_rate的计算公式为:

Data rate= width*height*1.2* total_bit_per_pixel*frame_per_second/total_lane_num

2.3.参数注释:
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
frame_per_second :就是我们通常看到的fps,叫做帧率,表示每秒发送多少个帧,一般是60帧每秒
total_lane_num :表示的是data lane的对数。

2.4.DSI采用的是双边采样,则clk等于数据速率的一半,因此: clk=data_rate/2

2.5.在lcm porting过程中,这些参数都定义在lcm_drv.h文件中的LCM_DSI_PARAMS结构体中,随着平台的发展,或许有所不同,但是基本原理都是一致的,如何配置clk的大小,请先根据自己的帧率、像素格式、porch值、屏的分辨率、data lane对数等计算出data_rate,然后计算出clk。

三,LCM驱动移植步骤

3.1 配置LCM的相关尺寸, ProjectConfig.mk中配置
alps/device/mediateksample/k62v1_64_bsp/ProjectConfig.mk

BOOT_LOGO = hd720

LCM_HEIGHT = 1440

LCM_WIDTH = 720

3.2 cfg文件配置LCM的尺寸与编译LCD模块名称
alps/kernel-4.9/arch/arm64/configs/k62v1_64_bsp_defconfig

CONFIG_CUSTOM_KERNEL_LCM="ili9881c_hdp_dsi_vdo_ilitek_rt5081"

CONFIG_LCM_HEIGHT="1440"

CONFIG_LCM_WIDTH="720"

3.3 配置 bootloader的logo大小与编译LCD模块名称
alps/vendor/mediatek/proprietary/bootable/bootloader/lk/project/k62v1_64_bsp.mk
那么相应的开机logo也要做相应的修改:

CUSTOM_LK_LCM="ili9881c_hdp_dsi_vdo_ilitek_rt5081"

BOOT_LOGO := hd720

修改分辨率 lcm_width lcm_height 还要修改对应的logo
logo 所在文件夹 /vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo
查看文件夹内图片的分辨率即可知道要改什么logo

3.4 修改mt65xx_lcm_list.c
那么先在mediatek/custom/common/kernel/lcm目录中创建一个目录ili9881c_hdp_dsi_vdo_ilitek_rt5081(注意,目录的名字要和ProjectConfig.mk中的lcm配置相对应),然后在该目录下创建一个文件ili9881c_hdp_dsi_vdo_ilitek_rt5081.c,至于这个文件里面应该填些什么内容,我们稍后来看。

然后修改mt65xx_lcm_list.c,依照已有的格式在lcm_driver_list这个数组里面添加下面的内容:

#if defined(HX8389B_QHD_DSI_VDO)  
    &ili9881c_hdp_dsi_vdo_ilitek_rt5081_drv,  
#endif 

3.5 编写ili9881c_hdp_dsi_vdo_ilitek_rt5081.c
kernel驱动文件ili9881c_hdp_dsi_vdo_ilitek_rt5081添加,将文件夹丢进kernel的alps/kernel-4.9/drivers/misc/mediatek/lcm/目录下;
alps/kernel-4.9/drivers/misc/mediatek/lcm/ili9881c_hdp_dsi_vdo_ilitek_rt5081/ili9881c_hdp_dsi_vdo_ilitek_rt5081.c
根据前面步骤可以看到,肯定需要一个hx8389b_qhd_dsi_vdo_drv这个结构,它的类型是LCM_DRIVER,来看一下应该怎么定义:

    LCM_DRIVER ili9881c_hdp_dsi_vdo_ilitek_rt5081_drv = {  
        .name       = "ili9881c_hdp_dsi_vdo_ilitek_rt5081",  
        .set_util_funcs = lcm_set_util_funcs,  
        .get_params = lcm_get_params,  
        .init       = lcm_init,  
        .suspend    = lcm_suspend,  
        .resume     = lcm_resume,  
        .compare_id = lcm_compare_id,  
    };  

再来看lcm_get_params。
lcm_get_params函数中主要是一些参数定义,例如屏的分辨率,屏的接口类型等等:

    #define FRAME_WIDTH 540  
    #define FRAME_HEIGHT    960  
      
    static void lcm_get_params(LCM_PARAMS *params)  
    {  
        memset(params, 0, sizeof(LCM_PARAMS));  
          
        params->type             = LCM_TYPE_DSI;         /* lcm的接口类型 */  
        params->width                = FRAME_WIDTH;          /* lcm分辨率 */  
        params->height               = FRAME_HEIGHT;  
          
        params->dsi.mode         = SYNC_PULSE_VDO_MODE;      /* video mode */  
          
        params->dsi.LANE_NUM         = LCM_THREE_LANE;       /* lanes */  
        params->dsi.data_format.format       = LCM_DSI_FORMAT_RGB888;    /* 数据格式 */  
          
        params->dsi.PS               = LCM_PACKED_PS_24BIT_RGB888;  
          
        params->dsi.vertical_sync_active = 0x02;             /* video mode需要配置的一些参数 */  
        params->dsi.vertical_backporch       = 0x0e;  
        params->dsi.vertical_frontporch      = 0x09;  
        params->dsi.vertical_active_line = FRAME_HEIGHT;  
          
        params->dsi.horizontal_sync_active   = 0x21;  
        params->dsi.horizontal_backporch = 0x21;  
        params->dsi.horizontal_frontporch    = 0x15;  
        params->dsi.horizontal_active_pixel  = FRAME_WIDTH;  
          
        params->dsi.PLL_CLOCK            = 180;              /* clock(MHz) */  
    }  

这个是lcm的配置部分,调试驱动必然要改的地方。
MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口)、DPI(也叫RGB接口)、DSI.
在使用DSI接口时,目前6735支持到4条data lane,加上一条clock lane.我们采用的是DSI的

params->dsi.vertical_sync_active = 4;
params->dsi.vertical_backporch = 40;
params->dsi.vertical_frontporch = 40;

params->dsi.horizontal_sync_active = 4;
params->dsi.horizontal_backporch = 82;
params->dsi.horizontal_frontporch = 82;

这几个数据要看datasheet,才可以,调试的关键地方。
在这里插入图片描述

上面时序图上各时钟延时参数的含义如下:(这些参数的值,LCD产生厂商会提供相应的数据手册)

VBPD(vertical back porch): 表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的upper_margin;

VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的lower_margin;
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;
HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间VCLK的个数,对应驱动中的left_margin;
HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,对应驱动中的right_margin;
HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len;

params->dsi.PLL_CLOCK = 240; lcm的频率,更据实际情况改动,这个一般mtk的都会影响gps的信号强弱。

再来看lcm_init:

    #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))  
      
    #define UDELAY(n) (lcm_util.udelay(n))  
    #define MDELAY(n) (lcm_util.mdelay(n))  
      
    #define dsi_set_cmdq_V3(para_tbl, size, force_update)       lcm_util.dsi_set_cmdq_V3(para_tbl, size, force_update)  
    #define dsi_set_cmdq_V2(cmd, count ppara, force_update)     lcm_util.dsi_set_cmdq_V2(cmd, count, ppare, force_update)  
    #define dsi_set_cmdq(pdata, queue_size, force_update)       lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)  
    #define write_cmd(cmd)                      lcm_util.dsi_write_cmd(cmd)  
    #define write_regs(addr, pdata, byte_nums)          lcm_util.dsi_write_regs(addr, pdata, bytes_nums)  
    #define read_reg(cmd)                       lcm_util.dsi_dcs_read_lcm_reg(cmd)  
    #define read_reg_v2(cmd, buffer, buffer_size)           lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)  
      
    static LCM_setting_table_V3 lcm_initialization_setting[] = {  
        {0x39, 0xF0, 5, {0x55, 0xAA, 0x52, 0x08, 0x03}},  
        {0x39, 0x90, 9, {0x05, 0x14, 0x05, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00}},  
        {0x39, 0x91, 9, {0x05, 0x14, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00}},  
        {0x39, 0x92, 11, {0x40, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x54, 0x00, 0x00, 0x05, 0x08}},  
        {0x39, 0x94, 8, {0x00, 0x08, 0x05, 0x03, 0xCE, 0x03, 0xD0, 0x0C}},  
        {0x39, 0x95, 16, {0x40, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x54, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08}},  
        {0x39, 0x99, 2, {0x00, 0x00}},  
        {0x39, 0x9A, 11, {0x80, 0x0D, 0x03, 0xD2, 0x03, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x50}},  
        {0x39, 0x9B, 6, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},  
        {0x39, 0x9C, 2, {0x00, 0x00}},  
        {0x39, 0x9D, 8, {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}},  
        {0x39, 0x9E, 2, {0x00, 0x00}},  
        {0x39, 0xA0, 10, {0x95, 0x14, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0B, 0x1F}},  
        {0x39, 0xA1, 10, {0x1F, 0x1F, 0x09, 0x1F, 0x1F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F}},  
        {0x39, 0xA2, 10, {0x0D, 0x1F, 0x01, 0x1F, 0x03, 0x1F, 0x1F, 0x1F, 0x05, 0x1F}},  
        {0x39, 0xA3, 10, {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F}},  
        {0x39, 0xA4, 10, {0x1F, 0x04, 0x1F, 0x1F, 0x1F, 0x02, 0x1F, 0x00, 0x1F, 0x0C}},  
        {0x39, 0xA5, 10, {0x1F, 0x1F, 0x1F, 0x0E, 0x1F, 0x1F, 0x1F, 0x08, 0x1F, 0x1F}},  
        {0x39, 0xA6, 10, {0x1F, 0x0A, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x14, 0x15}},  
        {0x39, 0xA7, 10, {0x14, 0x15, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0C, 0x1F}},  
        {0x39, 0xA8, 10, {0x1F, 0x1F, 0x0E, 0x1F, 0x1F, 0x1F, 0x08, 0x1F, 0x1F, 0x1F}},  
        {0x39, 0xA9, 10, {0x0A, 0x1F, 0x02, 0x1F, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x04}},  
        {0x39, 0xAA, 10, {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F}},  
        {0x39, 0xAB, 10, {0x1F, 0x05, 0x1F, 0x1F, 0x1F, 0x01, 0x1F, 0x03, 0x1F, 0x0B}},  
        {0x39, 0xAC, 10, {0x1F, 0x1F, 0x1F, 0x09, 0x1F, 0x1F, 0x1F, 0x0F, 0x1F, 0x1F}},  
        {0x39, 0xAD, 10, {0x1F, 0x0D, 0x1F, 0x1F, 0x1F, 0x02, 0x1F, 0x1F, 0x15, 0x14}},  
        {0x39, 0xF0, 5, {0x55, 0xAA, 0x52, 0x08, 0x00}},  
        {0x15, 0xFC, 1, {0x00}},  
        {0x39, 0xBC, 3, {0x00, 0x00, 0x00}},  
        {0x39, 0xB8, 4, {0x01, 0x8F, 0xBF, 0x80}},  
        {0x39, 0xF0, 5, {0x55, 0xAA, 0x52, 0x08, 0x01}},  
        {0x39, 0xD1, 16, {0x00, 0x17, 0x00, 0x58, 0x00, 0x8D, 0x00, 0xB0, 0x00, 0xCA, 0x00, 0xF2, 0x01, 0x12, 0x01, 0x45}},  
        {0x39, 0xD2, 16, {0x01, 0x6D, 0x01, 0xAC, 0x01, 0xDD, 0x02, 0x29, 0x02, 0x67, 0x02, 0x69, 0x02, 0xA3, 0x02, 0xE0}},  
        {0x39, 0xD3, 16, {0x03, 0x05, 0x03, 0x34, 0x03, 0x53, 0x03, 0x7C, 0x03, 0x94, 0x03, 0xB7, 0x03, 0xC9, 0x03, 0xD9}},  
        {0x39, 0xD4, 4, {0x03, 0xEE, 0x03, 0xFF}},  
        {0x39, 0xD5, 16, {0x00, 0x17, 0x00, 0x58, 0x00, 0x8D, 0x00, 0xB0, 0x00, 0xCA, 0x00, 0xF2, 0x01, 0x12, 0x01, 0x45}},  
        {0x39, 0xD6, 16, {0x01, 0x6D, 0x01, 0xAC, 0x01, 0xDD, 0x02, 0x29, 0x02, 0x67, 0x02, 0x69, 0x02, 0xA3, 0x02, 0xE0}},  
        {0x39, 0xD7, 16, {0x03, 0x05, 0x03, 0x34, 0x03, 0x53, 0x03, 0x7C, 0x03, 0x94, 0x03, 0xB7, 0x03, 0xC9, 0x03, 0xD9}},  
        {0x39, 0xD8, 4, {0x03, 0xEE, 0x03, 0xFF}},  
        {0x39, 0xD9, 16, {0x00, 0x17, 0x00, 0x58, 0x00, 0x8D, 0x00, 0xB0, 0x00, 0xCA, 0x00, 0xF2, 0x01, 0x12, 0x01, 0x45}},  
        {0x39, 0xDD, 16, {0x01, 0x6D, 0x01, 0xAC, 0x01, 0xDD, 0x02, 0x29, 0x02, 0x67, 0x02, 0x69, 0x02, 0xA3, 0x02, 0xE0}},  
        {0x39, 0xDE, 16, {0x03, 0x05, 0x03, 0x34, 0x03, 0x53, 0x03, 0x7C, 0x03, 0x94, 0x03, 0xB7, 0x03, 0xC9, 0x03, 0xD9}},  
        {0x39, 0xDF, 4, {0x03, 0xEE, 0x03, 0xFF}},  
        {0x39, 0xE0, 16, {0x00, 0x17, 0x00, 0x58, 0x00, 0x8D, 0x00, 0xB0, 0x00, 0xCA, 0x00, 0xF2, 0x01, 0x12, 0x01, 0x45}},  
        {0x39, 0xE1, 16, {0x01, 0x6D, 0x01, 0xAC, 0x01, 0xDD, 0x02, 0x29, 0x02, 0x67, 0x02, 0x69, 0x02, 0xA3, 0x02, 0xE0}},  
        {0x39, 0xE2, 16, {0x03, 0x05, 0x03, 0x34, 0x03, 0x53, 0x03, 0x7C, 0x03, 0x94, 0x03, 0xB7, 0x03, 0xC9, 0x03, 0xD9}},  
        {0x39, 0xE3, 4, {0x03, 0xEE, 0x03, 0xFF}},  
        {0x39, 0xE4, 16, {0x00, 0x17, 0x00, 0x58, 0x00, 0x8D, 0x00, 0xB0, 0x00, 0xCA, 0x00, 0xF2, 0x01, 0x12, 0x01, 0x45}},  
        {0x39, 0xE5, 16, {0x01, 0x6D, 0x01, 0xAC, 0x01, 0xDD, 0x02, 0x29, 0x02, 0x67, 0x02, 0x69, 0x02, 0xA3, 0x02, 0xE0}},  
        {0x39, 0xE6, 16, {0x03, 0x05, 0x03, 0x34, 0x03, 0x53, 0x03, 0x7C, 0x03, 0x94, 0x03, 0xB7, 0x03, 0xC9, 0x03, 0xD9}},  
        {0x39, 0xE7, 4, {0x03, 0xEE, 0x03, 0xFF}},  
        {0x39, 0xE8, 16, {0x00, 0x17, 0x00, 0x58, 0x00, 0x8D, 0x00, 0xB0, 0x00, 0xCA, 0x00, 0xF2, 0x01, 0x12, 0x01, 0x45}},  
        {0x39, 0xE9, 16, {0x01, 0x6D, 0x01, 0xAC, 0x01, 0xDD, 0x02, 0x29, 0x02, 0x67, 0x02, 0x69, 0x02, 0xA3, 0x02, 0xE0}},  
        {0x39, 0xEA, 16, {0x03, 0x05, 0x03, 0x34, 0x03, 0x53, 0x03, 0x7C, 0x03, 0x94, 0x03, 0xB7, 0x03, 0xC9, 0x03, 0xD9}},  
        {0x39, 0xEB, 4, {0x03, 0xEE, 0x03, 0xFF}},  
        {0x39, 0xB0, 3, {0x05, 0x05, 0x05}},  
        {0x39, 0xB1, 3, {0x05, 0x05, 0x05}},  
        {0x39, 0xB6, 3, {0x44, 0x44, 0x44}},  
        {0x39, 0xB7, 3, {0x34, 0x34, 0x34}},  
        {0x39, 0xB3, 3, {0x12, 0x12, 0x12}},  
        {0x39, 0xB9, 3, {0x34, 0x34, 0x34}},  
        {0x39, 0xB4, 3, {0x06, 0x06, 0x06}},  
        {0x39, 0xBA, 3, {0x14, 0x14, 0x14}},  
        {0x39, 0xBC, 3, {0x00, 0x98, 0x00}},  
        {0x39, 0xBD, 3, {0x00, 0x98, 0x00}},  
        {0x15, 0xBE, 1, {0x5A}},//60  
        {0x39, 0xF0, 5, {0x55, 0xAA, 0x52, 0x08, 0x02}},  
        {0x39, 0xF6, 2, {0xCA, 0x69}},  
        {0x39, 0xFB, 3, {0x09, 0x03, 0x08}},  
        {0x39, 0xF1, 3, {0x22, 0x22, 0x32}},  
        {0x15, 0x35, 1, {0x00}},  
      
        {0x05, 0x11,0,{0x00}},  
        {REGFLAG_ESCAPE_ID, REGFLAG_DELAY_MS_V3, 200, {}},  
        {0x05, 0x29,0,{0x00}},  
        {REGFLAG_ESCAPE_ID, REGFLAG_DELAY_MS_V3, 10, {}},  
    };  
      
    static void lcm_init(void)  
    {  
        SET_RESET_PIN(0);  
        MDELAY(20);  
        SET_RESET_PIN(1);  
        MDELAY(120);  
        dsi_set_cmdq_V3(lcm_initialization_setting, sizeof(lcm_initialization_setting)/sizeof(lcm_initialization_setting[0]), 1);  
    }  

要理解这部分代码,需要稍微了解一下mipi dsi协议。
mipi dsi协议中主要有两种packet,long packet和short packet。short packet长度为固定的4个字节,而long packet长度为665541(4+(065535)+2)字节。
short packet格式如下:
在这里插入图片描述

long packet格式如下:
在这里插入图片描述

不管是long packet还是short packet,都有个DATA ID字段,高两位我们先忽略,而低六位为Data Type,mipi dsi协议中有专门定义,这里暂时用到的有:

0x05Short WRITE,无参数
0x15Short WRITE,带一个参数
0x39Long WRITE

详细的Data Type可以参见mipi dsi手册。

我们看在lcm_initialization_setting数组中,第一个值就是这里的Data Type,而第二个值则是hx8389b寄存器的地址,而第三个参数则是参数的个数,而最后才是参数值。

最后来看那个lcm_compare_id函数。
compare_id函数对于lcm驱动来说不是必须的,但最好加上。这个函数主要是用于兼容lcm时,lcm核心会调用该函数来匹配lcm驱动和屏。

    #define LCM_ID_HX8389B 0x89  
      
    static unsigned int lcm_compare_id(void)  
    {  
        unsigned int id = 0;  
        unsigned char buffer[2];  
        unsigned int array[16];  
          
        SET_RESET_PIN(1);  
        SET_RESET_PIN(0);  
        MDELAY(1);  
        SET_RESET_PIN(1);  
        MDELAY(10);  
          
        array[0] = 0x00023700;  
        dsi_set_cmdq(array, 1, 1);  
        MDELAY(10);  
          
        read_reg_v2(0x04, buffer, 2);  
        id = buffer[1];  
          
        return (id == LCM_ID_HX8389B) ? 1 : 0;  
    }  

这里也涉及到了mipi dsi协议:

0x37Set Maximum Return Packet Size

read_reg_v2第一个参数为读寄存器的地址。

3.6 同样操作,将bootloader驱动文件ili9881c_hdp_dsi_vdo_ilitek_rt5081添加,将文件夹丢进bootloader的alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm 下。

四,遇到一些问题的处理方法

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

4、计算DSI数据速率的方式,以及如何配置时钟clk的方式
a、DSI vdo mode下的数据速率data_rate的计算公式为:

Data rate= (width+VSA+VBP+VFP)*(height+HSA+HBP+HFP)* total_bit_per_pixel*frame_per_second/total_lane_num

b、DSI cmd mode下的数据速率data_rate的计算公式为:

Data rate= width*height*1.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
frame_per_second :就是我们通常看到的fps,叫做帧率,表示每秒发送多少个帧,一般是60帧每秒
total_lane_num :表示的是data lane的对数。

c、DSI采用的是双边采样,则clk等于数据速率的一半,因此: clk=data_rate/2


原文地址:https://blog.csdn.net/jiangchaobing_2017/article/details/140569804

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!