无意苦争春,一任群芳妒.零落成泥碾作尘,只有香如故 ——陆游《卜算子》
前面分析了probe函数,分析代码无疑是学习驱动最无聊的事,分析那么多也累了,但是不要放弃,这篇我们将给出我们的操作函数,学习了操作函数,我们就可以写应用程序,对我们的LCD“肆意妄为”了。
这些操作结构体在fbmem.c下。
当然,先给出我们的文件操作结构体:
static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.unlocked_ioctl = fb_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = fb_compat_ioctl,
#endif
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
.get_unmapped_area = get_fb_unmapped_area,
#endif
#ifdef CONFIG_FB_DEFERRED_IO
.fsync = fb_deferred_io_fsync,
#endif
.llseek = default_llseek,
};
首先说一下我们应用程序的相关操作:
1、读
/写(
read/write)
/dev/fb:相当于读
/写屏幕缓冲区。例如用
cp /dev/fb0 tmp 命令可将当前屏幕的内容拷贝到一个文件中,而命令
cat tmp > /dev/fb0 则将图形文件
tmp显示在屏幕上。
2、映射(
map)操作:由于
Linux 工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此,
Linux 在文件操作
file_operations 结构中提供了
mmap 函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
3、
I/O控制:对于帧缓冲设备,对设备文件的
ioctl操作可读取
/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。
ioctl 的操作是由底层的驱动程序来完成的。
再来说一下我们操作/dev/fb0的步骤:
1、打开/dev/fb0设备。
2、用
ioctl 操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。
3、将屏幕缓冲区映射到用户空间(
mmap)。
4、映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。
最后分析一下我们的这几个操作函数:
1、write、read、ioctl函数就不用说了,和前面差不多。
但read()、write()和 mmap()操作需要函数fb_get_fix()的支持.因此需要重新实现函数fb_get_fix()。
2、framebuffer最主要的函数mmap()。
mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如