LCD 调试总结
数据流程:
Framebuffer -> DC -> Dsi -> Dsi83 -> LCD
DC 通过DMA从framebuffer取数据 ,然后通过并口传递给Dsi , Dsi输出mipi信号给Dsi83 , Dsi83将MIPI信号转成LVDS信号给LCD。
初始化流程:
首先得给各个器件上电,然后执行各个控制器的初始化代码,这个过程里面要确保各个信号的稳定性以及时序符合芯片要求,这是调试驱动的第一步,这一步不能确保后面不管怎么搞都是瞎搞。
遇到的问题:
一、不知道pclk是什么意思,也不了解pclk与mipi clk的换算关系:
1,Pclk是一秒钟要送出的总的像素点,实际上就是 一行的像素点*总行数*帧率
2,mipi clk的算式就是mipi clk = pclk * bpp/num(lane)*2
文字解释,pclk*bpp就是一秒要送出的总的bit位也就是比特率,这是每一秒由DC送给Dsi的数据,因为它在芯片内部是以并口的形式送出的,而Dsi拿到数据后是以串口的形式送出的,所以这里计算mipi的clk要除以lane的总数,又因为mipi是上升沿下降沿都取数据,所以这里要除以2。
二、这次主要是遇到LCD不断闪屏,为了debug做过的实验有:
1, 测试模式下用mipi clk,仍然闪屏
2,测试模式下用外部clk,不闪屏
实际上从这里就有理由怀疑mipi的输出有问题,从原理上来看接下来也应该去check dsi的输出信号,但是因为mipi没有测试点接出来,所以一开始居然避开了这一项检测,转而去狂填参数,现在想起来大概是因为填参数对软件而言比较容易,但实在是没什么道理,我也对一开始没有坚持自己的推理让硬件去测信号感到不满。
解决问题:
最终吹掉dsi83 IC,量mipi信号,发现时钟的确输出不连贯,而对比使用该IC的能正常显示的板子,其clk是连贯的。那么我们首先要保证mipi信号输出的正确性。
最后改掉一个控制clk的 参数TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS即可。
总结: 遇到问题,应该跳出来,找人喝茶聊天,根据原理寻找思路,而不是匆匆忙忙冒冒失失的一头扎进去,以至深陷其中,不能自拔。
最后附上一张图:
方向不对,越努力越尴尬。
========================================华丽丽的分界线================代码======================
代码介绍:
英伟达平台:
对于linux内核显示相关代码在Dc.c (drivers\video\tegra\dc)目录下。
这是display control的驱动文件,在这个文件中首先看driver结构体:
struct platform_driver t