大家好,欢迎来到IT知识分享网。
1.主题
Tina SDK LCD小分辨率DCLK设置
2.问题背景
产品:带显示屏的产品
硬件:V系列 + DE
软件:Tina SDK
其他:使用小分辨的LCD显示频,根据LCD的时序算出的DLCK小于48MHz
3.具体表现
可以看到希望设置的dlck为10MHz,但lck real dclk为18MHz,导致后续的帧率显示异常
[ 0.] disp 0, clk: pll(),clk(),dclk() dsi_rate() [ 0.] clk real:pll(),clk(),dclk() dsi_rate()
查看信息:
root@(none):/sys/devices/virtual/disp/disp/attr# cat sys screen 0: de_rate hz, ref_fps:50 mgr0: 272x480 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] dmabuf: cache[0] cache max[0] umap skip[0] overflow[0] lcd output backlight(255) fps:90.9 272x 480 err:0 skip:170 irq:22509 vsync:0 vsync_skip:0 BUF enable ch[0] lyr[0] z[2] prem[N] a[pixel 128] fmt[ 77] fb[ 272, 480; 136, 240; 0, 0] crop[ 0, 0, 272, 480] frame[ 0, 0, 272, 480] addr[ 2e0000, 2d0000, 0] flags[0x 0] trd[0,0] BUF enable ch[2] lyr[0] z[16] prem[N] a[pixel 150] fmt[ 0] fb[ 272, 480; 272, 480; 272, 480] crop[ 0, 0, 272, 480] frame[ 0, 0, 272, 480] addr[ 17f800, 0, 0] flags[0x
4.问题分析
当LCD使用小分辨率时,根据LCD需要的时序参数,计算出来的dlck一般会小于48MHz,或者更小,此时客户计算出来的dclk会很小,可能会整除不了24,然后直接设置了dclk,比如设置lcd_dclk_freq = <10>;驱动底层默认的分频系数为4分频,所以理论计算值得到的pll值为40MHz,而真实的LCD的PLL是由24MHz倍频得到,而40MHz,并不是24的倍数,所以此时PLL的频率会向上取,此处计算出来的是72MHz,然后4分频得到的真实的dlck是18MHz,从而使得LCD出现异常。
5.根本原因
小分辨率dts中设置了不能整除24MHz的频率。
6.解决办法
对于小分辨的的LCD设置DCLK的时候,计算出来的dclk的理论值尽量按照以下的频率值的设置:
48MHz 24MHz 12MHz 8MHz 6MHz 4MHz
当设置条件1的dclk时,显示的帧率或者显示还是异常,则就按照计算出来的理论值来设置即可,比如计算出来的dclk的值为10MHz,
则dts中lcd_dclk_freq = <10>;,然后根据启动log来调整分频系数,如下:
[ 0.] disp 0, clk: pll(),clk(),dclk() dsi_rate() [ 0.] clk real:pll(),clk(),dclk() dsi_rate()
从打印可以看到此时的分频系统是4分频:pll/dclk=4,所以想得到接近10MHz的频率此时可以把分频系数改成6或者8, 72/6=12, 72/8=9。
修改分频系数
3.1 kernel(drivers/video/fbdev/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c) static struct lcd_clk_info clk_tbl[] = { {LCD_IF_HV, 6, 1, 1, 0}, /* CPU接口 / {LCD_IF_CPU, 12, 1, 1, 0}, / LVDS接口 / {LCD_IF_LVDS, 7, 1, 1, 0}, #if defined(DSI_VERSION_40) {LCD_IF_DSI, 4, 1, 4, }, #else / mipi接口 / {LCD_IF_DSI, 4, 1, 4, 0}, / 改成8分频 {LCD_IF_DSI, 8, 1, 8, 0}*/ #endif /endif DSI_VERSION_40/ {LCD_IF_VDPO, 4, 1, 1, 0}, }; 3.2 uboot(drivers/video/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c) static struct lcd_clk_info clk_tbl[] = { {LCD_IF_HV, 6, 1, 1, 0}, {LCD_IF_CPU, 12, 1, 1, 0}, {LCD_IF_LVDS, 7, 1, 1, 0}, #if defined(DSI_VERSION_40) {LCD_IF_DSI, 4, 1, 4, }, #else {LCD_IF_DSI, 8, 1, 8, 0}, #endif /*endif DSI_VERSION_40 */ };
原文链接:https://bbs.aw-ol.com/topic/2367/
作者 @ budbool
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/142826.html