1 DirectFB体系结构
1.1 DirectFB简介
DirectFB项目是由德国Convergence公司推动的Open source计划的一部分,它是专门为满足嵌入式设备要求而开发的小巧、强大、灵活和易于使用的图形系统,并且试图成为一个建构于Linux Framebuffer Device之上的新图形标准。它在FrameBuffer的基础上提供了图形加速、输入设备处理提取、透明窗口和多重显示层的功能,能够对嵌入式系统GUI有较好的支持。与那些通用的嵌入式GUI系统相比,它具有非常简洁、高效的体系结构和硬件图形加速功能。
1.2 DirectFB体系结构
(1)DirectFB访问硬件显卡
DirectFB依赖已有的内核接口即帧缓冲设备(/dev/fb)访问图形处理器,也就是说DireetFB需要一个正在工作的帧缓冲驱动。Linux内核有专门的帧缓冲驱动支持某些图形处理器。对于不支持的图形处理器,内核提供VE—SA帧缓冲(这种帧缓冲有一些限制)。DirectFB利用帧缓冲设备做如下工作:
◆设置显卡工作模式(分辨率,颜色深度,时序)
◆映射显存
◆改变帧缓冲视口(针对双缓冲)
如果某种显卡被DirecFB支持并且在Linux内核中也有这种图形处理器的帧缓冲驱动,DirectFB利用帧缓冲设备做如下额外的工作:
◆映射显存IO端口
◆关闭帧缓冲驱动中自带的加速功能
针对具体的图形操作(例如图片拷贝),DirectFB加速驱动访问显存映射的图形处理器I/O端口向图形处理器提交命令。也就是说真正的硬件加速完全是在用户空间实现。这样DirectFB就可以对它支持的图形处理器提供最大限度的硬件图形加速。上层APl支持DirectFB的有:XdirectFB、DirectFBGL、GTK+、DFBTerm、DFBSee、DFBPoint、MythTV、Qt on DirectFB、SDL等。
(2)DirectFB访问输入设备
DirectFB使用Linux内核提供的标准设备接口访问输入设备,而不是直接访问输入硬件。具体的结构如图1所示。
2 DirectFB加速驱动原理
本节结合笔者的硬件平台来说明如何实现DirectFB加速驱动,笔者所用的平台是MPC8540,图形处理器是Fujitsu MB86296。要实现DirectFB加速驱动,需要有以下几个模块:系统、图形加速器、屏幕及图层。其中系统是指帧缓冲和硬件管理。DirectFB支持的系统有dev/fb、osx、sdl、xll、/dev/mem等。系统可以在DirectFB应用程序配置文件directfbrc中配置。屏幕是指输出设备,如LCD。图层代表独立的图像缓冲区,一般是在显示的时候自动由硬件融合,硬件一般采用alpha技术融合。图层数量的多少取决于图形处理器,一般复杂的图形处理器都支持多层显示。一层内容的改变不影响其他层的内容。
DirectFB驱动的几点基本要素是:
①必须赋给驱动一个唯一的名字并且用如下宏实现:DFB_GRAPHICS_DRIVER(MB86296)。
②上面的宏需要定义6个函数供DirectFB Core使用,即初始化/关闭驱动、初始化/关闭加速重获驱动元数据。
③在驱动中需要实现的函数有以下6个。
a)static int dnver_probe(GraphicsDevice*device);
如果系统支持某种硬件此函数应该返回非零值,它用DirectFB Core来探测哪个驱动支持系统硬件。
b)static void driver_get_info(GraphicsDevice *device, GraphicsDriverInfo *info);
些函数用来设驱动信息。
c)static DFBResult driver_init_driver (GraphicsDevice *device, GraphicsDeviceFuncs *funcs, void *driver_data, void *device_data, CoreDFB *core);
初始化驱动。在成功获得所有需要的资源后驱动应该注册屏幕和层。同时也需要通过funcs返回硬件加速函数列表。实现方式如下所示。