微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解

嵌入式Linux之我行——S3C2440上LCD驱动(FrameBuffer)实例开发讲解

时间:11-20 来源:互联网 点击:

寄存器中:(对寄存器的操作请查看S3c2440数据手册LCD部分)

LCDCON1:17- 8位CLKVAL
6- 5位扫描模式(对于STN屏:4位单/双扫、8位单扫)
4- 1位色位模式(1BPP、8BPP、16BPP等)

LCDCON2:31 - 24位VBPD
23 - 14位LINEVAL
13 - 6位VFPD
5 - 0位VSPW

LCDCON3:25 - 19位HBPD
18 - 8位HOZVAL
7 - 0位HFPD

LCDCON4: 7 - 0位HSPW

LCDCON5:

4. 帧缓冲(FrameBuffer):

帧缓冲是Linux为显示设备提供的一个接口,它把一些显示设备描述成一个缓冲区,允许应用程序通过FrameBuffer定义好的接口访问这些图形设备,从而不用去关心具体的硬件细节。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。下面来看一下在不同色位模式下缓冲区与显示点的对应关系:

三、帧缓冲(FrameBuffer)设备驱动结构:

帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数,最大允许有32个FrameBuffer,定义在/include/linux/fb.h中的FB_MAX,对应于文件系统下/dev/fb%d设备文件。

1. 帧缓冲设备驱动在Linux子系统中的结构如下:

我们从上面这幅图看,帧缓冲设备在Linux中也可以看做是一个完整的子系统,大体由fbmem.c和xxxfb.c组成。向上给应用程序提供完善的设备文件操作接口(即对FrameBuffer设备进行read、write、ioctl等操作),接口在Linux提供的fbmem.c文件中实现;向下提供了硬件操作的接口,只是这些接口Linux并没有提供实现,因为这要根据具体的LCD控制器硬件进行设置,所以这就是我们要做的事情了(即xxxfb.c部分的实现)。

2. 帧缓冲相关的重要数据结构:
从帧缓冲设备驱动程序结构看,该驱动主要跟fb_info结构体有关,该结构体记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及对底层硬件操作的函数指针。在Linux中,每一个帧缓冲设备都必须对应一个fb_info,fb_info在/linux/fb.h中的定义如下:(只列出重要的一些)

structfb_info{
intnode;
intflags;
structfb_var_screeninfo var;
structfb_fix_screeninfo fix;
structfb_monspecs monspecs;
structwork_structqueue;
structfb_pixmap pixmap;
structfb_pixmap sprite;
structfb_cmap cmap;
structfb_videomode*mode;

#ifdefCONFIG_FB_BACKLIGHT
structbacklight_device*bl_dev;
structmutex bl_curve_mutex;
u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdefCONFIG_FB_DEFERRED_IO
structdelayed_work deferred_work;
structfb_deferred_io*fbdefio;
#endif

structfb_ops*fbops;
structdevice*device;
structdevice*dev;
intclass_flag;
#ifdefCONFIG_FB_TILEBLITTING
structfb_tile_ops*tileops;
#endif
char__iomem*screen_base;
unsignedlongscreen_size;
void*pseudo_palette;
#defineFBINFO_STATE_RUNNING0
#defineFBINFO_STATE_SUSPENDED1
u32 state;
void*fbcon_par;
void*par;
};

其中,比较重要的成员有structfb_var_screeninfo var、structfb_fix_screeninfo fix和structfb_ops*fbops,他们也都是结构体。下面我们一个一个的来看。

fb_var_screeninfo结构体主要记录用户可以修改的控制器的参数,比如屏幕的分辨率和每个像素的比特数等,该结构体定义如下:

structfb_var_screeninfo{
__u32 xres;
__u32 yres;
__u32 xres_virtual;
__u32 yres_virtual;
__u32 xoffset;
__u32 yoffset;
__u32 bits_per_pixel;
__u32 grayscale;

structfb_bitfield red;
structfb_bitfield green;
structfb_bitfield blue;
structfb_bitfield transp;

__u32 nonstd;
__u32 activate;
__u32 height;
__u32 width;
__u32 accel_flags;


__u32 pixclock;
__u32 left_margin;
__u32 right_margin;
__u32 upper_margin;
__u32 lower_margin;
__u32 hsync_len;
__u32 vsync_len;
__u32 sync;
__u32 vmode;
__u32rotate;
__u32 reserved[5];
};

而fb_fix_screeninfo结构体又主要记录用户不可以修改的控制器的参数,比如屏幕缓冲区的物理地址和长度等,该结构体的定义如下:

structfb_fix_screeninfo{
charid[16];
unsignedlongsmem_start;
__u32 smem_len;
__u32 type;
__u32 type_aux;
__u32 visual;
__u16 xpanstep;
__u16 ypanstep;
__u16 ywrapstep;
__u32 line_length;
unsignedlongmmio_start;
__u32 mmio_len;
__u32 accel;
__u16 reserved[3];
};

fb_ops结构体是对底层硬件操作的函数指针,该结构体中定义了对硬件的操作有:(这里只列出了常用的操作)

structfb_ops{

structmodule*owner;

//检查可变参数并进行设置
int(*fb_check_var)(structfb_var_screeninfo*var,structfb_info*info);

//根据设置的值进行更新,使之有效
int(*fb_set_par)(structfb_info*info);

//设置颜色寄存器
int(*fb_setcolreg)(unsignedregno,unsignedred,unsignedgreen,
unsignedblue,unsignedtransp,structfb_info*info);

//显示空白
int(*fb_blank)(intblank,structfb_info*info);

//矩形填充
void(*fb_fillrect)(structfb_info*info,conststructfb_fillrect*rect);

//复制数据
void(*fb_copyarea)(structfb_info*info,conststructfb_copyarea*region);

//图形填充
void(*fb_imageblit)(structfb_info*info,conststructfb_image*image);
};

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top