LCD驱动快速调试
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 { 107 native-mode = <&lvds_timing0>; 108 lvds_timing0: hsd100pxn1 { 109 clock-frequency = <65000000>; 110 hactive = <1024>; 111 vactive = <768>; 112 hback-porch = <220>; 113 hfront-porch = <40>; 114 vback-porch = <21>; 115 vfront-porch = <7>; 116 hsync-len = <60>; 117 vsync-len = <10>; 118 de-active = <1>; 119 pixelclk-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 { 107 native-mode = <&lvds_timing0>; 108 lvds_timing0: hsd100pxn1 { 109 clock-frequency = <141400000>; 110 hactive = <1920>; 111 vactive = <1080>; 112 hback-porch = <100>; 113 hfront-porch = <100>; 114 vback-porch = <2>; 115 vfront-porch = <9>; 116 hsync-len = <20>; 117 vsync-len = <9>; 118 de-active = <1>; 119 pixelclk-active = <1>; 120 }; 121 };
de-active = <1>;
pixelclk-active = <1>;这些参数不用管,一般没出现什么大问题,或者颜色图需要反转的时候再调。
那么这个 设置的 fps 就 =141400000 / 2142 /1100 = 60.011HZ
一般都是60HZ 的 ,android支持嘛,不过有时自己需要调低或者调高一点,有时使用两个屏幕时有干扰,实际的频率没那么高。
还有就是 看看LCD使能脚 位选脚, 看看有没有复用,看看pinctrl的dtsi 有没有同时打开嘛。
或者你看到漆黑的一片就看看背光,
一般都是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 用了外接的芯片就还需另外测试。
不过一般都是在这个数据的上下波动。