前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《DRM 专栏》| LCD显示异常分析——花屏和撕裂

《DRM 专栏》| LCD显示异常分析——花屏和撕裂

作者头像
刘盼
发布2022-06-20 09:42:13
3.1K0
发布2022-06-20 09:42:13
举报
文章被收录于专栏:人人都是极客

花屏

概述

相信很多朋友会遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现。

让大家能够更容易、更直观的理解这类花屏问题的原因,我特地写了这篇文章。

软件:Android 硬件:带GRAM的LCD(如SPI屏,DSI CMD屏)

现象

分析

从上面的动态图可以看出,出现瞬间花屏的问题,主要有两个原因:

  1. 背光开启的时间过早
  2. 对GRAM的写速度(W) < 对GRAM的读速度(R)

其实,只要任意解决其中一个问题,都不会出现开机闪现花屏的现象。开发人员第一次碰到这类问题时,往往第一反应会认为花屏就是在第一帧产生的,但实际从上面的图中我们可以看到,人眼看到的花屏其实已经是在第二帧了。

对于第一点,其实一开始我也很疑惑,如果说开机闪现花屏是因为uboot中背光开的太早导致,这个结论我能接受。但在进入Android系统后,休眠唤醒时还会有花屏问题,这就有点说不通啊?因为Android的PowerManager框架本身能够确保在休眠的时候先关背光,后关显示;在唤醒的时候先开显示,后开背光,而且我显示驱动里面也做了刷背景色的动作,只要GRAM中的数据没有被填充完,显示驱动的流程就不会接着往下走,进而也不可能开启背光。所以一旦背光点亮,说明GRAM已经被初始化了,可为什么还能看见GRAM中的垃圾数据呢?

这就引出了第二点:因为对 GRAM 写的速度小于读的速度,哪怕W只比R小那么一丁点儿,只要它们同时从第一颗像素开始扫描,屏上显示的第一帧永远都是垃圾数据。

解决方法

前面已经提到过了,只要任意解决其中一个问题,闪花屏的问题就能解决。

  1. 推迟背光开启的时间

这里的推迟动作其实是相对的,即你可以:

  • 在初始化完GRAM后,等待1个TE信号,再开启背光
  • 或者在给屏幕发送Sleep Out (0x11)、Display On (0x29)指令前,先通过Write Memory Start (0x2C)指令将GRAM初始化好
  1. 提高GRAM的写速度

即提高主控端总线上的送图速度,比如提高SPI总线的时钟频率(SPI屏),提高RS/WR的切换速率或扩充DATA总线(MCU屏),提高PHY Clock Frequency (MIPI DSI屏)。

常白屏引起的撕裂假象

上面的问题如果发生在常白屏(即默认上电就是白屏)上,那么往往会给人产生撕裂(tear effect)的假象,见下图:

其实原理和上面是类似的,只是由于人的视觉残留效应,造成背光从灭到亮那一瞬间看到的第一帧印象极为深刻。尤其对于帧率较低(如30fps)的显示屏,视觉残留效果尤为明显,因此会对该类问题错误的判断为撕裂问题而进行处理。

其实真正的撕裂问题和这里讨论的现象,原理上是完全不同的,下面我们详细分析LCD撕裂的问题及解决方法。

撕裂

现象

首先贴一张动态图,让大家能直观的感受撕裂形成的过程:

分析

从上面的动态图我们可以看到,在第二帧出现了新旧画面各显示一部分的现象,该现象即为撕裂,英文又叫tear effect。tear effect的根本原因是对GRAM的读、写速度不一致,导致在一帧之内,GRAM的读指针®与写指针(W)发生了重叠导致。

这个现象其实包含2个信息:

  1. W和R指针重叠了
  2. 指针重叠后的画面在屏上静止不动保持了整整1帧的时间(60fps的话就是16.7ms),这个时间是足以被人眼察觉到的

