寄存器中:(对寄存器的操作请查看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); }; |