一、移植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游戏画面)结束再按一次。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