zoukankan      html  css  js  c++  java
  • lvds split两channel输出到一个屏显示

    转:https://blog.csdn.net/changqing1990/article/details/81128552

    其实之前写过LCD/LVDS的一些时序的基本概念《与LCD移植相关的概念》。但后来发现还是不够全面。关于双通道LVDS,可能会有很多人有一些陌生,它是什么原理? 有什么作用? 时序如何设定? 接下来, 就让我们带着这些问题去阅读下面的文章吧!

    1. IMX LDB桥对LVDS 的支持情况:
    让我们先看一张imx6 TRM 中的图.

    IMX6 LVDS 桥提供两个LVDS通道, 或许下面的图更能说明什么是通道:

    什么叫做通道? 上面这张图描述的很清楚,LVDS0_CLK_N, LVDS0_CLK_P, LVDS0_DATA[3:0]_N, LVDS0_DATA[3:0]_P 就构成了一个通道0,剩下的一组构成了通道1。我们可以看到每一组LVDS通道有一组完整LVDS信号,这组信号就可以接一个LVDS panel。

    该LVDS 桥支持 单通道,双通道, split 通道 的输出。我们来具体讲讲这三者的区别:

      单通道LVDS : 只通过一个通道接向外面的LVDS panel。

      双通道LVDS: 通过两个通道接向外面的两个LVDS panel, panel 显示相同内容;

      split 通道LVDS: 通过两个通道接向外面的一个LVDS panel.   

    单通道很好理解, 它是我们常用的一种LVDS,这里不再描述。为了彻底弄明白 双通道 & split 通道的lvds,我们还得从IPU 说起。

    2. IPU DI 与LVDS
    IMX6 CPU 所有的显示(LCD,HDMI,LVDS),都要经过IPU的处理。IPU 的数据处理流程,让我们用一张图来解释:

    IPU 将framebuffer 中的数据读入到IPU,然后根据其分辨率参数,生成带有时序的显示数据, 最终通过DI口送出。

    每个DI 口送出的数据,就已经包含了hsync,vsync,pixelclock,及像素数据。 在HDMI, LVDS, LCD 端,都可以控制相关寄存器,让DI 的数据流流向自己,最终经过显示协议的转换输出到显示屏幕上去。 也就是说,HDMI, LVDS , LCD 的显示数据都是从IPU DI 路由给他们的。

    从上图可得,每一个IPU都有两个 DI 口,也就是说每个IPU 最多支持两路显示。

    了解了这一概念之后,我们再来看 LVDS 双通道 &split 通道:

    双通道LVDS:使用相同的IPU DI,且每个通道都路由这个DI 的数据到 自己的通道。由于使用的是相同的DI, 所以两个显示屏幕内容是相同的。 很明显,双通道LVDS 能够实现多屏幕同显。

    split通道LVDS:使用相同的IPU DI,但每个通道路由不同的数据,奇数通道路由奇数位像素数据,偶数通道路由偶数位像素数据,依次来构成一个完整的帧。

    可能比较抽象,举个栗子。1920x1080的像素数据中每一行有1920 个像素点,分别编号1,2,3, 。。。1920, lvds split mode 就是在通道0 中发送第一个像素数据,通道1中发送第二个像素数据,依此类推。再来张很重要的图来加以说明。

                                                      图 2.2

    这张图是自己画的,但很重要的说明了LVDS split 模式下, LVDS 通道中数据构成方式。好了我们后面还要讲这张图片。

    从这里可以看出,所谓双通道LVDS,其实也很简单,它的时序参数和单通道lvds 是没有仍何区别的。接下来就是split通道的LVDS了。

    3. Split 通道的LVDS的timing
    相信看了刚才对split mode 的LVDS 的描述,已经大致有了了解。那么当拿到split 模式的LVDS, 如何调节它的时序呢?其实这一切,都源于对图2.2的理解。让我们对这个图重新完善下:  

    这张图是pixelclock, IPU DI , LVDS channel0, LVDS channel1 中的数据对照。

    举个栗子说明,如果IPU DI 端输出是1920x1080M@60 分辨率的像素数据, lvds channel 0 的时序变成了960x1080M@60 的分辨率,lvds channel 1 的时序也变成了960x1080M@60 的分辨率。pixelclock 就变成了原来的一半。

    当我们拿到一个1920x1080 split 模式的lvds 的datasheet,假如它有下面的时序参数:

    一看datasheet直接蒙逼,这不是1920x1080 的么?怎么变成960x1080的了。如过看了我们刚才上面的描述,你一定会知道,这个datasheet 描述的时序参数是指 每个LVDS接口 (通道)所需要的输入参数。

    我们由刚才分析可得:一个LVDS 信号,经过split 模式后,lvds每个通道信号的pixelclock 变为原来的一半,水平有效长度变为原来的一半。

    由此可以反推出 IPU DI 端的时序参数,datasheet 中的pixelclock*2 = DI 端的pixel clock ,h active 长度*2 = Di 端的 hactive 长度.

    由此可以获得devicetree 中lvds split 模式下的timing,详细如下:

    timing50: g070vw0yuyu {
    clock-frequency = <144000000>;
    hactive = <1920>;
    vactive = <1080>;
    hback-porch = <120>;
    hfront-porch = <120>;
    vback-porch = <20>;
    vfront-porch = <20>;
    hsync-len = <32>;
    vsync-len = <5>;
    };
    现在可以解释为啥需要split 模式的LVDS 了, 因为它每个通道需要的pixelclock 较低, 合成后可以变成高分辨率的显示屏,一般单通道的很难达到这么高的分辨率。

    双通道LVDS的描述就至此了,希望对你有所帮助!
    ---------------------
    作者:CH_Qing
    来源:CSDN
    原文:https://blog.csdn.net/changqing1990/article/details/81128552
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    linux中的cd ..和cd -命令有什么区别?
    GCC使用
  • 原文地址:https://www.cnblogs.com/newjiang/p/10218369.html
Copyright © 2011-2022 走看看