[春天]DirectFB v1.3.0图形库在嵌入式linux上的移植

因为要参加2009年的某比赛(暂时小小的保密一下),我们的项目要做的是——使用了水平倾角传感器和加速度传感器的——具有简单物理引擎的——健身益智类游戏。
这个项目的第一站和第二站就是解决图形库和传感器的问题。
qt是个好东西,封装完善,还有诺基亚这个牛后台狂顶它……
可惜我们的板子没有一颗4核的core2处理器,也没有nVidia的4核显卡,所以,鉴于QT的超低执行速度带来的噩梦,绣球不给她。
移植什么库呢?
我第一想到的是allegro,这个是一个专业的、跨平台的、牛的游戏开发库,它已经不只是图形库了,只要是游戏的各个方面他都有。它的demo很爽。哈哈。而且,我恰好用过。
它支持framebuffer。
可是移植它遇到了很多困难,现在想想,好像是找不到模块的问题,而且这个库是为pc写的,为x86架构做了很多优化,而且不支持触摸屏(鼠标驱动没有触摸屏设备或者封装tslib,要改也不是不行,只是麻烦得很)。最终我放弃了。
搜阿搜阿,好了正题到了,终于到DirectFB了。
DirectFB是一个基于framebuffer的“图形库”,它的主要领域是嵌入式,GTK+有针对与DirectFB的实现噢!DFB做底层。
当然我们暂时永不到gtk+。他还支持触摸屏,tslib是当初移植小板的qt时候顺便移的,就用它吧。
现在跑几个demo看看,速度刚刚滴~哈哈
好了说移植:
先是环境
博创的 pxa270 板子
博创的 pxa270A 编译链3.4.6不带软浮点,注意噢,多了一个A
博创的 pxa270A blob无源码
我修改的博创的 pxa270内核2.6.9 修改了网卡驱动,暂时没改flash分区
下载吧首先:
DirectFB 1.3.0 源码
DirectFB example 1.2 例子
freetype 2.3.9 它依赖的矢量font库
giflib 4.1.6 gif库,可选,跑demo必须
jpegsrc v6b jpeg库同上
libpng 1.2.35 png库同上
tslib 1.4 小板内核必须,触摸屏库
tslib就不说了,根据小板的触摸屏走向修改了几个xy,太久了,忘了。
tslib其实可以不需要的,因为DirectFB支持一些常用的触摸屏,但是我们手上的内核使用的是input event
看到有人搜索tslib1.4下载,链接到这里了,那么就在这里放一下下载链接好了。
这个其实是用svn同步下来的,trunk里面正好是1.4的版本号。
svn co svn://svn.berlios.de/tslib/trunk/tslib tslib
其他的无非就是指定一下编译链CC什么的,指定一下编译选项CFLAGS.LIBS什么的
configure make make install 老一套了
我习惯用脚本来干,这是例子
#!/bin/sh
export CC=arm-linux-gcc
export AR=arm-linux-ar
export LD=arm-linux-ld
export RANLIB=arm-linux-ranlib
export PREFIX=/mnt/yaffs/libjpeg
export EXEC_PREFIX=/mnt/nfs/libjpeg
./configure –prefix=${PREFIX}
–exec-prefix=${EXEC_PREFIX}
–host=arm-linux
–target=arm-linux
下面是重头戏,DirectFB的配置与修改
这个库的configure里面有个地方有逻辑问题
这一段是我的分析过程,急着去买菜或者去食堂或者约会的同学可以跳过了。
问题是运行后提示 can’t find system,大概是这样,systems是一些模块的目录,fbdev之类的实现图形的底层接口模块。
也就是说找不到目录。好类,我调试,我grep -R “上面的错误提示” .
进去,找了一下具体path是哪个变量,我看到模块加载的函数在lib/direct/modules.c里,156行 dir = opendir( directory->path );
我直接printf directory->path,好发现问题,它的路径合并了prefix和exec_prefix,寻找宏,在modules.h里75行处,有个宏MODULEDIR,又grep,这个宏是gcc传进来的,
根据我gcc的经验,传全局宏的方法是-DXXXXX于是我搜索,发现在lib/direct/Makefile的296297行,添加了一个SYSROOT的变量在MODULEDIR的前面,于是再grep SYSROOT,发现了,这个值与prefix重合,按理说这个变量只有在configure时启用–with-sysroot的时候才有的,我再grep,好了,问题所在,configure的27714-27723行,逻辑错误,直接全部#注释,空留一个SYSROOT=,搞定
好了,跳过上一段的朋友,如果你是着急去约会,我就要说你了,约会在乎这几分钟吗?难道(他、她)没有放你鸽子过吗?
好了编译,依然是脚本,请注意这些选项,是锤炼过的,注意修改路径,还有我打开debug选项,因为我是nfs挂载调试的,正式使用需要关掉并且strip它们
#!/bin/sh export CC=arm-linux-gcc export AR=arm-linux-ar export LD=arm-linux-ld export RANLIB=arm-linux-ranlib export TSLIB_CFLAGS="-I/home/cat/tslib-1.4/build/include" export TSLIB_LIBS="-L/home/cat/tslib-1.4/build/lib -lts" export FREETYPE_LIBS="`/mnt/nfs/freetype/bin/freetype-config --libs`" export FREETYPE_CFLAGS="`/mnt/nfs/freetype/bin/freetype-config --cflags`" export CFLAGS="-I/mnt/yaffs/libpng/include -I/home/cat/workspace/jpeg-6b -I/mnt/yaffs/libgif/include" export LDFLAGS="-L/mnt/yaffs/libpng/lib -L/home/cat/workspace/jpeg-6b" export LIBS="-lpng -ljpeg" ./configure --prefix=/mnt/yaffs/DirectFB/ --exec-prefix=/mnt/nfs/DirectFB --with-sysroot=/mnt --host=arm-linux --target=arm-linux --enable-x11=no --enable-osx=no --enable-voodoo=no --enable-mmx=no --enable-sse=no --enable-fbdev=yes --enable-gif=yes --enable-jpeg=yes --enable-video4linux=no --with-gfxdrivers=none --with-inputdrivers=keyboard,linuxinput,tslib --with-tests --with-sysroot=/mnt/yaffs/DirectFB --without-smooth-scaling --enable-freetype=yes --enable-debug
下面是example
#!/bin/sh export CC=arm-linux-gcc export AR=arm-linux-ar export LD=arm-linux-ld export RANLIB=arm-linux-ranlib export DIRECTFB_CFLAGS="-I/mnt/yaffs/DirectFB//include/directfb -D_REENTRANT" export DIRECTFB_LIBS="-L/mnt/nfs/DirectFB/lib -ldirectfb -lfusion -ldirect -lpthread" export CFLAGS="-I/mnt/yaffs/libpng/include" export LDFLAGS="-L/mnt/yaffs/libpng/lib" export LIBS="-lpng" ./configure --prefix=/mnt/yaffs/DirectFB-example/ --exec-prefix=/mnt/nfs/DirectFB-example --host=arm-linux --target=arm-linux --enable-debug
好了,打开板子,把目录nfs挂上去,设置LD_LIBRARY_PATH
执行例子,我建议首先执行df_dok这个是测benchmark的,需要移好了png和jpeg和gif,效果不错,很快。
我这个运行警告,设置ywrap参数非法的问题(panning error),google了一下,开发者说有些嵌入式不支持,警告很正常:
===================================
On Sun, Nov 02, 2008 at 12:28:34PM +0100, Collin Gregory wrote:
> Hi everyone,
>
> I know this problem has been treated so many times, but i didn’t find any
> tips to solve it…
>
> I’m using uvesafb for my fb manager, and when i try to launch vlc with
> directfb , i have always the same error : Panning Display failed (x=0 y=0
> ywrap=0 vbl=1)
It is simply a warning and it used to be printed even when the fb driver
didn’t support panning. Your application should still work (albeit
without page flipping).
I just pushed some fixes yesterday which should also prevent the
warning from being printed when the driver doesn’t support panning.
> What is annoying me is the ywrap=0 , does it means that ywrap is not
> activated ?
Yes.
=====================================
我的有CreatSuface失败的问题,不知道是哪个模块没打开的缘故,不过很多都可以跑了
也可以df_input,测试输入的,键盘和触摸屏都可以。
这时候是不是完了呢?不是,还要校准触摸屏。运行arm-linux-dfbpenmount(不知道在哪?死了算了),屏幕出现两个十字,点完了出现让你吧minx miny maxx maxy之类的填到inputdrivers/penmount/penmount.c 99行,rebuild。
好了,可以开始DirectFB之旅了,谢谢观赏
我猜您可能还喜欢:
1 条评论 »
RSS feed for comments on this post. TrackBack URL
健身的,顶一下!益智的,再顶一下!游戏,不顶都不行!release那天我要首批试用哈!