hsy75编辑前言: 有关于DFB的使用,在嵌入式系统里面,GUI使用越来越多 经常遇到有关DFB的移植啊,编译啊等等问题:个人在自己经验上总结如下: 1 DFB的tar包里面有一个README文档,移植前可以看看 2 可以用make直接编译解包后的src文件 3 这个时候DFB会自动根据系统进行configure 4 如果configure成功,DFB会生成自己的Makefile 5 这时候用生成的Makefile就可以 问题经常出在,configure的过程中,这时候,我们可以进入到src目录,然后执行 ./configure 命令 这时候dfb会自动生成configure.log文件,你可以逐一查询是否符合你的配制思路 当然,上述步骤同时也是所有public lib的基本编译思路
DirectFB与GTK+的依赖关系:
一、这就关系到Linux图形领域的关系: 1 Linux 图形领域的基础设施 1.1 X Window 1.2 SVGALib 1.3 FrameBuffer 1.4 LibGGI
2 Linux 图形领域的高级函数库 2.1 Xlib 及其他相关函数库 2.2 SDL 2.3 Allegro 2.4 Mesa3D 2.5 DirectFB
3 面向嵌入式Linux 系统的图形用户界面 3.1 MicroWindows/NanoX 3.2 OpenGUI 3.3 Qt/Embedded 3.4 MiniGUI
上面可以看到,DitectFB是建立在Linux图形领域基础设施上高级函数库。 重点是FrameBuffer(因为DirectFB是基于它的): FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。 FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer 之上进行图形编程,还需要完成其他许多工作。举个例子来讲,FrameBuffer 就像一张画布,使用什么样子的画笔,如何画画,还需要你自己动手完成。
二、再来看一下DirectFB: DirectFB 是专注于 Linux FrameBuffer 加速的一个图形库,并试图建立一个兼容 GTK 的嵌入式 GUI系统。它以可装载函数库的形势提供对加速 FrameBuffer 驱动程序的支持。其作用如下: 1.最大限度的硬件加速 2.提供高级图形运算包括多层 alpha 颜色混合模式 3.利用现有标准无需改变内核 4.不依赖于库(除 libc 以外) 5.满足 HMP 的需求 具体: 1 图形运算 DirectFB 支持以下图形运算。这些运算可以由硬件来完成如果芯片组驱动支持的话,或者有软件封装: 矩形填充/绘制 三角形填充/绘制 画线 alpha 颜色混合(a.k.a. texture alpha) 以一个恒定 alpha 混合因子进行颜色混合(a.k.a. alpha modulation) 九种不同的颜色混合函数对应各个源和目标来支持所有的端口 色彩调制(a.k.a. color modulation) 源色彩键 目标色彩键 2 视窗系统 DirectFB 集成了一个快速的支持半透明的视窗系统。 窗体用了 ARGB 以像素为单位进行颜色混合。并且每个窗体都有属于自己的一个全局透明度。 3 资源管理器 DirectFB 针对视频存储有自己的资源管理器。 像显示层输入设备这样的资源能被锁定进行互斥访问。例:全屏游戏,DirectFB 能对像显示层,窗体以及各种通用的 surfaces 这 样的图形目标提供抽象。 从窗体切换到全屏以及返回到窗体的编程工作被最小化设置到所期望的合作级别。 4 图像设备驱动 对于硬件加速 DirectFB 使用了可载入的驱动模块。 5 输入设备 DirectFB 支持以下输入设备: standard keyboards serial and PS/2 mice joysticks devices using the linux input layer infrared remote controls (using lirc) iPAQ touchscreen ucb 1x00 touchscreen Microtouch touchscreen Sony PI Jogdial 直接查询硬件或者使用事件缓冲器也是有可能的。 6 加载图像 DirectFB 支持以下图像格式,这些格式可以直接加载到 DirectFB surfaces : JPEG (using libjpeg) PNG (using libpng2) GIF (integrated, no library required) various other image formats (using Imlib2) 7 视频回放 DirectFB 支持以下视频格式,这些视频格式可以直接绘制到 DirectFB surfaces: video4linux (/dev/video) mpeg1/2 (using libmpeg3) AVI (using avifile) MOV (using OpenQuicktime) macromedia flash (using libflash) 8 字体渲染 DirectFB 支持反别名文本绘制以及字体支持,它支持以下字体格式: DirectFB bitmap font TrueType (using FreeType2)
三、DirectFB 体系结构
1 访问图形硬件设备 DirectFB 依靠内核中 framebuffer 驱动(/dev/fb)所提供现有的接口来访问图形硬件。这就意味着 DirectFB 必须要有一个能正常工作的 framebuffer 驱动才能正常运行。有些芯片组需要在 linux 内核中有特定的 framebuffer 驱动。对于那些没有被支持的芯片组 VESAframebuffer 也能正常工作(但会有些限制)。不管图形加速功能有没有被用到,DirectFB都将用 framebuffer 驱动来完成一下任务: 设置视频模式(分辨率,色深,计时) 从 framebuffer 到卡的内存映射 framebuffer 可视端口的改变(为双缓冲) 当一张卡被 DirectFB 所支持并且当前有一个特定芯片组的 framebuffer 驱动存在于 linux内核当中,DirectFB 将在上面提到的任务中额外的使用framebuffer 驱动来完成以下任务: 内存映射到卡的内存映射 io 端口 关闭 framebuffer 驱动内部加速 当执行一个特殊的图形运算时,DirectFB 芯片组驱动将访问图形硬件的内存映射 IO 端口来提交命令给卡的加速引擎。这意味着,实际的硬件加速完成完全从用户共享空间。
四、GTK+ GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。 按照最开始的说法,GTK+应该是在DirectFB之上GUI工具。有下面的依赖关系: 1.gtk基于xlib,xlib基于libc,libc基于linux内核;DirectFB基于libc,libc基于linux内核,framebuffer可以看做是一种设备。 2. gtk-> gtk+ gdk glib xlib/framebuffer 这里想补充一点,
五、DirectFB的安装: 第一种方法: 直接用FC6的“软件包管理者”升级,但是其支持的版本都是0.9.25.1,而现在最新是的版本是1.1.1。 第二种方法: 到官网下载最新的版本,http://www./index.php?path=Main%2FDownloads。 现在没有FC6的安装方法,只能参照FC3的了:
FC3下DirectFB的安装 1、下载下面两个包并解压:
tar -xzf DirectFB-1.0.0.tar.gz tar -xzf DirectFB-examples-1.0.0.tar.gz
2、安装DirectFB-1.0.0
cd /home/DirectFB-1.0.0 ./configure make make install
3、安装DirectFB-examples-1.0.0
a).vi /boot/grub/grub.conf在kernel后面加上vga=0x0317把frambuffer启动,如:
#****************start*************# title Fedora Core (2.6.9-1.667) root (hd0,0) kernel /vmlinuz-2.6.9-1.667 ro root=LABEL=/ rhgb quiet vga=0x0317 initrd /initrd-2.6.9-1.667.img #****************stop**************# #更新数据库: b).updatedb
c).locate directfb.pc
找到directfb.pc的路径,例如我的是这样的:
/usr/local/lib/pkgconfig/directfb.pc /home/DirectFB-1.0.0/directfb.pc /home/DirectFB-1.0.0/directfb.pc.in
d).接着设置环境,将第3步得到的pkgconfig库目录加入环境之中:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig (这样只能在当前终端可以运行,关机后还得自已运行些命令,才能运行dfb程序,如要永久性加入可这样: 如你用的是root用户,可以vi /root/.bash_profile中加入: PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig )
e). ./configure make
f).make install
g).将指定directfb的库目录: vi /etc/ld.so.conf在最后一行加入:/usr/local/lib,保存退出。 ldconfig 然后reboot重启计算机... 4、测试例子,cd src/ 下,运行:
./df_andi
另外补充一点点framebuffer的设置 vga=0x317 如下表 代码: | 640x480 800x600 1024x768 1280x1024 ----+------------------------------------- 256 | 0x301 0x303 0x305 0x307 32k | 0x310 0x313 0x316 0x319 64k | 0x311 0x314 0x317 0x31A 16M | 0x312 0x315 0x318 0x31B
PKG_CONFIG_PATH这个变量吧 当我们安装了DFB之后没有设置好PKG_CONFIG_PATH变量在你要编译DFB的代码时,他会提示你的lib文件找不到或者提示lib版本太低,这就奇怪啦,为什么刚安装了DFB还会说找不到库文件呢?其实就是这个变量做的好事。 到这里我有必要说说到底pkgconfig 是怎么来的.为什么要这样去设置,当安装了pkgconfig-x.x.x这个包后,就多出了pkg-config,它就是需要PKG_CONFIG_PATH的东东来设置变量。 其实说白了pkg-config就是向configure程序提供系统信息的程序,用来在编译脚本中向编译器传递头文件包含路径或库文件路径.比如软件的版本啦,库的版本啦,库的路径啦,等等这些信息只是在编译其间使用。事实上,要求库的提供者,提供一个.pc文件。你可以 ls /usr/lib/pkgconfig 下,会看到许多的*.pc,用文本编辑器打开会发现里边都是关于软件的版本啦,库的版本啦,库的路径的信息。 所以,configure就是靠这些信息判断你的软件版本是否符合要求。并且得到这些东西所在的位置,要不你要的东西去哪里找呀。 移植过程: 1. download the source package from www. 2. unzip the package and run "./configure --prefix=/11 --exec-prefix=/12 --host=arm-linux " 3.run "make" to compile DFB.它报一个error "/DirectFB-1.4.0/gfxdrivers/matrox", 如果matrox 不是必须的,可以直接在graphics/Makefile 中将MATROX_DIR置空即可。 4. make install 所有的头文件将拷贝到/11中,所有的库文件将拷贝到/12中。如果编写应用程序,只需将路径指向这两个目录即可。 5. 程序运行 (1)将--exec-prefix指定的目录复制到开发板上,对于上面的例子,就是将12及其子目录拷贝到开发板的根目录中,否则程序会报错, 例如“DirectFB/core/system: No system found”等。 (2)export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/12/lib,否则系统会报错,例如“error while loading shared libraries: libdirectfb-1.4.so.0” (3)运行程序,即可。 2012-9 转贴2013-2 编辑1,加入lib基本编辑思路 ref:http://www.360doc.com/content/12/0224/22/1671317_189408497.shtml
|