首先说说QC的片子,QC这块片子使用MDP3.0作为图像处理器,下面支持MDDI,LCDC,以及EBI3种显示接口,MDP3.0不支持overlay,因为不管是camera或者视频播放都必须使用surfaceflinger来进行处理。3种接口这里我们使用到的是LCDC,使用RGB接口接一个同步屏。MDP会根据PANEL的type(比如LCDC_PANEL)来选择适当的接口,而panel本身必须注册适当的设备,比如说LCDC屏必须在后面注册一个LCDC设备而不是MDDI设备。
  从FB的结构来上,QC注册了4个设备:MSM_FB,MDP,LCDC,panel。MSM_FB是fb.c的本地实现,其他的都是各个设备接口的驱动。系统启动的时候board.c会首先注册4个ID为1的设备,然后probe完成基本的一些硬件的初始化,后panel的驱动注册的时候会重新注册一个ID为1的panel设备,并将panel相关的参数(比如margin,pclk,resolution等等)传到LCDC,并重新注册一个ID不为0的lcdc设备,LCDC的probe又会重新注册一个ID不为0的MDP设备,MDP的probe又会根据传过来的参数注册一个FB设备。(插播点小广告:linux设备注册的时候会寻找相应的驱动,如果有相应的驱动会调用相应的驱动的probe,同时驱动注册的时候也会寻找相应的设备,找不到会报错,找到了会调用相应的probe,一个驱动可以被多个设备使用,但是一个设备不能同时使用多个驱动。另外FB相关的设备一般注册成platform device,关于这个名词可以去参照linux的doc文件夹)
  FB的数据类型有RGB565,RGB888和ARGB8888四种,LCDC下被写死了只能是RGB565。
  要了解上面的一个过程必须对内核运行的一套机制有所了解,这样才知道这个数据流程是如何走下来的,尤其是panel的参数后是如何被FB给接收的,以及open device的时候一套on是如何下来的。这里重要的几个文件一个是arch/arm/mach-msm下面的board相关文件,另外一个是drvier/video/msm下面的driver相关文件。
  也许咱看的内核代码还太少,觉得QC这套FB的流程真是清晰流畅,相当的经典阿,可以作为以后自己写FB的典型范例阿,不过得有机会写才行- -!
  除了上面的一套设备和驱动注册过程之外,重要的是从设备的open开始的这么一套流程了,FB是一个字符设备,当打开设备的时候会调用FB的open函数,这个open函数的实现是很重要的。QC在FB的open里面先后调用各个设备的open完成对MDP,LCDC,PANEL的初始化,并在后点亮背光。这个backlight设备也是个很高深的学问,QC实现的自己一套,而android则是注册了一个LED设备,暂时没有深研究这个设备的运作过程,以后一定得仔细弄清楚~~背光控制不好常见的是白屏,花点了。除了open以为还有一个是release/off以及set_backlight了,这3个函数基本实现了FB的全部功能。
  了解了FB一套大体的实现,下面是具体的如何来调试这个LCD了。觉得真要调一个屏的话,一定要了解TFT-LCD的一个基本的工作原理,不需要了解太深,但至少从硬件上知道他显示一个什么原理,网上有很多资料,这里只是简略说一下。TFT-LCD的基本原理是两个电极板驱动液晶流向,然后光穿透并进入滤光板显示出颜色。这里有几个概念是必须清楚的:
  1、common极的电压(Vcom/VcomH/VcomL)和source driver(DDVDH)之间的电压控制液晶的方向,因为液晶不能常时间朝向一个方向,不然会造成液晶的损坏,因此这里存在一个反转的问题,是两个电极之间的电压必须反转以让液晶的流向反转。可以通过改变两个电极的电压来反转,反转的方式有很多种:帧反转,行反转,列反转以及像素反转。不同的反转方式可能造成屏的flicker(闪烁)以及crosstalk(相邻像素互相影响),因此根据电压反转的方式必须选择适当的反转方式。
  2、调节common的电压可以调节屏幕的对比度,因为它和source driver之间的电压控制着液晶中能通过的光量。
  3、gate driver(VGH/VGL)与source driver之间的电压控制着TFT的开关
  了解了一些基本的物理原理,现在我们看看具体的调试LCD的过程。除了可以参照网上一些达人的成功经验之外,我觉得更主要的还是要仔细看清楚datasheet,因为不同的屏同一个现象的原因并不是的,因此了解一个基本的调屏的过程之后重要的还是仔细阅读datasheet。
  调屏之前首先必须确认Driver IC 的datasheet的正确性,咱这个可怜人两次厂家给的datasheet都是错误的,害得咱两次都瞎折腾半天却总不对。一定要和厂家确认Driver IC的正确性。基本现在的屏都是上电 --> reset --> 初始化这么一个过程,初始化现在一般是使用的SPI接口,那么我们来说说这个基本的过程:
  1、上电   有些屏对上电的顺序有比较严格的要求,一定要根据datasheet要求的时序来;
  2、reset  reset一般都是高低高的一个过程,而且一般都有时序上的要求。一定要注意这个reset的脚是否专用的,侧曾经碰到过reset还被其他的驱动使用造成reset脚不停地被拉高拉低
  3、初始化  现在一般使用三线spi接口(clk,data,cs)来发送初始化命令,各种屏对发送命令的格式和参数都有一种要求,比如说command以0开头或者其他的十六进制数开头等等。另外还要确认MCU物理spi或者模拟spi的时序与屏相匹配。一般来说初始化成功以后屏应该亮起来了,只是可能显示的是花彩。
  4、RGB接口的配置  RGB接口包含HSYNC  VSYNC PCLK 3根线,有些屏还多一根DATA_EN线。这里一般重要的是让MCU与屏的极性一致,通过配置主芯片相关寄存器或者屏的相关寄存器使两者的极性相匹配。4跟线的极性正确以后再配置相关的margin的数据,屏幕应该正常亮起来了。
  如果这时候显示还有问题,那么差不多应该怀疑初始化代码的微调了。初始化代码里面比较重要的一般有:VCOM/VGL/DDVDH之类的电压配置;工作模式的选择;RGB接口的极性;RGB的顺序;DATA的数据位数;开始扫描的坐标;极性反转的方式;
  基本上通过上面的调试LCD应该是没有什么问题了,再有问题仔细看datasheet并联系厂家的FE了~~