LCD驱动快速调试

来源:互联网 发布:深圳棋牌网络开发公司 编辑:程序博客网 时间:2024/06/05 19:32

LCD就是一个一个的点嘛,每个点有分16bit  24bit  32bit   一般都8 : 8 : 8 的红绿蓝  基本原理就是这样,一个一个的点。


一个LCD的图就是这样



一般换屏调的比较多的是Timing,就是上面的那个图,调什么呢,就是调 “打点”。


打点不能太快,也不能太慢!


看上面那个图,left_margin  Right margin   Hsync 这些东西是什么鬼? 


叫做: 行切换的回扫时间,水平同步时间  


什么意思?就是说我打点的时候有时间拖延,比如我打个  长为1366  宽为768  的屏幕,一个屏幕是不是就是1366×768=1049088

个点,但是事实上我要花大于  1049088 的打点时间,为什么要用点来算时间?因为人家的数据手册 就是 点频率为主要参数。



那OK?我们来算算一张图真正需要的打点单位时间。


一张图单位时间 = (Left_margin + right_margin + hsync + xres) × (Upper_margin + low_margin + vsync + yres)

                             

这些数据可以在数据手册的Timing参数上面


这个是1920 × 1080的LCD


但是,实际打一张图的单位时间却不是 1920 *1080 因为有拖延的时间嘛


上图所知道是  实际的一张图的单位时间 2142 * 1100  还有这个LCD的打点频率是141.4M,记得,是点频率


OK,Timing参数基本上就已经知道了


开源上面说个例子:

/arch/arm/boot/dts/imx6dl-tx6u-811x.dts

display-timings {107native-mode = <&lvds_timing0>;108lvds_timing0: hsd100pxn1 {109clock-frequency = <65000000>;110hactive = <1024>;111vactive = <768>;112hback-porch = <220>;113hfront-porch = <40>;114vback-porch = <21>;115vfront-porch = <7>;116hsync-len = <60>;117vsync-len = <10>;118de-active = <1>;119pixelclk-active = <1>;120};121};

hback-porch = <220>;  hfront-porch = <40>;  hsync-len = <60>; 这个三个参数加起来就是水平的拖延时间。

这个是开源初始的水平拖延时间 =  220 +40 +60 = 320 


但是我们这个屏幕的水平拖延时间是  2142 - 1920 = 222


与320不相等耶,如果不改的话,打一张图的时间会太快,到时肯定会出现波纹或者轻微闪屏,肯定改一下好啦 


怎么改?


只要

hback-porch + hfront-porch +  hsync-len  = 222 就可以了,随便你怎么搭配 比如
100 + 100 +  22 


hback-porch = <100>;  hfront-porch = <100>;  hsync-len = <22>; 

随便一个组合的数据,只要加起来222就行了,你也可以  50  50  122


垂直的拖延时间类似!


然后 

clock-frequency = <65000000>; 这个频率再换一下就可以了,141.4M 
改成
clock-frequency = <141400000>; 

最后
display-timings {107native-mode = <&lvds_timing0>;108lvds_timing0: hsd100pxn1 {109clock-frequency = <141400000>;110hactive = <1920>;111vactive = <1080>;112hback-porch = <100>;113hfront-porch = <100>;114vback-porch = <2>;115vfront-porch = <9>;116hsync-len = <20>;117vsync-len = <9>;118de-active = <1>;119pixelclk-active = <1>;120};121};

de-active = <1>; 
pixelclk-active = <1>;
这些参数不用管,一般没出现什么大问题,或者颜色图需要反转的时候再调。

那么这个  设置的 fps 就 =141400000 / 2142 /1100 = 60.011HZ


一般都是60HZ 的 ,android支持嘛,不过有时自己需要调低或者调高一点,有时使用两个屏幕时有干扰,实际的频率没那么高。


还有就是 看看LCD使能脚 位选脚, 看看有没有复用,看看pinctrl的dtsi 有没有同时打开嘛。



或者你看到漆黑的一片就看看背光,


/drivers/video/backlight/


一般都是pwm驱动没有打开,或者是管脚又被复用了,经常都是复用的问题


用示波器借 BL背光引脚有没有pwm或者高电平输出


一般是先看背光,然后再调打点频率,还有其它的一些怪问题就看看 fb 的节点


/drivers/video/fbdev/core/fbmem.c  在kernel加载的时候一开始就创建了fb的节点,而且很早呢,


subsys_initcall (fbmem_init) ;


#define subsys_initcall(fn)__define_initcall(fn, 4)

优先级为 4 


节点在 sys/class/fb  


各种都可以用各种 echo  cat 命令来调试。



忘了说了,还有mipi 的频率有时也要算一下  =  DCLK *24 / 4 


24是你支持的24位图显示,4是mipi有四条线传输 ,


最后bit_clk = DCLK * 6 


rockchip,dsi_hs_clk  =  DCLK * 6 


如果是其他芯片转的话会上下调一下,一般都是加减30 ,比如 mipi 转edp 用了外接的芯片就还需另外测试。


不过一般都是在这个数据的上下波动。