您的位置:首页 > Web前端

有关于directFB和freebuffer的学习

2016-04-07 13:52 330 查看
参考网址:网址1网址2网址3网址4

DirectFB 项目是由德国 Convergence 公司推动的 Open source 计划的一部分,它是专门为满足嵌入式设备要求而开发的小巧、强大、灵活和易于使用的图形系统,并且试图成为一个建构于 Linux Framebuffer Device 之上的新图形标准。它在 FrameBuffer 的基础上提供了图形加速、输入设备处理提取、透明窗口和多重显示层的功能,能够对嵌入式系统
GUI 有较好的支持。与那些通用的嵌入式 GUI 系统相比,它具有非常简洁、高效的体系结构和硬件图形加速功能。DirectFB依靠内核中的Framebuffer设备驱动(/dev/fb)所提供的现有接口来访问图形硬件。这就意味着DirectFB必须要有一个能够正常工作的Framebuffer设备驱动才能正常运行。有些芯片组需要在Linux内核中有特定的Framebuffer驱动。

directFB向上提供了什么接口:

概述:directFB最主要的是设置环境变量,其所有功能块都是通过.so文件,在上层应用(如Qt等)执行的时候,动态加载的。

1.

2.

3.

directFB向下层的frameBuffer的交互:
概述:主要是通过gfxdriver模块和下层的frameBuffer交互。交互时通过共享内存实现的,那么共享地址是怎么传递的呢?

1.调用dfb_fbdev_open()打开framebuffer设备(如:“/dev/fb0”);
2.调用ioctl( dfb_fbdev->fd, FBIOGET_FSCREENINFO, &shared->fix)获取显卡内存和类型等固定信息;

3. 把framebuffer设备文件映射进虚拟内存,并保存内存基址;
4.调用dfb_surface_pool_initialize初始化平面内存池。
5.通过ioctl获取屏幕可变信息和调色板等信息。

frameBuffer运行的时候,可以看到/dev/fb0,fb1...。

frameBuffer(帧缓冲)概述:

 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。这些都是由Framebuffer设备驱动来完成的。 
    帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到 /dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0,在嵌入式系统中支持一个显示设备就够了。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。分别对应/dev/fb0-/dev/fb31。

通过/dev/fb,应用程序的操作主要有这几种: 
1. 读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。 
2. 映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。而帧缓冲设备可以通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址上,然后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。 
3. I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,屏幕大小等相关参数。ioctl的操作是由底层的驱动程序来完成的。

对frameBuffer的操作如下

//打开显示设备  

fbfd = open("/dev/fb0", O_RDWR);
 

//获取屏幕信息,屏幕信息保存在finfo里面

if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo))
 

{  

printf("Error:reading fixed information.\n");
 

exit(2);  

 }  

相关概念之平面池( Surface
Pool):

待添加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: