LCD小小总结

来源:互联网 发布:软件开放平台 编辑:程序博客网 时间:2024/06/08 02:46

一.LCD原理

LCD的种类分类标准比多,按驱动方式可以分为:被动矩阵式、主动矩阵式
被动矩阵式:被动矩阵式LCD又可分为TN-LCD(TwistedNematic-LCD,扭曲向列LCD)STN—LCD(SuperTN-LCD,超扭曲向列LCD)DSTN-LCD(Doublelayer STN-LCD,双层超扭曲向列LCD)。这部分内容就不详细解释, 我们重点讲TFT-LCD
主动矩阵式:目前应用比较广泛的主动矩阵式LCD,也称TFT-LCDTFT-LCD 即是Thin-FilmTransistor Liquid-Crystal Display的缩写(薄膜电晶体液晶显示器)TFT-LCD如何点亮?TFT-LCD现在比较广泛的应用,我们从TFT-LCD说起。

由于TFT-LCD具有体积小,重量轻,低辐射,低耗电量,全彩化等优点,因此在各类显示器材上得到了广泛的应用。

 

 

1.TFT-LCD各结构的功能
1)、背光板模组:提供光的来源;
2)、上下偏光板,TFT Glass Substrate,液晶:形成偏振光,控制光线的通过与否;
3)、彩色滤光片:提供TFT LCD红、绿、蓝(光的三原色)的来源;
4)、ITO透明导电层:提供透明的导电通路;
5)、Photo Spacer:提供一固定高度給彩色滤光片和TFT Glass Substrate。作为灌入液晶时的空间.及作为上下两层Glass的支撑。

 

                           TFT-LCD结构侧视图   

2.不同颜色的显示
我们再看下我们要显示相应颜色时,控制相应的pixel electrode就可以。如下图所示:

 


C/F彩色单元,对应到TFT的控制单元,就可以完成我们像素点颜色的控制。TFT Array等效电路如下图所示:

    

3.TFT-LCD显像原理
我们来整理下TFT-LCD整体的显示原理。
1SCAN IC传输信号;
完成图像信号输入;
2DRIVER IC传输显像控制信号;
完成TFT单元控制;
3)当某一Sub-Pixel导通时,该Sub-Pixel因无法透光呈现黑色;
这部分完成像素点是亮还是暗。
4)若该Sub-Pixel未导通,则因光通过CF而显示颜色。经过光的合成效果,显示器即可产生彩色效果。

 

   

4.LCD接口

LCD的接口总类很多,TTL(RGB)、LVDS、EDP、MIPI,而现在手机大都采用MIPI接口,而MIPI接口又分为command mode和 video mode。command mode主要针对驱动内含有帧buffer(ram)的cpu屏进行操作的,主控只在需要更改显示图像的时候发送pixel数据,其他时候驱动芯片自己从内部buffer里取数据显示,这种屏一般分辨率比较小。command mode 还用来配置驱动芯片的内部寄存器video mode 主要针对没有驱动芯片内没有帧buffer(ram)的lcd进行操作的,主控要按照lcd的刷新率持续发送pixel数据。

 

MIPI-DSI是video mode 下一种应用于显示技术的串行接口,兼容DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set),以串行的方式发送像素信息或指令给外围,而且从外围中读取状态信息或像素信息,而且在传输的过程中享有自己独立的通信协议,包括数据包格式和纠错检错机制。

MIPI-DSI具备高速模式和低速模式两种工作模式,全部数据通道都可以用于单向的高速传输,但只有第一个数据通道才可用于低速双向传输,从属端的状态信息、像素等式通过该数据通道返回。时钟通道专用于在高速传输数据的过程中传输同步时钟信号。此外,一个主机端可允许同时与多个从属端进行通信。

 

 

 

5.LCD控制器

功能模块的实现其实是芯片里面集成了一个相应的控制器,比如IICIIC控制器,UARTUART控制器等,像其他功能模块一样LCD也有一个控制器,来实现图形信息的处理。LCD控制器可以通过编程支持不同LCD屏的要求,例如行和列像素数,数据总线宽度,接口时序和刷新频率等。LCD控制器的主要作用,是将定位在系统存储器中的显示缓冲区中的LCD图像数据传送到外部LCD驱动器,并产生必要的控制信号,例如RGB_VSYNC,RGB_HSYNC, RGB_VCLK等。

 
VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数

VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算

HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数

HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算
2)、帧的传输过程
VSYNC信号有效时,表示一帧数据的开始,   信号宽度为(VSPW +1)个HSYNC信号周期,即(VSPW +1)个无效行;

VSYNC信号脉冲之后总共还要经过(VBPD+ 1)个HSYNC信号周期,有效的行数据才出现; 所以,在VSYNC信号有效之后,还要经过(VSPW +1  + VBPD + 1)个无效的行;

随即发出(LINEVAL + 1)行的有效数据

最后是(VFPD + 1)个无效的行

3)、行中像素数据的传输过程
HSYNC信号有效时,表示一行数据的开始,信号宽度为(HSPW+ 1)个VCLK信号周期,即(HSPW +1)个无效像素;
HSYNC信号脉冲之后,还要经过(HBPD +1)个VCLK信号周期,有效的像素数据才出现;
随后发出(HOZVAL+ 1)个像素的有效数据;
最后是(HFPD +1)个无效的像素;

mipi 屏的传输时钟频率(CLKN,CLKP)等于(屏幕分辨率宽width+hsync+hfp+hbp)x ( 屏幕分辨率高height+vsync+vfp+vbp) x(RGB显示数据宽度) x 帧率/ (lane_num)/2。

