Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志V853芯片 Tina SDK LCD小分辨率DCLK设置问题

    其它全志芯片讨论区
    v853 faq 技术支持
    2
    2
    246
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 8 last edited by

      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},
      /* 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, 148500000},
      #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, 150000000},
      #else
      {LCD_IF_DSI, 8, 1, 8, 0},
      #endif /*endif DSI_VERSION_40 */
      };
      
      D 1 Reply Last reply Reply Quote Share 1
      • Referenced by  q1215200171 q1215200171 
      • D
        dream LV 6 @q1215200171 last edited by

        @q1215200171 赞,学习学习。

        1 Reply Last reply Reply Quote Share 0
        • Referenced by  q1215200171 q1215200171 
        • Referenced by  q1215200171 q1215200171 
        • 1 / 1
        • First post
          Last post

        Copyright © 2022 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

        行为准则 | 用户协议 | 隐私权政策