ARM-Linux OpenGL ES & SDL

ARM-Linux OpenGL ES & SDL

 首先关于Opengl ES的,我们在网上搜到了一个大牛的博客,上面介绍的很详细,非常感谢这位大牛,才使我们的工作顺利进行,所以为了表示对这个大牛的感谢和学习,故自己也想造福后人。在次就不多做介绍,现链接如下:http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!274.entry

除了链接,我也把他写的内容转到这里来:

在ARM Linux上使用OpenGL
这两天在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/lib/libPicoGLU.so -lm hello.o /home/lxz/builtPicoGL/lib/libPicoGL.a /home/lxz/builtPicoGL/lib/libPicoGLU.a

不过在这里想强调一点:上面提到的大牛的博客中,有些地方写的不够详细,可能你开始看的时候会有点迷糊,我们一开始也不明白,后来做到后面遇到问题了才会反过来重新思考,在此就相关的地方我提前打个招呼。

“修改backends/vesafb/tk.c中,initialize_fbdev函数有关VarInfo的设置,改为适合你的LCD的” 这句话,是要把你的opengl里面程序的关于frambuffer 和开发板的LCD配置相符:

要修改点代码,但是我们老师把这段代码直接注释掉了也是可以的,所以你可以两种方法都试一下。

具体的代码所在文件路径我也附上

 

root/embeded-dev/linux-2.6.20.1-xmu-skyeye/arch/arm/mach-pxa

[root@localhost mach-pxa]# vi xmu255.c

[root@localhost mach-pxa]#

 

  }

 

??????;/usr/PicoGL/backends/vesafb/tk.c

         /* timing values taken from /etc/fb.modes (1280x1024 @ 75Hz) */

         VarInfo.xres_virtual = VarInfo.xres = 640;

         VarInfo.yres_virtual = VarInfo.yres = 480;

         VarInfo.pixclock = 0;

         VarInfo.left_margin = 0x54;

         VarInfo.right_margin = 16;

         VarInfo.upper_margin = 33;

         VarInfo.lower_margin = 10;

         VarInfo.hsync_len = 60;

         VarInfo.vsync_len = 2;

 

         VarInfo.xoffset = 0;

         VarInfo.yoffset = 0;

         VarInfo.nonstd = 0;

         VarInfo.vmode &= ~FB_VMODE_YWRAP; /* turn off scrolling */

 

         /* set new variable screen info */

         if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo)) {

                 fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",

                         strerror(errno));

                 exit(1);

         }

 

 

tatic struct pxafb_mode_info xmu255_fb_mode = {

        pixclock:       LCD_PIXCLOCK,   /* clock period in ps */

        bpp:            LCD_BPP,

        xres:           LCD_XRES,

        yres:           LCD_YRES,

        hsync_len:      LCD_HORIZONTAL_SYNC_PULSE_WIDTH,

        vsync_len:      LCD_VERTICAL_SYNC_PULSE_WIDTH,

        left_margin:    LCD_BEGIN_OF_LINE_WAIT_COUNT,

        upper_margin:   LCD_BEGIN_FRAME_WAIT_COUNT,

        right_margin:   LCD_END_OF_LINE_WAIT_COUNT,

        lower_margin:   LCD_END_OF_FRAME_WAIT_COUNT,

        sync:           LCD_SYNC,

        cmap_greyscale: 0,

};

 

/root/embeded-dev/linux-2.6.20.1-xmu-skyeye/include/asm/arch

 

 

#define LCD_PIXCLOCK          0

#define LCD_BPP                       16

#define LCD_XRES                      640

#define LCD_YRES                      480

#define LCD_HORIZONTAL_SYNC_PULSE_WIDTH       60

#define LCD_VERTICAL_SYNC_PULSE_WIDTH         2

#define LCD_BEGIN_OF_LINE_WAIT_COUNT          0x54

#define LCD_BEGIN_FRAME_WAIT_COUNT            33

#define LCD_END_OF_LINE_WAIT_COUNT                    16

#define LCD_END_OF_FRAME_WAIT_COUNT           10

#define LCD_SYNC                      (FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT)

