整理MTK dsi.PLL_CLOCK配置

本文详细介绍了DSI(Display Serial Interface)在不同模式下数据速率的计算方法,并提供了具体的计算实例。同时,文中还解释了如何根据计算出的数据速率来设置Clock频率。
部署运行你感兴趣的模型镜像

DSI采用的是双边采样,则clk等于数据速率的一半,也就是说一个clk周期内传送2位,所以你计算出来的值还要除以2
根据mtk faq的计算公式,是这样的:

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= width*height*1.2* total_bit_per_pixel*frame_per_second/total_lane_num

每线 clk =  Data rate/2;

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稍大)。

那么在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寄存器来实现的。

参考文档:MT6582_LCM_Porting_Guide_DSI_V1.0.pptx.pdf
	MTK_on_line_FAQ_SW_ALPS_20141031.pdf

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

static unsigned int mtk_dsi_default_rate(struct mtk_dsi *dsi) { u32 data_rate; struct mtk_drm_crtc *mtk_crtc = dsi->is_slave ? dsi->master_dsi->ddp_comp.mtk_crtc : dsi->ddp_comp.mtk_crtc; struct mtk_drm_private *priv = NULL; /** * vm.pixelclock is in kHz, pixel_clock unit is Hz, so multiply by 1000 * htotal_time = htotal * byte_per_pixel / num_lanes * overhead_time = lpx + hs_prepare + hs_zero + hs_trail + hs_exit * mipi_ratio = (htotal_time + overhead_time) / htotal_time * data_rate = pixel_clock * bit_per_pixel * mipi_ratio / num_lanes; */ if (mtk_crtc && mtk_crtc->base.dev) priv = mtk_crtc->base.dev->dev_private; else if (dsi->encoder.dev) priv = dsi->encoder.dev->dev_private; else return 0; if (priv && priv->data && (priv->data->mmsys_id == MMSYS_MT6983 || priv->data->mmsys_id == MMSYS_MT6895 || priv->data->mmsys_id == MMSYS_MT6879 || priv->data->mmsys_id == MMSYS_MT6855 || priv->data->mmsys_id == MMSYS_MT6789) && (dsi->d_rate != 0)) { data_rate = dsi->d_rate; DDPMSG("%s, data rate=%d\n", __func__, data_rate); } else if (priv && mtk_drm_helper_get_opt(priv->helper_opt, MTK_DRM_OPT_DYN_MIPI_CHANGE) && dsi->ext && dsi->ext->params && dsi->ext->params->dyn_fps.data_rate) { data_rate = dsi->ext->params->dyn_fps.data_rate; } else if (dsi->ext && dsi->ext->params->data_rate) { data_rate = dsi->ext->params->data_rate; } else if (dsi->ext && dsi->ext->params->pll_clk) { data_rate = dsi->ext->params->pll_clk * 2; } else { u64 pixel_clock, total_bits; u32 htotal, htotal_bits, bit_per_pixel; u32 overhead_cycles, overhead_bits; struct mtk_panel_spr_params *spr_params = NULL; if (dsi->ext && dsi->ext->params) { spr_params = &dsi->ext->params->spr_params; } switch (dsi->format) { case MIPI_DSI_FMT_RGB565: bit_per_pixel = 16; break; case MIPI_DSI_FMT_RGB666_PACKED: bit_per_pixel = 18; break; case MIPI_DSI_FMT_RGB666: case MIPI_DSI_FMT_RGB888: default: bit_per_pixel = 24; break; } if (spr_params && spr_params->enable == 1 && spr_params->relay == 0 && disp_spr_bypass == 0) { switch (dsi->ext->params->spr_output_mode) { case MTK_PANEL_PACKED_SPR_8_BITS: bit_per_pixel = 16; break; case MTK_PANEL_lOOSELY_SPR_8_BITS: bit_per_pixel = 24; break; case MTK_PANEL_lOOSELY_SPR_10_BITS: bit_per_pixel = 24; break; case MTK_PANEL_PACKED_SPR_12_BITS: bit_per_pixel = 16; break; default: break; } } pixel_clock = dsi->vm.pixelclock * 1000; htotal = dsi->vm.hactive + dsi->vm.hback_porch + dsi->vm.hfront_porch + dsi->vm.hsync_len; htotal_bits = htotal * bit_per_pixel; overhead_cycles = T_LPX + T_HS_PREP + T_HS_ZERO + T_HS_TRAIL + T_HS_EXIT; overhead_bits = overhead_cycles * dsi->lanes * 8; total_bits = htotal_bits + overhead_bits; data_rate = DIV_ROUND_UP_ULL(pixel_clock * total_bits, htotal * dsi->lanes); data_rate /= 1000000; } return data_rate; }//解释每行代码的含义?
最新发布
11-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值