首页 > 代码库 > LCD驱动程序设计

LCD驱动程序设计

一、LCD简介

要说LCD,先需要了解什么是液晶。1888年,奥地利植物学家莱尼茨尔发现一些有机物融化后变成液体。随后一位德国专家发现这些液体具有某些晶体的特征,比如折射性,于是他就称呼这种液体叫“液态晶体”,也就是“液晶”,液晶属于一种有机化合物,分子形状为长棒状,长度大约10NM,在不同的电流作用下,分子会做有规律的旋转,这样对光线产生了一定的控制,很多液晶分子构成一个像素,而很多像素又构成了完整图像。


LCD是Liquid Crystal Display的简称,液晶显示器按驱动方式分为静态驱动、简单矩阵驱动及主动矩阵驱动。其中,简单矩阵又可细分扭转向列型(TN)和超转向列型(STN)两种,而主动矩阵驱动则以TFT为主。

1、TN型驱动液晶,是LCD中最基本的,其他LCD都以TN型改进而得。它只能将入射光旋转90度,视角只有30度,色彩单一、对比度低,用于电子表和电子计算器。

2、STN型驱动液晶,可将入射光旋转180度至270度,也改善了视角。它通过搭配彩色滤光片,将单色矩阵的任意像素分成3个子像素成红绿蓝,再经由三色按比例调和,显示出逼近全彩模式的色彩。

3、TN与STN都采用场电压驱动方式,如果显示尺寸加大,中心部分对电极变化的反应时间就会变长,显示器的速度跟不上。为了解决这个问题,主动矩阵驱动TFT被提出。它通过晶体管显示信号开启或关闭液晶分子的电压,从而避免了显示器对电场效应的依靠。

LCD

一块LCD屏显示图像不但需要LCD驱动器,还需要LCD控制器。很多主芯片CPU集成了LCD控制器。依据显示原理:作为帧同步信号的vsync,每发出一个脉冲,都意味着新的一副图像数据开始传送。而作为行同步信号的hsync,每发出一个脉冲,都表明新的一行图像资料开始发送。

LCD技术参数

1、可视面积

2、可视角度

3、点距

4、色彩度

5、对比值

6、亮度值

7、响应时间

时序图

所有LCD显示图像的原理都是从上到下,从左到右的。一副图像可以看做是一个矩形,由很多排列整齐的点一行一行组成,这些点称之为像素。


VSYNC:帧同步信号

每发出一个脉冲,表示新的一屏图像数据开始传送

HSYNC:行同步信号

每发出一个脉冲,表示新的一行图像数据开始传送。

VCLK:像素时钟信号

每发出一个脉冲,表示新的一个点图像数据开始传送。

LEND:行结束信号

VBPD:表示在一帧图像开始时,帧同步信号以后的无效的行数,对应驱动中的upper_margin;

VFBD:表示在一帧图像结束后,帧同步信号以前的无效的行数,对应驱动中的Lower_margin;

VSPW:表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;

HBPD:表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,对应驱动中的left_margin;

HFPD:表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,对应驱动中的right_margin;

HSPW:表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len;

二、帧缓冲驱动程序设计

显存示意图:


帧缓冲

FrameBuffer从本质上讲是图形设备的硬件抽象。对开发者而言,FrameBuffer是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。通过不断的向frame buffer中写入数据,显示控制器就自动的从frame buffer中取数据并显示出来。

帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到/dev/fb31,而/dev/fb则为当前缺省的帧设备,通常指向/dev/fb0。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31.

访问帧缓冲设备

实例演示:

1、清除LCD

dd if=/dev/zero of=/dev/fb0 bs=240 count=320

2、运行应用程序,画图

./LCD

3、清除LCD

dd if=/dev/zero of=/dev/fb0 bs=240 count=320

4、显示图片

cat 7.bmp > /dev/fb0

系统架构


设备描述

Linux内核使用struct fb_info来描述帧缓冲设备。

strut fb_info

{

...........................................................................................................................................

struct fb_var_screeninfo var;   //可变参数

struct fb_fix_screeninfo fix;    //固定参数

............................................................................................................................................

struct fb_ops *fbops;   //帧缓冲操作

..............................................................................................................................................

}

可变参数

struct fb_var_screeninfo记录了用户可以修改的显示参数,包括屏幕分辩率等。

struct fb_var_screeninfo
{
_u32 xres;   /*visible resolution*/
_u32 yres;   
_u32 xres_virtual;    /*virtual resolution*/
_u32 yres_virtual;
_u32 xoffset;   /*offset from virtual to visible*/
_u32 yoffset; /*resolution*/
...............................................................................
_u32 height; /* height of picture in mm*/
_u32 width; /*width of picture in mm*/

................................................................................
};

固定参数

struct fb_fix_screeninfo记录了用户不能修改的显示控制器参数,如显示缓存的物理地址等。

struct fb_fix_screeninfo
{
char id[16];   //identification string eg "TT Builtin"
unsigned long smem_start; //start of frame buffer mem 
                                 //physical address
_u32 smem_len;      //length of frame buffer mem
_u32 type;           //see FB_TYPE_ *
_u32 type_aux;      //interleave for interleaved planes
_u32 visual;   //see FB_VISUAL_ *
_u16 xpanstep;  //zero if no hardware panning
_u16 ypanstep;  //zero if no hardware panning
_u16 ywrapstep; //zero if no hardware ywrap
_u32 line_length;  //length of a line in bytes
unsigned long mmio_start; //start of memory mapped I/O
//physical address
_u32 mmio_len; //length of memory mapped I/O
_u32 accel;  //indicate to driver which
               //specific chip/card we have
_u16 reserved[3];  //reserved for future compatibility
}

操作集

struct fb_ops 包含了对控制器进行操作的函数指针。

struct fb_ops
{
struct module *owner;
int (*fb_open)(struct fb_info *info, int user);
int (*fb_release)(struct fb_info *info, int user);
/*for framebuffers with strange non linear layouts or that do not
work with normal memory mapped access */
ssize_t(*fb_read)(struct fb_info *info, char _user *buf, size_t count, loff_t *ppos);
ssize_t(*fb_write)(struct fb_info *info, const char _user *buf, size_t count, loff_t *ppos);
.............................................................................................
/*set the video mode according to info->var*/
int (*fb_set_par)(struct fb_info *info);
.............................................................................................
}

设备注册

Linux内核使用register_framebuffer函数注册一个帧缓冲设备。

int register_framebuffer(struct fb_info *fb_info)

Linux内核使用unregister_framebuffer函数注销一个帧缓冲设备。

int unregister_framebuffer(struct fb_info *fb_info)

三、LCD驱动程序测试(同上)