在
调试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;
数据传输速率需要与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 }