#define LCD_LCCR0                     ( LCCR0_PAS)

#define LCD_LCCR3                     (LCCR3_PCP | LCCR3_Acb(0xff)| LCCR3_PixClkDiv(0x1) | LCCR3_Bpp(0x04))

我们继续。

中间还出现了找不到fb0 fd 等类似错误,解决的方法也在网盘上,下次加上去。

到这里opengl应该没有问题了,然后开始sdl

 sdl这个东东也很麻烦,从网上搜的很多资料里面都提到过要先设置环境变量,但是没有人具体说要在哪里设置,所以我们就不清楚,但是还是做了点修改,就是在/root下打开~/.bash_profile文件,将你所要使用的交叉编译工具链的路径加上去。

拿我们自己来说,我们添加的代码为:

PATH=/usr/local/arm/3.4.1/arm-linux-gcc

下面就开始交叉编译了。

:首先下载 SDL-1.2.3.tar.gz 

#tar zxvf SDL-1.2.3.tar.gz

#cd SDL-1.2.3

下面配置文件:

#./configure --prefix=/opt/libSDL --host=arm-linux --disable-video --disable-arts --disable-nasm --disable-video-x11 --disable-nas  --disable-joystick --disable-cdrom

或者是

#./configure --prefix=/tftpboot/root/usr --enable-video-fbcon --disable-video-qtopia --disable-video-photon --disable-video-direct --disable-video-ggi --disable-video-svga --disable-video-aalib --disable-video-dummy --disable-video-dga --disable-arts --disable-esd --disable-alsa --disable-video-x11 --disable-nasm --disable-debug --disable-joystick-amigaos --disable-joystick-beos --disable-joystick-bsd --disable-joystick-darwin --disable-joystick-dc --disable-joystick-linux --disable-joystick-macos --disable-joystick-mint --disable-joystick-win32 --disable-joystick --host=arm-linux --build=i386

这个命令的多少取决与你自己的情况,上面有很多disable or enable,是根据你自己的需要设置的,具体的每个东东的含义我也不清楚,只是看这有些自己认识需要的就enable了,其他的就参考人家的了。

#make

#make install

当前目录下应该有个test文件夹,里面是自带的测试程序,要把这些东东也编译一下。

#cd test

在test的程序中,会用到mouse。但是开发板没有该设备,故如果直接对test进行编译的话,在开发板上运行的时候会出现以下错误:

“can not open mouse"

这个问题有两种解决方案,我们采取的是第二种,方法如下:

1090* ./configure CC=arm-linux-gcc --target=arm-linux --host=arm-linux --enable-threads --enable-timers --enable-endian --enable-file --enable-oss --disable-alsa --disable-esd --disable-arts --disable-diskaudio --disable-nas --disable-esd-shared --disable-esdtest --disable-mintaudio --disable-nasm --disable-video-x11 --disable-video-dga --enable-video-fbcon --enable-video-directfb --enable-video-ps2gs --disable-video-xbios --disable-video-gem --disable-video-dummy --enable-video-opengl --enable-input-events --enable-pthreads --enable-video-picogui --enable-video-qtopia

其中enable和disable的选择需要根据个人情况而定

#make

#cp * /root/embeded-dev/fs/test/(在开发板的根目录下)

运行开发板,我们用的是NFS系统,进入根目录之后

#cd test

export SDL_NOMOUSE=1

#./testwin

应该就可以看到结果了 

解决“can not open mouse”的第二种方法,就是直接将代码屏蔽掉。这段代码所在的文件是你所要测试的程序的源文件

  sdl_nomouse = SDL_getenv("SDL_NOMOUSE");
  if ( ! sdl_nomouse ) {
  SDL_SetError("Unable to open mouse,do I have mouse?");
  //@FB_VideoQuit(this);
  //@return(-1);

 }