有经验的开发人员都知道,出现这类问题往往都是因为有个2倍关系没有调整好。何为“2倍关系”?即必须保证W:R > 1:2(这里的W、R都指的是速率),否则势必会出现撕裂的现象(如上面的W:R=1:3)。

理想情况

为什么是2倍?请看下图(W:R=1:2):

因为W < R,所以R指针跑在前面,因此读出来的数据都是旧数据,屏幕第1帧显示的还是上一帧的图像,直到第2帧才将GRAM中的图像完整的显示出来。如果R再稍微快那么一点,那么在第2帧R指针就又会赶上W指针,这样就会再次出现tear effect现象。所以W:R=1:2是撕裂发生的临界值。

同理,那如果对于W > R的情况,是否也存在这个2倍关系?

回答这个问题前,我们先来看看下面这两幅图:

图1 (W:R=3:1)

图2 (W:R=2:1)

从上面的图中我们可以看到,对于W > R这中情况,确实也存在2倍关系。但是这种由于W > R而造成的撕裂现象一般是不可能发生的,因为大部分显示驱动都是等到TE信号到来时才开始刷图的,所以只要R指针还没有扫描完当前帧的画面,W指针是不可能立即去GRAM中刷画面“B”的,一定会等到画面“A”彻底显示完毕后才开始绘制,所以上面的图1、图2两种情况都不会发生。

因此为了防止撕裂的发生,只需要保证 W > 1/2R (这里指速率)即可。

实际情况

前面分析的现象都是基于一个前提条件的,那就是:

指针W和R都是基于同一个时间点、同一个GRAM起始位置开始扫描的

只要上面的2点有一个不满足,那么2倍关系就不成立了。

因为对于这类带GRAM的LCD ,驱动软件或LCD Controller硬件都会做成等待TE信号到来时才会开始刷图,所以对于第1点这里不做详细描述,只针对第2点进行讲解。在LCD的实际显示过程中,其实是有消隐区的(即Porch区域),而且一般屏厂会将TE信号默认放在内部DriverIC的VSYNC阶段送出,这就导致了指针W无法满足和R从同一GRAM起始位置开始扫描,具体过程如下图:

从上图我们可以看到,虽然W:R=2:3,满足 W > 1/2R 的条件,但是由于它们不是从GRAM的同一起始位置开始扫描,所以仍然会出现W和R指针碰头的情况,最终导致撕裂的现象。

那么对于上述这种情况,有什么方法可以解决吗?是时候召唤出TE Output Line了!

TE Output Line

LCD Driver IC厂商还是很贴心的,为了解决上述问题,工程师们专门预留了一个TE Output Line寄存器,该寄存器的作用就是用来调节TE信号(又叫FMARK信号)的输出位置。默认情况下,该寄存器的值为0,即DriverIC内部刷新时的VSYNC期间。那么对于上述情况,我们只需要将TE Output Line的值设置为VSYNC+VBP的值即可。

小提示:

  • 对于主控端,Vporch往往由VSYNC+VBP+VFP构成;
  • 对于LCD Driver IC厂商,他们定义的VBP其实往往是包含VSYNC的;

如下图:

结论

撕裂的本质:

  1. 在1帧时间内,W和R重叠了
  2. 撕裂的画面停留了1帧的时间,被人眼所觉察

解决方法:

  • W > 1/2R (这里指速率)
  • 开启TE同步信号
  • 调整TE Output Line

5T技术资源大放送!包括但不限于:C/C++,Arm, Linux,Android,人工智能,单片机,树莓派,等等。在上面的【人人都是极客】公众号内回复「peter」,即可免费获取!!

记得点击分享、赞和在看,给我充点儿电吧

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人人都是极客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 花屏
    • 概述
      • 现象
        • 分析
          • 解决方法
            • 常白屏引起的撕裂假象
            • 撕裂
              • 现象
                • 分析
                  • 理想情况
                    • 实际情况
                      • TE Output Line
                        • 结论
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档