效果

开机后会运行官方原厂固件(马里奥/塞尔达时钟界面),在这个状态下按下GAME+L+A进入自制软件Luncher界面,如下

自制软件Luncher

这里可以选择RetroGo进入模拟器或者运行其他第三方的自制软件。

前提

你需要先解锁(破解)你的GW,具体参见这篇文章。

原理

给官方固件打一个补丁,使其能够响应热键并进入一个菜单。在这个菜单中可以调用其他程序,比如RetroGo或者自制软件。我画了一个对比图供参考(以Mario机型和替换过16M外部Flash为例)。

原版固件和打过补丁的固件示意图

操作

首先还原官方系统

方法参见这篇文章。执行第5步还原系统即可。

./5_restore.sh stlink mario

安装打过补丁的的opencd

环境:ubuntu

安装一个打过补丁的的opencd(用来烧写内部flash的Bank1 / Bank2)。

有好几种方法,具体参考这里,本文只节选我自己用过的方法。也就是使用预编译好的安装包。

随便找一个目录执行以下命令即可。如果出现错误,根据错误提示卸载掉冲突的库。

wget https://nightly.link/kbeckmann/ubuntu-openocd-git-builder/workflows/docker/master/openocd-git.deb.zip
unzip openocd-git.deb.zip
sudo dpkg -i openocd-git_*_amd64.deb
sudo apt-get -y -f install

安装 STM32CubeProgrammer

环境:windows

去ST官网下载 STM32CubeProgrammer 并安装。

注意要选择32位的2.6版本,不要选错了。2.7以后的版本有兼容性问题。

下载 SPI flash external loaders 文件

环境:windows

这里 下载压缩包后解压得到若干.stldr文件,将这些文件复制到 STM32CubeProgrammer 的安装目录下的 /bin/ExternalLoader/ 文件夹中。比如 C:\Program Files (x86)\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\ExternalLoader\

使用 Stock Firmware Patcher 给原厂固件打补丁

环境:windows

下载 Game & Watch - Stock Firmware Patcher 1.4.0 并解压运行。

Input File - 原厂固件(注意是内部flash的bin文件,不是外部flash用的bin文件),也就是你破解GW时做的备份文件。

Output File - 打完补丁的固件的保存位置。

STM32CubeProg Path - 之前安装的 STM32CubeProgrammer 的位置。

ST-LINK Reset Mode - Hardware (确保你连接了stlink的RST)

File System - 地址不要修改。Size根据你的需要设置好为自制软件预留的文件系统的size,也就是下图上色的区域。(注意,这一步只是让补丁版的FW『记住以后我该从哪个位置开始读取自制软件的数据』,并不会烧写这个区域,真正的烧写在后面,有一点互相之间先打好招呼那个意思)

文件系统size

我这里设置的是4MB,这个数字取决于你想留多少空间给RetroGo使用。

设置

Firmware - 地址填 08100000 ,这个地址是stm32h7的内部flash的Bank2的地址, 也是RetroGo系统默认指定的地址。Name可以随便修改,不要写汉字就好。

Firmware

HotKey - 这个根据你自己的喜好改就好,可以选多个,一般默认即可。也就是按下L+A+GAME就调出Luncher菜单。

HotKey

Other - 这里可以修改Luncher菜单的背景色和文字颜色,随便改。反差大一点就行。

Other

都设置完以后点Patch按钮即可根据你的设置生成一个打过补丁的原厂内部固件bin。

生成打过补丁的固件后,确认stlink已连接,点击Upload按钮即可刷入。

Upload如果出错,一般考虑以下几个原因,请自行检查并重试(后面的步骤如果烧录出问题也是一样检查,不再重复):

  • stlink连接不稳定,拔了重插,检查连线等
  • 安装了2.6以上版本的Programmer
  • 没有正确拷贝external loaders 文件
  • 电压问题。尝试断开电池连线和USB-C,然后连上电池连线,最后插入USB-C电源(如果不先连接电池可能会导致4.8V的电压直接跑在1.8V的线上容易出问题)。

至此,你已经完成了下图中的上色的部分(黄色为之前已经完成的部分)

补丁FW已完成

此时,打开电源可进入官方的时钟界面,按下L+A+GAME会进入自制软件菜单。

当然这个时候我们还没有刷入任何自制软件所以Luncher的列表是空的。

我们继续。

使用 Game & Watch - File System Builder 制作文件系统并刷入GW

环境:windows

  • 下载 Game & Watch - File System Builder 1.5.2 并解压。
  • 下载 LZ4 for Windows 解压得到msys-lz4-1.dll文件,复制这个文件到上面的Game & Watch - File System Builder目录下。(这个是用来压缩的第三方库)
  • 在Game & Watch - File System Builder目录下新建文件夹build/input/ ,然后将你想要烧录的自制软件的RAM .elf放在里面,可以放多个。只要经过软件压缩后不超过你之前设置的文件系统size(我设置的是4MB)就可以。
  • 连接好stlink
  • 运行Game & Watch - File System Builder目录下的 Game & Watch - File System Builder.exe

Build Path / Extract Path - 默认即可(自动指向当前文件夹)。

STM32CubeProg Path - 之前安装的 STM32CubeProgrammer 的位置。

External Loader 1 - 默认是MX厂的16MB的flash,如果你使用了别的品牌/Size的Flash需要修改。

ST-LINK Reset Mode - Hardware (确保你连接了stlink的RST)

File System - 默认是空的,点一下右侧的下拉框箭头,软件会自动连接stlink并检查你之前刷入的补丁设置。确认有没有问题(比如我之前设置的是4MB这里也显示了4MB表示没问题)。

右侧的两个勾都勾上,会对elf文件进行优化压缩。

设置

设置好以后点Build即可将input里的elf文件压缩打包成一个bin文件。

没啥问题就点Upload刷入机器。

至此我们完成了以下工作

文件系统已完成

此时已经可以在Luncher列表中看到你刷入的自制软件并可以运行它们了。撒花。

接下来我们继续搞RetroGo。(待续)

附,使用命令行刷入外部Flash固件的方法(一般用不到)

环境:Windows

打开命令行连接好stlink,执行以下命令(需要事先将 ...STM32CubeProgrammer\bin 绝对路径加入系统环境变量的PATH中去)

cd .../固件的位置/
STM32_Programmer_CLI.exe -c port=SWD -el "D:\Program Files (x86)\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\ExternalLoader\MX25U12835F_GAME-AND-WATCH.stldr" -w flash_backup_mario.bin 0x90000000 -rst

系列文章

Last modification:May 9, 2022
If you think my article is useful to you, please feel free to appreciate