然后从头开始交叉编译,那么就不需要上面红色那个export命令了

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答1: SDL在不同平台上的移植方法略有不同,以下是SDL在Windows、LinuxArm-Linux上的移植方法: 在Windows平台上,可以通过以下步骤来移植SDL: 1. 下载SDL的Windows版本开发库,并将其解压到本地目录中。 2. 在Visual Studio中新建一个工程,并在工程中添加SDL的头文件路径和库文件路径。 3. 在工程中添加SDL的库文件,并将SDL.dll文件放入工程的运行目录中。 4. 使用SDL提供的API进行开发。 在Linux平台上,可以通过以下步骤来移植SDL: 1. 安装SDL的开发库,可以使用命令sudo apt-get install libsdl2-dev进行安装。 2. 在编译时加入SDL的库文件,并使用SDL提供的API进行开发。 在Arm-Linux平台上,可以通过以下步骤来移植SDL: 1. 在交叉编译环境中安装SDL的开发库。 2. 在编译时指定交叉编译器,并加入SDL的库文件。 3. 将生成的可执行文件拷贝到目标设备上,并将SDL的库文件拷贝到目标设备的库路径中。 4. 在目标设备上运行可执行文件。 以上是SDL在不同平台上的移植方法,具体实现可能需要根据具体情况进行调整。 ### 回答2: SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,可用于游戏开发和媒体应用程序。它提供了一套简单的API,用于处理音频、视频、图形和输入设备。 在Windows上进行SDL移植,可以按照以下步骤进行: 1. 下载SDL开发库的Windows版本,并解压到合适的目录中。 2. 在开发环境中设置SDL相关的编译选项和库路径,使得编译器可以找到SDL头文件和库文件。 3. 在项目中包含SDL的头文件,使用SDL的API编写代码。 4. 将SDL的库文件链接到项目中,以便在运行时可以正确地加载和使用SDL的功能。 在Linux上进行SDL移植,可以按照以下步骤进行: 1. 使用系统的包管理器安装SDL开发库,例如在Ubuntu上可以使用apt-get命令安装。 2. 在开发环境中设置SDL相关的编译选项和库路径,使得编译器可以找到SDL头文件和库文件。 3. 在项目中包含SDL的头文件,使用SDL的API编写代码。 4. 将SDL的库文件链接到项目中,以便在运行时可以正确地加载和使用SDL的功能。 在Arm-Linux上进行SDL移植,可以按照以下步骤进行: 1. 获取适用于Arm-LinuxSDL源码,并进行交叉编译,生成适用于Arm架构的SDL库文件。 2. 在开发环境中设置交叉编译工具链、SDL相关的编译选项和库路径,使得编译器可以找到SDL头文件和库文件。 3. 在项目中包含SDL的头文件,使用SDL的API编写代码。 4. 将交叉编译生成的Arm-Linux上的SDL库文件链接到项目中,以便在运行时可以正确地加载和使用SDL的功能。 总结而言,SDL的移植方法主要包括下载安装开发库、在开发环境中配置编译选项和库路径、包含头文件、链接库文件等步骤。具体的过程根据不同的操作系统和平台有所区别,但整体上都是相似的。 ### 回答3: SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,它提供了对图形、音频、输入设备等的统一访问接口。以下是在Windows、LinuxArm-Linux上进行SDL多平台移植的方法: 在Windows上移植SDL: 1. 下载SDL的Windows开发包,并解压到合适的位置。 2. 在工程中添加SDL的头文件路径和库文件路径。 3. 将SDL.dll拷贝到工程的可执行文件所在的目录下。 在Linux上移植SDL: 1. 在终端中使用包管理器安装SDL库和开发包。 2. 在编译时使用SDL的头文件路径和库文件路径,例如: gcc main.c -o main -lSDL2 在Arm-Linux上移植SDL: 1. 安装交叉编译器,并设置环境变量,以便能够编译针对Arm架构的程序。 2. 下载适用于Arm-LinuxSDL开发包,并解压到合适的位置。 3. 在交叉编译时使用交叉编译器的头文件路径和库文件路径,例如: arm-linux-gcc main.c -o main -I/path/to/SDL/include -L/path/to/SDL/lib -lSDL2 以上是SDL在Windows、LinuxArm-Linux上的简要移植方法。具体的移植过程可能会因操作系统版本、编译器等而有所不同,需要根据具体情况进行相应的调整和配置。移植时还需注意版本兼容性、库依赖关系等问题,确保移植后的程序能够正确运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值