一、 LVDS简单理解
LVDS粗略了解
LVDS = Low-Voltage Differential Signaling 低电压差分信号,属于平衡传输信号。这种技术的核心是采用极低的电压摆幅高速差动传输数据,从而有以下特点:低功耗—低误码率—低串扰—低抖动—低辐射 良好的信号完整性。推荐的最高数据传输速率是655Mbps,而理论上可以达到1.923Gbps。在17inch及以上的液晶显示器中得到广泛应用。
单路6bit LVDS:这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。
双路6bit LVDS:这种接口电路中,采用双路方式传输,每个基色信号采用6位数据,其中奇路数据为18位,偶路数据为18位,共36位RGB数据,因此,也称36位或36bit LVDS接口。
单路8bit LVDS:这种接口电路中,采用单路方式传输,每个基色信号采用8位数据,共24位RGB数据,因此,也称24位或24bit LVDS接口。
双路8bit LVDS:这种接口电路中,采用双路方式传输,每个基色信号采用8位数据,其中奇路数据为24位,偶路数据为24位,共48位RGB数据,因此,也称48位或48bit LVDS接口。
单路6bit,只用到三对差分信号数据线,一对时钟线
双路6bit,只用到六对差分信号数据线,两对时钟线,分为两个通道
RGB666
单路8bit,只用到四对差分信号数据线,一对时钟线
双路8bit,只用到八对差分信号数据线,两对时钟线,分为两个通道
RGB888/RGB24
LVDS显示模式
单通道LVDS :只通过一个通道接向外面的LVDS panel。(单路显示)
split双通道LVDS: 通过两个通道接向外面的一个LVDS panel. (双通道lvds)
两路通道LVDS: 通过两个通道接向外面的两个LVDS panel, panel 显示相同内容; (双屏同显)
两路通道LVDS:两个不同输入,分别指向两个不同LVDS panel,panel 显示不同内容; (双屏异显)
IPU:image process unit图像处理单元,所有图像视频处理都经过这个IPU来进行处理输出,IPU从framebuffer取数据,然后从DI口输出到接口传输到屏幕上。一个IPU有两路DI口。IPU 将framebuffer 中的数据读入到IPU,然后根据其分辨率参数,生成带有时序的显示数据,最终通过DI口送出。每个DI 口送出的数据,就已经包含了hsync,vsync,pixelclock,及像素数据。 在HDMI, LVDS, LCD 端,都可以控制相关寄存器,让DI 的数据流流向自己,最终经过显示协议的转换输出到显示屏幕上去。 也就是说 LVDS显示数据是从IPU DI 路由给它的。
双通道LVDS:使用相同的IPU DI,且每个通道都路由这个DI 的数据到 自己的通道。由于使用的是相同的DI, 所以两个显示屏幕内容是相同的。 很明显,双通道LVDS 能够实现多屏幕同显。
split通道LVDS:使用相同的IPU DI,但每个通道路由不同的数据,奇数通道路由奇数位像素数据,偶数通道路由偶数位像素数据,依次来构成一个完整的帧。
LVDS输出格式
imx6平台包含 2 个 8 位数据线的 LVDS 接口,每个接口都可以支持 JEIDA 和 SPWG 数据格式,在 SPWG 格式时支持 6 位数据线和 8 位数据线输出。 2 个接口同时使用可以连接 12 位或 16 位数据线的显示屏。
我们在选择了一块 LVDS 接口的显示屏后我们需要确认该显示屏的数据格式和数据位数,按照要求做出相应配置,输出正确的显示信号。
1、 首先,确认数据传输的格式,我们参考 imx6手册 LDB 章节, imx6支持SPWG和JEIDA 2 种格式输出显示信号。看下图,每个时钟周期,每对数据线传输 7 位数据, SPWG 和 JEIDA 的区别就是每条数据线上传输的数据的顺序是不同的,而且 JEIDA 不支持 18 位模式,所以我们在拿到显示屏的手册后,需要先确认此屏的数据传输格式是哪种。
2、 其次确认 LVDS 接口包含多少条数据线。 LVDS 显示包含的数据线大致包含以下几种,
6 位数据线( 3 对数据传输线),数据传输时 RGB 信号按 18 位传输。
8 位数据线( 4 对数据传输线),数据传输时 RGB 信号按 24 位传输
二、 按照手册配置好编译环境。
三、 拿到原厂的内核源码,解压。
四、 修改设备树。
打开imx6q-sabresd.dts设备树文件
其中&ldb节点
lvds-channel@0:指定lvds第0通道使用哪个IPU哪个DI口进行数据输出
这里 ipu2-di0:表示使用IPu的第0个di口进行数据输出。
lvds-channel@1:指定lvds第1通道使用哪个IPU哪个DI口进行数据输出
这里 ipu2-di0:表示使用IPu的第0个di口进行数据输出。
mxcfb1~mxcfb4 用于开启哪个fb,与imx6qdl-sabresd.dtsi设备树中的节点有关。
打开imx6qdl-sabresd.dtsi设备树进行配置。
与LVDS配置相关的几点如下:
Aliases是取别名的意思。
这部分不知道是什么作用,更改了之后,对屏幕显示没有影响
四个fb设备,与上面的这些有关,这里我打开了mxcfb1,status为okay,所以只关心mxcfb1:fb@0接电即可。
Compatibe = fsl,mxc_sdc_fb,用来匹配的内核的驱动,这个确定是原厂编写好的,不用管它
Disp_dev = ldb , 显示的节点是ldb,这个ldb会在文件后面声明
Interface_pix_fmt = RGB24:这个是根据实际情况来填写,屏幕手册显示是8bitRGB,则是RGB24。这里我试过用RGB66,会影响显示的颜色,不会没有显示/黑屏的情况。
Default_bpp= <16> 位深,这里只能填16,我填了24则显示不出来。
显示屏背光相关节点。
Backlight 背光节点
compatible = "pwm-backlight"; //匹配内核驱动,原厂自带的驱动
pwms = <&pwm1 0 5000000>; //指定使用你pwm1,节点在后续定义,频率是5MHz
brightness-levels = <0 4 8 16 32 64 128 255>; //通过调整占空比来控制亮度等级,分为8级(0~7)
default-brightness-level = <7>; //指定默认的占空比,亮度等级为7(255)。
status = "okay";
这两块定义了pwm1节点,并知名pwm1使用到的引脚号。
五、 编译设备树,执行./build-dtb.sh
在arch/arm/boot/dts/ 下即会生成 imx6q-sabresd.dtb imx6dl-sabresd.dtb 替换原厂的设备树,重新烧录即可。