一帧画面需要的数据量(单位bit):FRAME_BIT = (屏幕有效显示宽度+hsync+hfp+hbp) x ( 屏幕有效显示高度+vsync+vfp+vbp) x(RGB显示数据宽度24)

 一秒钟内需要传输的数据量(单位bps):FRAME_BIT  x  fps(帧率)。

 那为何要除以lane_num----因为mipi通讯协议中,一个CLOCK几个lane是可以同时传输数据的。

为何又要除以2----因为根据mipi通讯协议,CLK_N、CLK_P这两根时钟线的上升沿/下降沿可以获取到数据。

6.LCD调试总结

LCD调试分为两部分,lkkernel两部分,开机的时候,先是lk中的代码先运行,lk运行完成之后,再运行kernel中的代码。

 lk代码配置

1.添加lcm driver ,如图所示,在lcm文件夹中,创建一个driver的文件夹,文件夹名字为驱动名字。
一个driver的文件夹,文件夹名字为驱动名字。

 

2.在刚才创建的文件夹里面,再创建一个driver文件,以及相应的makefile文件。


 

3.Z:\test\base\vendor\mediatek\proprietary\bootable\bootloader\lk文件夹中,有project文件,有对应项目的mk文件,在“CUSTOM_LK_LCM=”中添加对应的驱动程序。如图所示:

 

4.lcm文件夹内找到driverlist,在里面添加项目所需要的driver

 

5.进行lk的编译,如图所示的文件夹,并打开Linux服务器,输入./build.sh P637S15 -m lk nocp 进行编译,这是在base文件夹下的无覆盖编译。./build.sh P637S15 -m lk这是在mod下的覆盖编译,即modproject修改mod中的common,而common来修改base。如果出现

## make completed successfully (01:49 (mm:ss)) ##,则编译成功,反之需要base文件中去查找log

 

 

Kernel代码配置

1.lk一样,如所示的路径Z:\test\base\kernel-3.18\drivers\misc\mediatek\lcm创建一个driver的文件夹,文件夹名字为驱动名字。

 

 

 

2.在刚才创建的文件夹里面,再创建一个driver文件,以及相应的makefile文件。

 

 

3.另外在Z:\test\base\kernel-3.18\arch\arm64\configs中,找到对应项目的config文件,然后添加驱动的文件夹名字。

 

 

 

4.driverlist.hdriverlist.c中,添加驱动的.c文件。跟lk类似。

6.进行kernel的编译,如图所示的文件夹,并打开Linux服务器,输入./build.sh P637S15 -i bootim nocp 进行编译,这是在base文件夹下的无覆盖编译。./build.sh P637S15 -m lk这是在mod下的覆盖编译,即modproject修改mod中的common,而common来修改base。如果出现## make completed successfully (01:49 (mm:ss)) ##,则编译成功,反之需要base文件中去查找log

到此为止,lkkernel的环境配置就到此结束了。

调试中遇到的问题总结

1.LCD寄存器赋值错误,在lk阶段时,屏幕无法正常显示,会出现黑白条纹。

这个是厂家的初始化代码给错了,我一直以为是配置环境出了问题,所以浪费了几天时间。

2.lcm_get_params函数中,没有设置DSI的工作模式转换成HS模式,lk阶段导致背光亮,但是屏幕不亮。

之后打电话给了厂家,厂家在自己的板子上调试好了代码,我配置好环境后还是不能亮,厂家提示我测+-5V的上电,IODVV的上电情况,以及reset上电情况,发现一切都正常。所以怀疑是初始化代码有误,所以联系了厂家来调试。

厂家首先验证了他的初始化代码的正确性,把联思芯片的驱动代码中的初始化代码,换成st7703的初始化代码,lk能进入,证明后来的初始化代码无误。

再次对比联思的驱动代码和st7703的驱动代码,发现没有把DSI的工作模式转化成HS模式,导致数据传输异常,所以会出现lk阶段导致背光亮,但是屏幕不亮。

3.在程序中换了正确的初始化代码之后,lk正常,可是kernel一直进不去。屏幕还是黑屏,经过测试,发现+-5V掉电了。

lk正常启动之后,发现背光一直亮着,这个时候,就可以认为读到kernel了,而可能是kernel内容出错了,因为要是没有读到kernellk会一直重复启动,背光也会一时暗一时亮。

这是后用adb检查了一下整个开机过程的log,发现LCM_ON=1;

Log导入到文档的命令 adb shell cat dev/kmsg > C:\Users\10226267\Desktop\55.txt

推测可能上电有问题,用示波器测了一下+-5V的电压,发现为0,所以推测kernel中有一种掉电行为。

4.推测是ESD CHECK中,触发了掉电。

先把kernel 代码中ESD CHECK关掉,编译,发现kernel正常亮了。

所以params->dsi.lcm_esd_check_table[0].para_list[0] = 0x9C;的值出错,可是查了芯片信息, 0x9C并没错,发现,初始化代码中, 0xBA寄存器中,读取 0x9C是以长包的形式读取,而MTK平台应该以短包形式读取,所以ESD CHECK有误。

后面做了几组实验,让ESD CHECK出错,在INIT中,加入+-5V上电程序,屏幕会闪。(RESUME函数中也有上电函数,所以又做了一组实验)

ESD CHECK出错,在INIT中,不加入+-5V上电程序,屏幕在进入kernel中黑屏,无法显示正常开机画面。

ESD CHECK有误,会对屏幕做RESETVSP&VSN会关掉),然后走kernel里面的INIT流程。

原创粉丝点击