关于IMX双通道LVDS 的深入讲解

其实之前写过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的描述就至此了,希望对你有所帮助!

### imx6q 处理器上的 LVDS 配置驱动信息 #### 设备树中的 LVDS 节点配置 对于 i.MX6Q 平台而言,在设备树源文件(DTS)中定义了用于控制 LVDS 显示接口的具体节点。这些设置指定了连接到特定通道的显示器分辨率和其他属性。 ```c &ldb { status = "okay"; lvds-channel@0 { fsl,data-mapping = "jeida"; /* 或者"vesa",取决于面板 */ fsl,dither = <1>; Status = "okay"; displaytiming { pixelclock = <79_5>; /* 单位为kHz */ hactive = <1280>; vactive = <720>; hfrontporch = <40>; hbackporch = <88>; hsync-len = <48>; vfrontporch = <3>; vbackporch = <4>; vsync-len = <10>; de-active = <0>; polarity = < 0 0 0 0 /* hsync-active, vsync-active, data-enable-active, pixelclk-active */ >; }; }; lvds-channel@1 { ... }; /* 如果有第二个LVDS信道的话 */ }; ``` 上述代码片段展示了如何通过修改 DTS 文件来调整 LVDS 接口的工作参数[^3]。 #### 内核命令行传递显示选项 当启动 Linux 系统时,可以通过内核命令行指定视频输出的相关参数。这允许开发者灵活地改变幕分辨率为不同的应用场景做准备而不必重新编译整个内核镜像。 例如,在 Hi3516DV300 开发板上实现双异步显示的情况下,可以这样设置: `video=mxcfb0:dev=ldb,LDB-1024X600,if=RGB666 video=mxcfb1:dev=ldb,LDB-1024X600,if=RGB666` 这条指令告诉系统使用 LDB 控制器并设定两个帧缓冲区分别对应两块不同物理位置但相同规格的小尺寸液晶显示[^2]。 #### GPIO 引脚分配给按键功能 值得注意的是,除了管理图像数据传输外,某些 GPIO 引脚还可以被用来作为输入装置的一部分工作,比如音量调节按钮就可能占用了一个原本属于其他用途的通用 I/O 口线。“gpio-keys/volume-up” 就是指定了一组这样的键控逻辑关联到了具体的硬件资源之上。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值