2.2 DirectFB 图形系统实现图形加速
DirectFB 图形系统构建在FrameBuffer 图形引擎之上,是一个完整的硬件抽象层,提供了对每个图形操作的软件回馈,由于这一功能还没有被底层硬件支持,因此需要一种能够提取图形的硬件设备的支持。DirectFB 体系结构如图1 所示,DirectFB 图形芯片驱动程序访问显存映射的图形处理器I/O端口向图形处理器提交命令,即实际的硬件加速的启动是在用户空间完成的。
FrameBuffer是内核中的一种驱动程序接口,它将显示设备抽象为帧缓冲区,用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间直接进行读写操作,而读写操作可以立即反映到屏幕上。DirectFB 作为抽象层可以直接访问FrameBuffer,对它进行显卡工作模式(分辨率,颜色深度,时序),映射显存等设置,并在其上直接输出图形。这种在内核级实现图形的方案加快了显示速度,节省了系统资源,从而提高效率。
2.3 DirectFB 在嵌入式系统上的移植
Directvcn 依赖DirectFB 库实现功能,需要对DirectFB 进行移植。DirectFB 的交叉编译条件是在Linux 内核2.2 以上,并运行帧缓冲(Framebuffer),以及必要的依赖库,比如zlib、libjpeg、libpng、freetype 等。完成设计的软件开发环境是:
Ubuntu8.04 操作系统,嵌入式Linux 开发环境。使用ELDK4.1交叉编译器。步骤如下:
(1) 从http://www.directfb.org/downloads/Core/获取源代码DirectFB-
(2)交叉编译依赖库并安装到指定路径下:
-prefix=/usr/local/arm/eldk-4.1/usr/bin/arm-linux
(3)设置交叉编译环境变量,如PREFIX、LDFLAGS、CFLAGS、PKG_CONFIG_PATH 等路径,配置并交叉编译DirectFB-
(4) 在rootfs/etc 下为directvnc 编辑配置文件directfbrc,内容如下:
编译之前,去掉Makefile 中OMAP 驱动的编译,由于它是TI 的OMAP 系列CPU 专用的,在此包中缺少头文件,会引起编译错误。#make #make install 编译成功后在/usr/directfb 下会生成图形支持库的相关文件包。
3 嵌入式远程桌面控制的实现
3.1 Directvnc 及其功能框图
Directvnc 应用VNC 服务器所使用的远程帧缓冲协议(RFB)。其协议消息分为3 个阶段:握手、初始化和协议交互。
最初的握手阶段主要是对协议版本、像素数据的格式和编码类型进行协商。第二步对报文初始化,主要是本客户端和服务器端初始化消息。最后是正常的信息交互阶段,客户端发送请求,服务器端响应并送回结果。所有的消息都由一个消息类型字节和详细的消息数据组成。因此Directvnc 的运行流程大致可以分为登陆服务器,初始化连接,信息交互和退出4部分。如图2 所示。
3.2 Directvnc 的移植
DirectVNC系列的configure没考虑做移植的配置,所以有些依赖库的路径需要改正。比如libjpeg,它会默认使用系统/usr/lib 下的库。同理需要指定头文件:Xmd.h、keysymdef.h、jpeglib.h、jconfig.h、jmorecfg.h,或者直接从系统中复制过来。当然也可以写一个用于交叉编译的Makefile。由于版本不同数据定义更新,需要注意的是dfb.c 文件的第33 行:DFBCard-Capabilities caps 应修改成DFBGraphicsDeviceDescription caps;RFB 输入协议是基于键盘和多键鼠标设备的标准共站类型,输入事件也可以由其它非标准I/0 设备产生,由于本系统采用触摸屏输入实现控制,因此可以注释掉69-70 行:
4 结语
DirectFB 在嵌入式系统中的应用,充分利用了图像加速功能,减轻了CPU 的数据处理负担,提高了系统性能。随着其广泛的应用,嵌入式GUI 的性能也将得到提高。嵌入式远程桌面控制系统平台性能的优化方面有如下可行的改进方向:对硬件加速进行优化,即将加速模块从用户空间移到硬件的驱动中,GUI 中只需要用统一的接口调用硬件加速功能,同时在GUI 中添加对显卡芯片未提供的加速功能的软件实现,这样简化了GUI 维护,提高了系统的性能。对RFB 安全机制进行改进,即利用OpenSSL 密码算法函数库实现安全通信通道,或者在正常的协议交互中对输入输出数据进行算法简单高效的加密。