- LCD 显示原理
LCD(Liquid Crystal Display)是利用液晶分子的物理结构和光学特性进行显示的一种技术。液晶分子具有以下的特性:。
- 液晶分子是介于固体和液体之间的一种棒状结构的大分子物质;
- 在自然形态下具有光学各向异性的特点,在电(磁)场作用下,呈各向同性的特点。
- LCD 的显示原理是利用了液晶的特性,将液晶置于两片导电玻璃基板之间,在上下玻璃基板的两个电极作用下,引起液晶分子扭曲变形,改变通过液晶盒光束的偏振状态,实现对背光源光束的开关控制。若在两片玻璃间加上彩色滤光片,玻璃面上即可实现彩色图像显示。
- LCD 一般有以下几项衡量显示效果的指标:
- 物理分辨率:表示 LCD 可以显示的点的数目,为一个固定值。同样的尺寸下,分辨率越高,显示的画面越细致。
- 色饱和度:表示 LCD 色彩鲜艳的程度。显示器是由红色(R)、绿色(G)、蓝色(B)三种颜色光组合成任意颜色的, 如果 RGB 三原色越鲜艳,则 LCD 显示的颜色范围越广。
- 亮度:表示 LCD 在白色画面下明亮的程度。亮度是直接影响画面品质的重要因素,LCD 的亮度一般由背光脚控制,其电压由 PWM 产生,可以被调节。
- 对比度:表示 LCD 上同一点最亮时(白色)与最暗时(黑色)的亮度的比值,高的对比度意味着相对较高的亮度和呈现较好的锐利度。
- TFT-LCD 屏是目前嵌入式系统应用的主流,其时序如图1.1所示。
图 1.1 TFT-LCD波形时序
表 1.1 显示时序图中名词解释
名词 | 说明 |
VSYNC | 每发出一个脉冲,表明屏幕上刷入一帧新的数据 |
HSYNC | 每发出一个脉冲,表明屏幕上刷入一行新的数据 |
VBPD | 每帧开始时需要插入的帧同步周期无效行数 |
VFPD | 每帧结束时到下一帧同步周期之前的无效行数 |
HBPD | 每行开始时需要插入的像素时钟周期数 |
HFPD | 每行结束时需要插入的像素时钟周期数 |
VSYNC | 表示帧同步脉冲的宽度 |
HSYNC | 表示行同步信号的宽度 |
VCLK | 像素时钟信号 |
VDEN | 数据有效标志信号 |
在帧同步以及行同步的头尾都必须留有回扫时间,即图 1.1 中的(HBPD + 1)和(HFPD +1)为行回扫时间, (VBPD + 1)和(VFPD + 1)为帧回扫时间。该时序安排起源于 CRT 显示器电子枪偏转所需要的时间,但后来因其成为实际工业标准,所以 TFT 屏也包含了回扫时间。根据图 1.1 的显示时序图可以得到如图 1.2 所示的 FrameBuffer 可见区域表示图。
图 1.2 FrameBuffer 可见区域表示图
- 龙芯FB驱动屏参代码
在ls2xFb.c驱动源码中找到_G_lpLs2xLcdPanels结构体数组。如下代码所示屏参列表:
static LS2X_LCD_PANEL_CB _G_lpLs2xLcdPanels[ENUM_SUPPORT_RES_NUM] = {
[ENUM_800X480_RES] = {
.uiResX = 800,
.uiResY = 480,
.uiVirResX = 800,
.uiVirResY = 480,
.uiOffsetX = 0,
.uiOffsetY = 0,
.uiRedMask = 0xF800,
.uiGreenMask = 0x07E0,
.uiBlueMask = 0x001F,
.uiBitsPerPixel = 16,
.uiBytesPerPixel = 2,
#if defined(ls2k)
.uiPixelClk = 30,
.uiRefresh = 60,
.uiLeftMargin = 50,
.uiRightMargin = 36,
.uiUpperMargin = 22,
.uiLowerMargin = 15,
.uiHsyncLen = 10,
.uiVsyncLen = 8,
.pvArg = LW_NULL,
#elif defined(ls2h)
.uiPixelClk = 45,
.uiRefresh = 60,
.uiLeftMargin = 48,
.uiRightMargin = 40,
.uiUpperMargin = 22,
.uiLowerMargin = 17,
.uiHsyncLen = 92,
.uiVsyncLen = 2,
#endif /* defined(ls2h) */
},
[ENUM_800X600_RES] = {
.uiResX = 800,
.uiResY = 600,
.uiVirResX = 800,
.uiVirResY = 600,
.uiOffsetX = 0,
.uiOffsetY = 0,
.uiRedMask = 0xF800,
.uiGreenMask = 0x07E0,
.uiBlueMask = 0x001F,
.uiBitsPerPixel = 16,
.uiBytesPerPixel = 2,
.uiPixelClk = 38,
.uiRefresh = 60,
.uiLeftMargin = 104,
.uiRightMargin = 24,
.uiUpperMargin = 14,
.uiLowerMargin = 1,
.uiHsyncLen = 80,
.uiVsyncLen = 2,
.pvArg = LW_NULL,
},
.
.
.
}
一般有新的LCD屏需要配置的话,在该数组中添加新屏参数数组;
现以京东方TDA104-001V02型号屏作示类,一般在配置屏参时要找到LCD芯片手册中的屏幕参数那张节。如下图3.1是TDA104-001V02 屏参:
图 3.1 TDA101-001V02
在知道这些时序后就可以配置新的屏参参数了,如下所示代码即为新屏配置数据:
[ENUM_1024X768_RES] = {
.uiResX = 1024, // 对应的图3.1中 HVD
.uiResY = 768, // 对应的图3.1中 VVD
.uiVirResX = 1024, // 默认与uiResX 一致
.uiVirResY = 768, // 默认与uiResY 一致
.uiOffsetX = 0, // 默认0
.uiOffsetY = 0, // 默认0
.uiRedMask = 0xF800, // 默认,和其它屏配置相同
.uiGreenMask = 0x07E0, // 默认,和其它屏配置相同
.uiBlueMask = 0x001F, // 默认,和其它屏配置相同
.uiBitsPerPixel = 16, // 默认,和其它屏配置相同
.uiBytesPerPixel = 2, // 默认,和其它屏配置相同
.uiPixelClk = 15384, //按图3.1 FDCLK= 65MHZ,可以参考其它屏算出
.uiRefresh = 60, // 默认,和其它屏配置相同
.uiLeftMargin = 160, // 对应的图3.1中 HBP
.uiRightMargin = 24, // 对应的图3.1中 HFP
.uiUpperMargin = 29, // 对应的图3.1中 VBP
.uiLowerMargin = 3, // 对应的图3.1中 VFP
.uiHsyncLen = 136, // 对应的图3.1中 HSW
.uiVsyncLen = 6, // 对应的图3.1中 VSW
.pvArg = LW_NULL,
},