微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 在ARM Linux上使用OpenGL

在ARM Linux上使用OpenGL

时间:11-09 来源:互联网 点击:
这两天在ARM上跑了一个OpenGL,应该说是OpenGL|ES的软件包,虽然我觉得可能最后我不会使用这个软件包,但是还是记录下来以备忘记。

先全局介绍下,首先,什么是OpenGL和OpenGL|ES。OpenGL是一套绘图函数的标准,OpenGL|ES是OpenGL中针对嵌入式系统的一套函数子集。OpenGL|ES的官方是http://www.khronos.org/opengles/, 上面有更多的信息。需要注意的是,OpenGL仅仅是标准,而如果你要使用OpenGL,则需要找到可以实现这些OpenGL标准函数的程序库或源代码。 目前,在ARM这种一般没有图形加速器的平台上,OpenGL|ES的实现都是靠软件的。主要的OpenGL|ES程序库有:Klimt,Vincent (ogles),TinyGL等。Google一下,可以看到它们的主页。这些实现基本上都是基于X11、Qt/E这样的窗口平台的。我用的软件包叫做 PicoGL,它是TinyGL的一个分支,不同之处就在于PicoGL支持直接在Framebuffer上输出图像。PicoGL是一位台湾同胞写的, 他的主页http://jserv.sayya.org/。但是这个软件包的源码极其难找,我用的是一位很牛的同事搜到的,地址是http://people.openmoko.org/jserv/graphics/picogl-20051108.tar.bz2。

要使用这个软件包还必须有支持软件浮点的交叉编译器,我们一般用的arm-linux-gcc 2.95.3/3.3.2/3.4.1等都不支持软件浮点,这需要我们重新编译一个。编译一个交叉编译器,引用Crosstool作者Dan Kegel的话,used to be a scary prospect,requiring iron will,days if not weeks of effort……幸好有Crosstool这个工具,如果你的机器好网速快,输入个指令,差不多1个多小时就可以编译出来。crosstool的主页http://kegel.com/crosstool/,下载地址http://kegel.com/crosstool/crosstool-0.43.tar.gz。

首先制作交叉编译器,先以root用户登陆,建立交叉编译器安装目录,而且把目录所有者改为你的普通用户

# mkdir /opt/crosstool

# chown /opt/crosstool lxz

# chgrp /opt/crosstool users

然后以普通用户登陆,解压缩和安装

# tar xvzf crosstool-0.43.tar.gz

# cd crosstool-0.43

# ./demo-arm-softfloat.sh

crosstool会从网上下载需要的源码包,然后编译,最后安装。crosstool相关的资料可以看http://kegel.com/crosstool/current/doc/crosstool-howto.html。然后在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu里面就会有支持软件浮点的交叉编译器了。

然后解压缩picogl,修改picogl的代码。

首先是picogl的一处bug,在backends/vesafb/tk.c的第一行增加宏

#define _FB_TK_

然后把backends/vesafb/glx_impl.h里面的

struct fb_fix_screeninfo FixedInfo;

struct fb_var_screeninfo VarInfo, OrigVarInfo;

修改为

#ifdef _FB_TK_

struct fb_fix_screeninfo FixedInfo;

struct fb_var_screeninfo VarInfo, OrigVarInfo;

#else

extern struct fb_fix_screeninfo FixedInfo;

extern struct fb_var_screeninfo VarInfo, OrigVarInfo;

#endif

这是因为有好几个文件调用了backends/vesafb/glx_impl.h,如果不这么改,会出现多重定义错误。

然后,为了让你的程序使用picogl更方便些,最好再改个地方include/GL/glx.h

#include GLX_IMPL_HEADER

改为你喜欢的方式,指向backends/vesafb/glx_impl.h

修改backends/vesafb/tk.c中,initialize_fbdev函数有关VarInfo的设置,改为适合你的LCD的。

然后配置

# cd PicoGL

# CC=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc ./configure --with-backend=vesafb --host=arm-softfloat-linux-gnu --prefix=/home/lxz/builtPicoGL

说明下,CC=设置交叉编译器的位置,--with-backend=vesafb指定使用FB作为显示设备,host=arm- softfloat-linux-gnu设定交叉编译,--prefix=/home/lxz/builtPicoGL设定编译后库和示例程序安装位置。

然后

# make

# make install

在/home/lxz/builtPicoGL/lib里就有PicoGL的库了,把动态库文件拷贝到arm-linux根文件系统的/lib 里面,把/home/lxz/builtPicoGL/bin里的程序拷贝到arm-linux文件系统的任何地方,然后制作和烧写文件系统映像(或者使 用NFS),执行,就可以看到结果了。

当你编译一个使用PicoGL库的程序(假设叫做hello.c)时,需要输入

# arm-softfloat-linux-gnu-gcc -c -I /home/lxz/PicoGL/include -I /usr/include hello.c

# arm-softfloat-linux-gnu-gcc -o hello -L /home/lxz/builtPicoGL/lib/libPicoGL.so -L /home/lxz/builtPicoGL/l

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top