imx6 适配DLP(864*480)输出

来源:互联网 发布:强子纹身器材淘宝 编辑:程序博客网 时间:2024/05/16 14:36

imx6 适配DLP(864*480)输出

背景

前一阵子,由于项目需求,需要把TFT屏的输出方案改为DLP,这样能提高屏幕亮度。原来看TFT屏的输出使用的是lvds,发现DLP的输入hdmi,本来imx6是有hdmi接口的,可是damo板上这个接口并没有引出了,没办法无奈之下只能寻求其他办法,于是买了个转接板,把lvds信号转为hdmi信号。这个板可不是那么好找的,淘宝上找了好久,发现不能用,说到hdmi的适配,中间又有一些坑,现在的显示器基本上都带有EDID适配的,然而一些老的显示器或者显示设备就没有EDID,起码这款DLP-DLP1200就没有,淘宝上买的转接板不是不行,是它的默认转换出的格式不支持DLP,然而我们接显示器确实好的,在接回DLP后也是好的,说明它适配了EDID设为默认输出。由于是淘宝上买的板子,我们又拿不到源码,所以没法修改hdmi的默认输出,总不能给客户演示时还带个显示器去适配后再接回DLP吧,因此我们又联系转换芯片原厂,好不容易才忽悠到一块可以用的damo转接板(默认就支持了DLP),说多了,言归正传。

正题

在拿到转换板后,我们按照标准的vesa格式设置了lvds的输出,imx6设备树源码如下:

“`
mxcfb1: fb@0 {
compatible = “fsl,mxc_sdc_fb”;
disp_dev = “ldb”;
interface_pix_fmt = “RGB24”;
default_bpp = <32>;
int_clk = <0>;
late_init = <0>;
status = “disabled”;
};

&ldb {
status = “okay”;
lvds-channel@0 {
fsl,data-mapping = “spwg”;
fsl,data-width = <24>;
status = “okay”;
primary;

display-timings {
native-mode = <&timing0>;
timing0: hsd100pxn1 {
clock-frequency = <31500000>;
hactive = <864>;
vactive = <480>;
hback-porch = <70>;
hfront-porch = <60>;
vback-porch = <9>;
vfront-porch = <35>;
hsync-len = <6>;
vsync-len = <1>;
};
};
};

“`
然后我们在kernel_comline里面设置video=mxcfb0:dev=ldb,bpp=32
这样我们就可以在lvds接口中输出了。
然后我们连接在DLP发现任然不能显示,但是我们接显示器就能显示,而且我们电脑的hdmi输出给DLP也是可以的,这是神马?之后我们修改了各种参数,发现还是不行。这肯定是信号不对啊,但是hdmi数据是经过编码的,而且是差分信号,我们没有设备测量啊,不经意之间我们发现显示器的输出频率莫名其妙的被改掉了,不在是31.5MHz,用示波器测量时钟信号发现是38.8MHz。我们继续修改参数,看时钟设置是否能正常,经过设置几个参数后我们发现,高于38.8MHz的都能正常设置,低于38.8MHz的都被默认设为38.8MHz,时钟没有将下来,这是为什么?
几番周折,我们终于发现问题所在,在ldb的时钟信号上之前用的是pll2,这个时钟源没有做更多的分频,所以需要一个更低的分频时钟源-pll5
这里写图片描述

pll5在芯片手册中的说明:

这里写图片描述

修改设备树文件:
&clks {
fsl,ldb-di0-parent = <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>;
//fsl,ldb-di0-parent = <&clks IMX6QDL_CLK_PLL2_PFD0_352M>;
//fsl,ldb-di1-parent = <&clks IMX6QDL_CLK_PLL2_PFD0_352M>;
};

这样修改后:lvds输出设置就可以生效了,直接连接DLP也能正常显示。