一、移植gba模拟器到linux系统/开发板
一、移植gba到linux系统
1、下载必要的工具和库
sudo apt install build-essential cmake pkg-config git \
libsdl2-dev libzip-dev libedit-dev libelf-dev libinih-dev \
liblua5.4-dev libavcodec-dev libavfilter-dev libavformat-dev \
libavutil-dev libswscale-dev libswresample-dev libpng-dev libminizip-dev
2、下载源码并编译
git clone https://github.com/mgba-emu/mgba.git
cd mgba
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
3、运行
# 基本运行
mgba /path/to/your/game.gba
# 全屏运行,更接近开发板上的显示效果
mgba -f /path/to/your/game.gba
# 以3倍窗口缩放运行
mgba -3 /path/to/your/game.gba
停止
ctrl+z/c

效果:

二、移植gba到linux开发板
1、下载安装 ST 官方 SDK
从 ST 官网或开发板供应商获取 SDK 安装包,安装到 /opt/st/stm32mp1/。

解压:执行.sh

在此可看到

激活 SDK 环境(每次编译前必须执行)
source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
验证:

2、交叉编译 SDL 1.2
下载源码
wget https://www.libsdl.org/release/SDL-1.2.15.tar.gz
tar xzf SDL-1.2.15.tar.gz
cd SDL-1.2.15

配置
./configure \
--host=arm-ostl-linux-gnueabi \
--prefix=/usr \
--enable-video-fbcon \
--disable-video-x11 \
--disable-video-directfb \
--disable-video-qtopia \
--disable-video-dga \
--disable-video-dummy \
--disable-arts \
--disable-esd \
--disable-pulseaudio \
--disable-cdrom \
--disable-nasm
结果:

编译
make -j$(nproc)
make install DESTDIR=$(pwd)/../sdl1.2-deploy

确认库架构
file …/sdl1.2-deploy/usr/lib/libSDL-1.2.so.0.11.4

3、交叉编译 mGBA 0.8.4
说明:mGBA 0.11 以上版本仅支持 SDL2,而 SDL2 的 KMSDRM 在 STM32MP157 上存在兼容性问题。
因此选择 mGBA 0.8.4,它同时支持 SDL 1.2 和 SDL 2。
下载源码
wget https://github.com/mgba-emu/mgba/archive/refs/tags/0.8.4.tar.gz -O mgba-0.8.4.tar.gz
tar xzf mgba-0.8.4.tar.gz
cd mgba-0.8.4

创建工具链文件 toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER /home/lnh9000/Desktop/file_gba/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /home/lnh9000/Desktop/file_gba/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++)
set(CMAKE_C_FLAGS "-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -O2")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -O2")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/home/lnh9000/Desktop/file_gba/sdl1.2-deploy/usr/lib")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/home/lnh9000/Desktop/file_gba/sdl1.2-deploy/usr/lib")
修改源码以适配 800×480 全屏

src/platform/sdl/main.c(第 132-133 行附近)
renderer.viewportWidth = 800;
renderer.viewportHeight = 480;

src/platform/sdl/sw-sdl1.c
在 mSDLSWRunloop 中,修改 pixman 合成部分,使缩放后的画面居中:
int drawW = 240 * renderer->ratio;
int drawH = 160 * renderer->ratio;
int drawX = (renderer->viewportWidth - drawW) / 2;
int drawY = (renderer->viewportHeight - drawH) / 2;
pixman_image_composite32(PIXMAN_OP_SRC, renderer->pix, 0, renderer->screenpix,
0, 0, 0, 0, drawX, drawY, drawW, drawH);

配置与编译
mkdir build && cd build
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_QT=OFF \
-DBUILD_SDL=ON \
-DSDL_INCLUDE_DIR=/home/lnh9000/Desktop/file_gba/sdl1.2-deploy/usr/include/SDL \
-DSDL_LIBRARY=/home/lnh9000/Desktop/file_gba/sdl1.2-deploy/usr/lib/libSDL.so \
-DUSE_FFMPEG=OFF -DUSE_LUA=OFF -DUSE_ZLIB=OFF -DUSE_MINIZIP=OFF \
-DUSE_PNG=OFF -DUSE_ELF=OFF -DUSE_EPOXY=OFF -DUSE_LIBZIP=OFF \
-DUSE_SQLITE3=OFF -DUSE_EDITLINE=OFF -DBUILD_GLES2=OFF -DBUILD_GLES3=OFF

make -j$(nproc)

确认生成 sdl/mgba 为 ARM 可执行文件:

4、部署到开发板
传输库文件
这里为主机上操作,别跑到开发板上
//对应开发板的ip
BOARD_IP="192.168.1.x"
# SDL 1.2
scp /home/lnh9000/Desktop/file_gba/sdl1.2-deploy/usr/lib/libSDL-1.2.so.0.11.4 root@$BOARD_IP:/usr/lib/
# pixman
scp /home/lnh9000/Desktop/file_gba/sdl1.2-deploy/usr/lib/libpixman-1.so.0.38.4 root@$BOARD_IP:/usr/lib/
# libmgba
scp /home/lnh9000/Desktop/file_gba/mgba-0.8.4/build/libmgba.so.0.8.3 root@$BOARD_IP:/usr/lib/
# mgba 可执行文件
scp /home/lnh9000/Desktop/file_gba/mgba-0.8.4/build/sdl/mgba root@$BOARD_IP:/usr/bin/mgba-0.8.4



在开发板上创建软链接
cd /usr/lib
ln -sf libSDL-1.2.so.0.11.4 libSDL-1.2.so.0
ln -sf libSDL-1.2.so.0 libSDL-1.2.so
ln -sf libpixman-1.so.0.38.4 libpixman-1.so.0
ln -sf libpixman-1.so.0 libpixman-1.so
ln -sf libmgba.so.0.8.3 libmgba.so.0.8
ln -sf libmgba.so.0.8 libmgba.so.0
ln -sf libmgba.so.0 libmgba.so
chmod +x /usr/bin/mgba-0.8.4
开发板运行配置
停止 Qt 桌面,释放 Framebuffer
systemctl stop atk-qtapp-start.service
killall QDesktop-fb 2>/dev/null
确保 Framebuffer 分辨率为 800×480
验证
fbset
应显示 geometry 800 480 800 480 16

设置环境变量并运行
export SDL_VIDEODRIVER=fbcon
export SDL_AUDIODRIVER=alsa
export LD_LIBRARY_PATH=/usr/lib:/lib:$LD_LIBRARY_PATH
/usr/bin/mgba-0.8.4 -3 /path/to/game.gba
-3 表示 3 倍缩放(720×480),在 800×480 屏幕上居中显示,左右各留 40 像素黑边。
5.效果:

注意:
创建启动脚本 /usr/bin/run-mgba.sh
cat > /usr/bin/run-mgba.sh << 'EOF'
#!/bin/sh
systemctl stop atk-qtapp-start.service 2>/dev/null
killall QDesktop-fb 2>/dev/null
chvt 1
export SDL_VIDEODRIVER=fbcon
export SDL_AUDIODRIVER=alsa
export LD_LIBRARY_PATH=/usr/lib:/lib:$LD_LIBRARY_PATH
EOF
赋予执行权限:
chmod +x /usr/bin/run-mgba.sh
以后运行游戏:
前先执行这个脚本配置环境
/usr/bin/run-mgba.sh
之后
/usr/bin/mgba-0.8.4 -3 /path/to/game.gba
(先按ctrl+c,打断默认运行界面,之后进入gba游戏画面)结束再按一次。
更多推荐


所有评论(0)