大家好,欢迎做客光帅读书圈,这里是知识的搬运工,我们继续GUI引擎,今天学习FB节点。
01
—
什么是fb
对于Linux系统设备,framebuffer机制模仿显卡的功能,将显卡硬件结构抽象为一系列的结构数据,可以通过framebuffer的读写直接对显存进行操作。Linux系统中,抽象成一个字符节点(/dev/fb)。要实现显示功能,将fb映射到进程空间后,就可以直接进行读写操作,写操作会直接反映在屏幕显示的画面上。
为啥要这样做?是因为Linux系统中,大多数硬件环境没有集成显卡,同事不同的平台,LCD硬件配置存在差异。为了简化上层开发人员的开发方式,而封装出来的一个接口。
图 1 数据流图
如图1所示,为设备打开显示流程
02
—
fb的使用介绍
Framebuffer是个字符设备,主设备号为29,对应于/dev/fb%d设备文件。
通常如下方式(前面的数字表示次设备号)
0 = /dev/fb0 第一个fb设备
1 = /dev/fb1第二个fb设备
Fb设备也是一种的普通的内存设备,可以读写其内容。例如,屏幕抓屏:cp /dev/fb0 myfilefb 虽然可以像内存设备(dev/mem)一样,对其read,write,seek以及mmap。但区别在于fb使用的不是整个内存区,而是部分显存.
fb与应用程序的交互,对于用户程序而言,它和其他的设备并没有什么区别,用户可以把fb看成是一块内存。既可以向内存中写数据,也可以读数据。Fb的显示缓冲区位于内核空间,应用程序可以把此空间映射到自己的用户空间,进行操作。
在应用程序中,操作/dev/fbn的一般步骤如下:
(1)打开/dev/fbn设备文件。
(2)用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。
(3)用mmap()函数,将屏幕缓冲区映射到用户空间。
(4)映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。
03
—
驱动框架
如下图所示,fb内部函数的实现,属于驱动层。
图2 驱动层次接口
(1)struct fb_info
一个帧缓冲区对应一个struct fb_info结构,它包括了帧缓冲设备的属性和操作的完整集合,每个帧设备都有一个fb_info结构体。
(2)struct fb_ops
结构体用来实现对帧缓冲设备的操作,这些函数需要驱动开发人员编写,
(3)struct fb_fix_screeninfo
该结构体记录了用户不能修改的固定显示控制器参数。这些固定的参数如缓冲区的物理地址、缓冲区的长度等等。
(4)struct fb_var_screeninfo
结构体中存储了用户可以修改的显示器控制参数,例如屏幕分辨率、透明度等等。
(5)struct fb_cmap
结构体中记录了颜色板信息,即调色板信息。,用户空间可以通过ioctl()的FBIOGETCMAP和 FBIOPUTCMAP命令读取或设定颜色表。
图 3 结构体直接的关系
图4 驱动内部调用流程
如图3、图4所示,为结构体之间的关系,以及内部调用的接口流程。
04
—
mmap映射
framebuffer驱动最重要的功能就是给用户提供一个进程空间映射到实际的显示物理内存的接口(mmap)。当用户图像数据buffer和内核虚拟地址空间buffer对应的都是同一块物理内存时,资源数据拷贝到用户图像数据buffer时,即是直接拷贝到显示物理内存了。
图5 内存映射说明
以上就是本周的技术分享,知识的搬运工,给大家呈现最好最没有的技术文档。你的点赞和关注将是我最好的动力。