微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440上LCD驱动(FramBuffer)实例开发详解(一)

S3C2440上LCD驱动(FramBuffer)实例开发详解(一)

时间:08-15 来源:互联网 点击:

度,用VCLK计算,对应驱动中的hsync_len;

对于以上这些参数的值将分别保存到REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器中:(对寄存器的操作请查看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定义好的接口访问这些图形设备,从而不用去关心具体的硬件细节。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。下面来看一下在不同色位模式下缓冲区与显示点的对应关系:

帧缓冲设备为标准的字符型设备,在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中的定义如下:(只列出重要的一些)

struct fb_info {

int node;

int flags;

struct fb_var_screeninfo var;/*LCD可变参数结构体*/

struct fb_fix_screeninfo fix;/*LCD固定参数结构体*/

struct fb_monspecs monspecs;/*LCD显示器标准*/

struct work_struct queue;/*帧缓冲事件队列*/

struct fb_pixmap pixmap; /*图像硬件mapper*/

struct fb_pixmap sprite; /*光标硬件mapper*/

struct fb_cmap cmap; /*当前的颜色表*/

struct fb_videomode *mode;/*当前的显示模式*/

#ifdef CONFIG_FB_BACKLIGHT

struct backlight_device *bl_dev

struct mutex bl_curve_mutex;

u8 bl_curve[FB_BACKLIGHT_LEVELS]

#endif

#ifdef CONFIG_FB_DEFERRED_IO

struct delayed_work deferred_work;

struct fb_deferred_io *fbdefio;

#endif

struct fb_ops *fbops

struct device *device;

struct device *dev;/*fb设备*/

int class_flag;

#ifdef CONFIG_FB_TILEBLITTING

struct fb_tile_ops *tileops; /*图块Blitting*/

#endif

char __iomem *screen_base;/*虚拟基地址*/

unsigned long screen_size;/*LCD IO映射的虚拟内存大小*/

void *pseudo_palette;/*伪16色颜色表*/

#define FBINFO_STATE_RUNNING 0

#define FBINFO_STATE_SUSPENDED 1

u32 state;/*LCD的挂起或恢复状态*/

void *fbcon_par;

void *par;

};

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

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

struct fb_var_screeninfo {

__u32 xres;/*可见屏幕一行有多少个像素点*/

__u32 yres;/*可见屏幕一列有多少个像素点*/

__u32 xres_virtual;/*虚拟屏幕一行有多少个像素点*/

__u32 yres_virtual;/*虚拟屏幕一列有多少个像素点*/

__u32 xoffset;/*虚拟到可见屏幕之间的行偏移*/

__u32 yoffset;/*虚拟到可见屏幕之间的列偏移*/

__u32 bits_per_pixel;/*每个像素的位数即BPP*/

__u32 grayscale;/*非0时,指的是灰度*/

struct fb_bitfield red;/*fb缓存的R位域*/

struct fb_bitfield green;/*fb缓存的G位域*/

struct fb_bitfield blue;/*fb缓存的B位域*/

struct fb_bitfield transp;/*透明度*/

__u32 nonstd;/* != 0 非标准像素格式*/

__u3

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

网站地图

Top