效果
开机后会运行官方原厂固件(马里奥/塞尔达时钟界面),在这个状态下按下GAME+L+A进入自制软件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『记住以后我该从哪个位置开始读取自制软件的数据』,并不会烧写这个区域,真正的烧写在后面,有一点互相之间先打好招呼那个意思)
我这里设置的是4MB,这个数字取决于你想留多少空间给RetroGo使用。
Firmware - 地址填 08100000 ,这个地址是stm32h7的内部flash的Bank2的地址, 也是RetroGo系统默认指定的地址。Name可以随便修改,不要写汉字就好。
HotKey - 这个根据你自己的喜好改就好,可以选多个,一般默认即可。也就是按下L+A+GAME就调出Luncher菜单。
Other - 这里可以修改Luncher菜单的背景色和文字颜色,随便改。反差大一点就行。
都设置完以后点Patch按钮即可根据你的设置生成一个打过补丁的原厂内部固件bin。
生成打过补丁的固件后,确认stlink已连接,点击Upload按钮即可刷入。
Upload如果出错,一般考虑以下几个原因,请自行检查并重试(后面的步骤如果烧录出问题也是一样检查,不再重复):
- stlink连接不稳定,拔了重插,检查连线等
- 安装了2.6以上版本的Programmer
- 没有正确拷贝external loaders 文件
- 电压问题。尝试断开电池连线和USB-C,然后连上电池连线,最后插入USB-C电源(如果不先连接电池可能会导致4.8V的电压直接跑在1.8V的线上容易出问题)。
至此,你已经完成了下图中的上色的部分(黄色为之前已经完成的部分)
此时,打开电源可进入官方的时钟界面,按下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
系列文章
- 给任天堂Game&Watch掌机刷机(使用ST-Link 或 树莓派)
- 给Game&Watch刷入RetroGo,自制软件Luncher并与原厂固件共存【当前文章】
7 comments
安装openocd的补丁已经不能用了,有其他替代办法吗?
都2202年了,早就不用那个Patch了。。
你指的是哪个Patch?
现在用这个刷双系统,当然,这个不支持你那个多系统模式
https://github.com/BrianPugh/game-and-watch-patch
现在刷这个模拟器:
https://github.com/olderzeus/game-and-watch-retro-go
谢谢,你说这这两个我都刷过。我的目的主要是想运行自制软件(*.elf)
比如我自己写的游戏,比如 https://github.com/slipperstree/game-and-watch-mine-sweeper ,欢迎试玩
接下来我们继续搞RetroGo。(待续) 大佬待续没了啊 。。。。一直看你的教程走到这步非常感谢 能补充“在此时已经可以在Luncher列表中看到你刷入的自制软件并可以运行它们了。撒花。”之后的内容吗
完了我已经记不太清步骤了。。等我有空回忆整理一下。。有空。。。