现在的位置: 首页 > 技术文章 > 正文

LINUX驱动框架之Framebuffer驱动框架

2018年11月06日 技术文章 ⁄ 共 1949字 ⁄ 字号 LINUX驱动框架之Framebuffer驱动框架已关闭评论

长时间不看,一些基础知识确实忘得差不多了,得慢慢捡起来,从网上搜了一篇关于Framebuffer的文章,记录一下:

(节选自 https://blog.csdn.net/gqb_driver/article/details/12918547)

一、基本概念

帧缓冲(Framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置及存放方式,这些都是由帧缓冲设备驱动本身来完成。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色会自动在屏幕上显示,下一小节重点讲解各种模式下缓冲区与显示点的对应关系。

帧缓冲设备为标准字符设备,主设备号为29,对应于/dev/fbn设备文件。应用程序可以通过打开读写此设备文件而讲视频及图像数据输出到显示设备上。在接下来的博文中会介绍用户态如果操作帧缓冲设备的方法,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。 Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的,用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer设备驱动来完成的,但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池,CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处理,应用程序也可以直接读写这个水池的内容。在嵌入式系统中一般没有专门的显存,而仅仅是从RAM(SDRAM)空间中分配一段显示缓冲区。

如下图所示,看看Framebuffer的软件架构到底长什么样子:

framebuffer

framebuffer

Framebuffer帧缓冲设备给用户态提供的读写接口file_operations实际由fbmem.c文件里的特定file_operatins结构对象来提供,而特定帧缓冲设备fb_info结构体的注册、注销及其中成员的维护,尤其是fb_ops中的成员函数的实现则由对应的xxxfb.c文件实现,fb_ops中的成员函数最终会操作LCD控制器的寄存器。


1、什么是framebuffer?

(1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备。帧缓冲(framebuffer)

是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用

户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。

(2)从驱动来看,fb是一个典型的字符设备,而且创建了一个类/sys/class/graphics

(3)framebuffer的使用

1):打开framebuffer设备文件: /dev/fb0

2):获取framebuffer设备信息 #include <linux/fb.h>

3):mmap做映射

4):填充framebuffer

FB驱动框架相关代码:drivers\video 这个目录中

 

总结:framebuffer驱动框架总览

fb的驱动框架代码主要涉及到以下的4个文件:

(1)drivers/video/fbmem.c。主要任务:1、创建graphics类、注册FB的字符设备驱动、提供register_framebuffer接口给具体framebuffer驱动编写着来注册fb设备的。

本文件相对于fb来说,地位和作用和misc.c文件相对于杂散类设备来说一样的,结构和分析方法也是类似的。

(2)drivers/video/fbsys.c。这个文件是处理fb在/sys目录下的一些属性文件的,例如register_framebuffer函数中fb_init_device函数就是存在这个文件中

(3)drivers/video/modedb.c。这个文件是管理显示模式(譬如VGA、720P等就是显示模式)的

(4)drivers/video/fb_notify.c。异步通知函数,例如fb_notifier_call_chain函数就在这个文件中

×