导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案

    其它全志芯片讨论区
    4
    2
    1642
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • newcastle
      newcastle LV 6 最后由 编辑

      在入手全志T113之后,第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常,经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK,但是居然前前后后一共花了至少三个星期的时间。

      这里就不给分析经过了,因为是真的真的太漫长了,搞得我头都大了。真的是要吐槽一下全志的代码:

      1.函数名字真的看得头疼
      2dd89be5404a78d038653cdfbc2ec30ebbc87475.png

      2.代码杂乱无章,大量使用全局变量,让分析各种没头绪。

      然后在这里直接给出最终分析的结果:

      1.设备树里面timing,除了width、height、lcd_x和lcd_y之外的参数全没有用上(一开始不停的源码里面找这些参数在什么地方配置的,最后发现特么的根本就没有地方使用过这些参数)

      01a937d9dd6fb0c1832cbd3f21725aff064128b0.png

      2.width和height主要是用来计算dpi使用的,我这里写的280最终计算出来的dpi大概是97左右,windows标准的是96,反正相差无几我也没有细调了,lcd_x和lcd_y在原来的代码里主要是用来计算内核里面有一张图片的缩放使用的。

      3.lcd timing寄存器里面的值是在uboot里面设置好之后在kernel里面直接拿来用的。

      4.uboot里面的timing计算方式有问题,应该是百问没有仔细阅读全志文档的原因造成的,这也是使得屏幕显示向左平移了几十个像素的原因
      a3def1e10fca39cd096f892dcd09370f3b375f52.png

      5.我忘记我要说什么了…

      接下来就说怎么处理吧:

      1.首先按照全志的文档把设备树里面的timing改了
      cb388eff5f5c52c177e242e89f28e2cfb8af0b8c.png

      2.打开 drivers/video/fbdev/sunxi/disp2/disp/de/disp_lcd.c 然后找到 s32 disp_init_lcd(struct disp_bsp_init_para* para) 函数,在前面加上一段代码

      typedef struct
      {
      	volatile unsigned int Timing0;
      	volatile unsigned int Timing1;
      	volatile unsigned int Timing2;
      	volatile unsigned int Timing3;
      }RegTypeDef;
      
      static void set_lcd_timings(unsigned int dwLcdRegBase, struct disp_video_timings* pTimings)
      {
      	RegTypeDef* reg;
      	unsigned int dwWidth, dwHeight;
      	unsigned int dwHT, dwHBP;
      	unsigned int dwVT, dwVBP;
      	unsigned int dwHSPW, dwVSPW;
      
      	reg = (RegTypeDef*)(dwLcdRegBase + 0x48);
      	
      	dwWidth = pTimings->x_res;
      	dwHSPW = pTimings->hor_sync_time;
      	dwHBP = pTimings->hor_back_porch + pTimings->hor_sync_time;	//在官方文档里:hbp = hbp + hspw,然而在全志的代码里面又将hspw其减去,所以在这里需要加回来
      	dwHT = pTimings->hor_total_time;
      
      	dwHeight = pTimings->y_res;;
      	dwVSPW = pTimings->ver_sync_time;
      	dwVBP = pTimings->ver_back_porch + pTimings->ver_sync_time;
      	dwVT = pTimings->ver_total_time;
      
      	reg->Timing0 = ((dwWidth - 1) << 16) | (dwHeight - 1);
      	reg->Timing1 = ((dwHT - 1) << 16) | (dwHBP - 1);
      	reg->Timing2 = (((dwVT - 1) * 2) << 16) | (dwVBP - 1);
      	reg->Timing3 = ((dwHSPW - 1) << 16) | (dwVSPW - 1);
      
      	printk("width: %d, hspw: %d, hbp: %d, ht: %d\n", dwWidth, dwHSPW, dwHBP, dwHT);
      	printk("height: %d, vspw: %d, vbp: %d, vt: %d\n", dwHeight, dwVSPW, dwVBP, dwVT);
      }
      

      然后在 s32 disp_init_lcd(struct disp_bsp_init_para* para) 函数的 disp_lcd_init(lcd, lcd->disp); 后面加上

      set_lcd_timings(para->reg_base[DISP_MOD_LCD0], &lcd->timings);
      

      3.最后编译烧写进去之后重启就搞定了…

      4.uboot我就懒得修改了,凑合用吧

      C 1 条回复 最后回复 回复 引用 分享 0
      • C
        CHENNENGBIAO LV 4 @newcastle 最后由 编辑

        @newcastle 你好,请问你的显示问题是显示不全的问题嘛,我是新手用的也是七寸的屏幕遇到了这个问题,s32 disp_init_lcd(struct disp_bsp_init_para* para) 函数中未找到disp_lcd_init(lcd, lcd->disp); 还请多多指教😊

        1 条回复 最后回复 回复 引用 分享 0
        • 1 / 1
        • First post
          Last post

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

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