基于i.mx6q平台的mGBA模拟器移植

基于i.mx6q平台的mGBA模拟器移植

之前进行基于i.mx6q平台的NES模拟器移植,今天来移植mGBA模拟器,我在网上搜索了一下,国内好像没人移植过这个模拟器,那只能摸着石头过河了。经过一番摸索,踩了很多坑,终于移植成功了,今天分享给大家。

硬件环境:
我采用的是i.mx6q开发板,屏幕分辨率为800x480

系统环境:
linux 4.1.15
根文件系统用的是开发板自带的根文件系统,里面已经移植好了alsa相关的库文件

mGBA源码地址:https://toscode.gitee.com/motoedy/mgba

移植主要步骤:
1.先编译SDL1.2,将编译好的SDL库下的lib下的文件都考到开发板的/usr/lib中(mGBA描述最好使用SDL2,但是也支持SDL1.2,SDL2移植起来比较费劲,我尝试移植了虽然成功了,但是有些问题不建议使用,最终选择使用SDL1.2)

2.编译mgba,将编译好的文件夹(我的叫GBA-Game)原路径复制到开发板(保持路径一致)

3.考进去两个游戏xx.gba,拷到GBA-Game文件夹的bin文件夹下

4.运行(目前usb键盘ok)

开始移植:

1.先编译SDL1.2:

$ cd SDL-1.2-main
$ ./configure  --disable-video-directfb --disable-video-qtopia --disable-video-dummy --disable-video-dga --disable-arts   --disable-cdrom --disable-video-x11 --disable-nasm --enable-video-fbcon --enable-joystick --enable-input-tslib --prefix=/home/SDL1.2  --target=arm-linux --host=arm-linux

$ make

$ make install

–prefix=/home/SDL1.2 (改成自己的路径)
将编译好的SDL库下的lib下的文件都考到开发板的/usr/lib中

2.编译mGBA:
修改mgba下的CMakeLists.txt文件
添加交叉编译器的编译选项,没有无法编译通过(大家改成自己的交叉编译器)
修改如下:

elseif(UNIX)
	set(USE_PTHREADS ON)

	if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
		add_definitions(-D_GNU_SOURCE)
                set(CMAKE_C_FLAGS "-march=armv7-a -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi")
                set(CMAKE_CXX_FLAGS "-march=armv7-a -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi")
                set(CMAKE_C_LDFLAGS = "-lSDL")
	endif()

新建一个文件名字为CrossCompile.cmake,内容如下,保存该文件与mgba/CMakeLists.txt同目录

set(CMAKE_SYSTEM_NAME Linux)

set(TOOLCHAIN_PATH /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi)

set(CMAKE_C_COMPILER /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++)

找到mgba/src/third-party/libpng/pngpriv.h 文件直接在这里顶上加上一行,
#define PNG_ARM_NEON_OPT 0
否则编译报错

在mgba/src/platform/cmake/路径下放FindSDL1.2.cmake(这步就是添加SDL1.2支持,将原有FindSDL2.cmake改名为FindSDL1.2.cmake),修改

SET(SDL_SEARCH_PATHS
  ~/Library/Frameworks
  /Library/Frameworks
  /usr/local
  /usr
  /sw # Fink
  /opt/local # DarwinPorts
  /opt/csw # Blastwave
  /opt
  ${SDL_PATH}
 /home/SDL1.2 //添加路径
)

FIND_PATH(SDL_INCLUDE_DIRS SDL.h
  HINTS
  $ENV{SDLDIR}
  PATH_SUFFIXES include/SDL include
  PATHS ${SDL_SEARCH_PATHS} ${SDL_LIBRARIES_TEMP}/../..
  PATHS ${SDL_SEARCH_PATHS}/include/SDL
 /home/SDL1.2/include/SDL //添加路径
)

FIND_LIBRARY(SDL_LIBRARIES_TEMP
  NAMES SDL
  HINTS
  $ENV{SDLDIR}
  PATH_SUFFIXES lib64 lib
  PATHS ${SDL_SEARCH_PATHS} ${SDL_INCLUDE_DIRS}/../..
  PATHS ${SDL_SEARCH_PATHS}/lib
  /homeSDL1.2/lib  //添加路径
)


因为没有用GL ES需要屏蔽掉,进入mgba/src/platform/sdl/main.c文件做如下修改,否则报错编译不过,修改如下

/*
#ifdef BUILD_GL
	if (mSDLGLCommonInit(&renderer)) {
		mSDLGLCreate(&renderer);
	} else
#elif defined(BUILD_GLES2) || defined(USE_EPOXY)
#ifdef BUILD_RASPI
	mRPIGLCommonInit(&renderer);
#else
	if (mSDLGLCommonInit(&renderer))
#endif
	{
		mSDLGLES2Create(&renderer);
	} else
#endif
	{
		mSDLSWCreate(&renderer);
	}
*/       
       mSDLSWCreate(&renderer);

	if (!renderer.init(&renderer)) {
		mArgumentsDeinit(&args);
		mCoreConfigDeinit(&renderer.core->config);
		renderer.core->deinit(renderer.core);
		return 1;
	}

基本修改好了,进入mgba目录,建立build文件夹

mkdir build
cd build/
cmake -DCMAKE_INSTALL_PREFIX:PATH=/home/GBA-Game  -DCMAKE_TOOLCHAIN_FILE= ../CrossCompile.cmake ..

make

make install

将GBA-Game文件夹整体拷到开发板下,记住要和你在pc机上的目录一致,然后考进去两个游戏xx.gba,拷到GBA-Game文件夹的bin文件夹下,运行

出现游戏界面了!至此移植完成。

重装机兵2

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值