基于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文件夹下,运行
出现游戏界面了!至此移植完成。