数据传输速率Data Rate与LCD显示的关系

调试LCD屏的参数的时候,频率与LCD的显示关系密切,这里的频率是指数据传输速率Data Rate。
数据传输速率需要与60HZ频幕刷新率匹配,数据传输速率不能过大,也不能过小,需要一个准确的值。

Data Rate,即Data Lane上的数据传输速率,在VDO MODE中计算公式如下:
Data Rate = ((height + vsa + vbp + vfp) * (width + hsa + hbp + hfp) * bits_per_pixel * frames_per_second) / data_lanes

例如:
Data Rate = ((960 + 4 + 16 + 16) * (540 + 4 + 40 + 40) * 24 * 60) / 2 = 418798080,即Data Rate约为420MHz

而dsi在clock的上升沿和下降沿都会采集数据,所以在计算clock时应为Data Rate的一半,对应前面的420MHz,那么clock应设置为210MHz(注意在计算clock时,clock * 2应比Data Rate稍大)。
注意:Data Rate 实际是根据LCD屏的特性来进行 (height + vsa + vbp + vfp) * (width + hsa + hbp + hfp) * bits_per_pixel * frames_per_second 参数调节的,设定好之后,用户最好不要随意改变。随意改变,会导致黑屏。

那么在mtk平台上应该如何设置clock的频率呢?有两种方式,一是通过配置3个参数得到(6582 kk平台),二是直接设置clock频率(推荐第二种)。

第一种方式,通过分频倍频计算
params->dsi.pll_div1 = 1;        /* 配置0,1,2,3时对应的div1_real为1,2,4,4 */
params->dsi.pll_div2 = 1;        /* 配置0,1,2,3时对应的div2_real为1,2,4,4 */
params->dsi.fbk_div = 30;        /* 范围是0~63 */
那么输出频率计算公式如下:
(26MHz * (fbk_div + 1) * 2) / (div1_real * div2_real) = (26 * 31 * 2) / (2 * 2) = 403。
那么这种方式实际上计算出来是的Data Rate,即mtk手册上所说的BRPL(Bits Rate Per Lane)。

第二种方式
params->dsi.PLL_CLOCK = 210MHz;

从代码看来,实际上他们最后都是通过设置DSI_PLL_CON0和DSI_PLL_CON2寄存器来实现的。

/* 参考源码 */
static void lcm_get_params(LCM_PARAMS *params)
{
        memset((void*)params, 0, sizeof(LCM_PARAMS));

        params->type   = LCM_TYPE_DSI;

        params->width  = FRAME_WIDTH;
        params->height = FRAME_HEIGHT;

        params->dbi.te_mode                 = LCM_DBI_TE_MODE_DISABLED;
        params->dbi.te_edge_polarity     = LCM_POLARITY_RISING;

        params->dsi.mode                       = SYNC_EVENT_VDO_MODE;//SYNC_PULSE_VDO_MODE;

        // DSI
        /* Command mode setting */
        params->dsi.LANE_NUM                = LCM_FOUR_LANE;   // data_lanes
                
        //The following defined the fomat for data coming from LCD engine.
        params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
        params->dsi.data_format.trans_seq   = LCM_DSI_TRANS_SEQ_MSB_FIRST;
        params->dsi.data_format.padding     = LCM_DSI_PADDING_ON_LSB;
        params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;

        // Highly depends on LCD driver capability.
        // Not support in MT6573
        params->dsi.packet_size = 256;

        // Video mode setting
        params->dsi.intermediat_buffer_num = 2;        

        params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;        // bits_per_pixel
        params->dsi.word_count=1024*3;

        params->dsi.vertical_sync_active     = 1;                         // vsa
        params->dsi.vertical_backporch       = 23;                        // vbp
        params->dsi.vertical_frontporch      = 12;           // vfp
        params->dsi.vertical_active_line     = FRAME_HEIGHT; // height

        params->dsi.horizontal_sync_active   = 10;                        // hsa
        params->dsi.horizontal_backporch     = 160;                        // hbp
        params->dsi.horizontal_frontporch    = 160;          // hfp
        params->dsi.horizontal_active_pixel  = FRAME_WIDTH;  // width

        params->dsi.horizontal_blanking_pixel  = 60;
#if 0
                //第一种方式,通过分频倍频计算:
        params->dsi.pll_div1=1;     // div1=0,1,2,3;div1_real=1,2,4,4
        params->dsi.pll_div2=1;     // div2=0,1,2,3;div1_real=1,2,4,4
        params->dsi.fbk_div =30;     // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)
#else
                //第二种方式:直接设置clock频率
        params->dsi.PLL_CLOCK = 170;
#endif

}

猜你喜欢

转载自blog.csdn.net/m0_37526672/article/details/80320063