全志V853开发板购买链接:https://item.hqchip.com/2500385672.html
“华秋电子X全志在线”硬件设计大赛报名地址:https://www.elecfans.com/project/awol/
1.主题
Tina SDK LCD小分辨率DCLK设置
2.问题背景
产品:带显示屏的产品
硬件:V系列 + DE
软件:Tina SDK
其他:使用小分辨的LCD显示频,根据LCD的时序算出的DLCK小于48MHz
3.具体表现
可以看到希望设置的dlck为10MHz,但lck real dclk为18MHz,导致后续的帧率显示异常
[ 0.186329] disp 0, clk: pll(40000000),clk(40000000),dclk(10000000) dsi_rate(10000000)
[ 0.186329] clk real:pll(72000000),clk(72000000),dclk(18000000) dsi_rate(18000000)
查看信息:
root@(none):/sys/devices/virtual/disp/disp/attr# cat sys
screen 0:
de_rate 300000000 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.186329] disp 0, clk: pll(40000000),clk(40000000),dclk(10000000) dsi_rate(10000000)
[ 0.186329] clk real:pll(72000000),clk(72000000),dclk(18000000) dsi_rate(18000000)
从打印可以看到此时的分频系统是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},
#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, 150000000},
#else
{LCD_IF_DSI, 8, 1, 8, 0},
#endif
};
原文链接:https://bbs.aw-ol.com/topic/2367/
作者 @ budbool