本结构中的所有成员函数都实现了应用程序对帧缓冲区设备的控制。重点介绍其中的三种比较重要的操作[5]:
(1) 读/写(read/write)操作,相当于读/写屏幕缓冲区。
(2) 映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中不能直接访问物理缓冲区地址。为此,Linux在文件操作 file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,通过映射操作,将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上显示图形。
(3) I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等等。ioctl的操作是由底层的驱动程序来完成的。
4 帧缓冲驱动程序
通过上文的分析可知,编写帧缓冲设备驱动程序要完成的工作其实不多,主要有以下步骤:
(1) 编写初始化程序。首先初始化结构体fb_info,填充其中成员变量参数,包括屏幕的显示模式和显示色彩数。然后分配LCD显示缓冲区,在Linux下,可以通过Kmalloc函数来分配一片连续的空间。采用的LCD显示方式是320*240像素,8位灰度,因此分配的缓冲区大小为320*240*8/8=75KBite。缓冲区通常分布在片外SDRAM中,起始地址在LCD控制寄存器中。最后设置LCD控制器参数。调用一个register_framebuffer(&fb_info)将fb_info登记入内核。初始化部分代码如下:
int __init s3c2410fb_int(void)
{
struct s3c2410fb_info *fbi;
int ret;
fbi=s3c2410fb_int_fbinfo(); // 初始化结构s3c2410fb,包括结构fb_info,LCD硬件参数保存到结构中。
|