brew install --HEAD openocdbrew tap ArmMbed/homebrew-formulae
brew installarm-none-eabi-gcc
brew install lz4
brew install wget
brew install python3
brew install git
继续,
mkdir -p ~/opt
cd ~/opt
tar xvf ../xpack-openocd-0.10.0-15-linux-arm.tar.gz
chmod -R -wxpack-openocd-0.10.0-15/
tar xvf ../xpack-arm-none-eabi-gcc-10.2.1-1.1-linux-arm.tar.gz xpack-arm-none-eabi-gcc-10.2.1-1.1
export PATH=$PATH:/home/pi/opt/xpack-arm-none-eabi-gcc-10.2.1-1.1/bin/
(苹果系统安装后的路径是/Applications/ARM/bin)
export OPENOCD="/home/pi/opt/xpack-openocd-0.10.0-15/bin/openocd"
这时候使用
ls –la
命令列目录,当前目录下文件应该如下
配置UDEV规则
sudo cp ~/opt/xpack-openocd-0.10.0-15/contrib/60-openocd.rules/etc/udev/rules.d/
sudo udevadm control--reload-rules
三、 拆机连接编程器
GW拆机后,第一件事是拔掉电池排线,然后能看到在背面靠近喇叭的位置,有5个控制接口如图
从左往右分辨是 SWCLK、VDD、GND、SWDIO、NRST
STLINK编程器的接口定义如下图:
注意按缺口方向辨别
我们要做的就是用杜邦线连接GW与STLINK编程器
SWCLK口连接STLINK的9号口,VDD空着不连,GND连接STLINK的4号接口,SWDIO连接STLINK的7号口,NRST连接STLINK的15号口。网上不建议连接VTref口,说会有概率损毁存储芯片,我接上了没问题,可以不接,接的话VDD口连接STLINK1号口。
然后STLINK连接树莓派(或者MacOs电脑),GW插上TYPE-C接口供电
接着回到SSH中端命令行,测试STLINK是否正常
$OPENOCD -f inte**ce/stlink.cfg -c "adapter speed300; transport selecthla_swd" -ftarget/stm32h7x.cfg (如果提示没有OPENCD,请重新定义一下exportOPENOCD="/home/pi/opt/xpack-openocd-0.10.0-15/bin/openocd")(命令行内容论坛有屏蔽,建议下载下面的网盘内的电子档查看)
如果没问题,我们就可以进行开始进行固件的备份和解锁还有恢复操作了。
cd game-and-watch-backup
测试程序是否工作正常
./1_sanity_check.sh
备份固件
./2_backup_flash.sh stlink
备份内存(此步骤可多次尝试,务必确保保存成功)
./ 3_backup_internal_flash.sh stlink
解锁设备(解锁后,可以刷入非官方固件)
./4_unlock_device.sh stlink
恢复备份(操作后,换内存后再执行一次)
./ 5_restore.sh stlink
这样,你就得到了完整的备份文件,在game-and-watch-backup/backups目录下有三个文件flash_backup.bin,internal_flash_backup.bin,itcm_backup.bin。复制一份到其他地方,防止丢失。
四、更换内存
接着,我们开始进行更换内存,如果技术不好的,推荐用风枪吹下内存,或者去修手机店的地方帮你焊接,注意针脚方向位置,技术好的,完全可以用刀头电烙铁更换,注意旁边的芯片,最好贴上隔热绝缘胶带。
换好芯片后,接上STLINK,接上TYPE-C电源,我们需要把原始固件恢复进去
在game-and-watch-backup目录下,继续执行
./ 5_restore.sh stlink
如果提示失败,请断开电源和STLINK,再重新插上,然后执行,还不行就按住GW电源键执行。恢复完成后,屏幕会每秒闪动一次,然后断开电源和STLINK,再插上,这时候正常的话,GW会回到时钟界面,如果花屏的,黑屏的,请重复尝试,如果还不行,可以尝试把芯片一脚接GND
然后接上VTref和VDD口,再试试,我遇到过,这样操作好了
具体更换芯片可以去看看
(需要富强上网)
五、编译游戏ROM与刷回自制程序
然后接着,我们就可以进行编译游戏ROM的操作了
回到SSH界面
cd .. (回到OPT目录下)
cd game-and-watch-flashloader
然后利用SSH工具,把Drivers目录解压并传到game-and-watch-flashloader目录下,因为程序需要用到这个芯片的驱动,传输完成然后接着输入:
make GCC_PATH=/home/pi/opt/xpack-arm-none-eabi-gcc-10.2.1-1.1/bin/
(Macos操作为make GCC_PATH=/Applications/ARM/bin)
以上为编译FLASHLOADER程序
cd .. (返回OPT目录)
cd game-and-watch-retro-go
git submodule update –init (此步骤为更新子模块,默认GIT的时候会出现注册子模块失败的问题)
以上操作完后,同样,利用SSH工具把Drivers目录传到game-and-watch-retro-go目录下,才能正常编译操作,传输完成后,接着操作:
cd ..
ls –la
这时候OPT目录下应该是如下文件
然后就可以用SSH自带的工具SFTP这样的把文件传输到game-and-watch-retro-go目录下的对应的模拟器路径下,貌似不支持zip格式的ROM,只能用.nes .gb .gbc这样的
GB和GBC都可以放在gb目录下
/home/pi/opt/game-and-watch-retro-go/roms/gb
/home/pi/opt/game-and-watch-retro-go/roms/gg
/home/pi/opt/game-and-watch-retro-go/roms/nes
/home/pi/opt/game-and-watch-retro-go/roms/sms
放好ROM后,我们需要查看一下ROM的合计大小,建议实际大小比存储芯片大小要小2MB左右,比如16MB的存储芯片,我们ROM大小最好控制在14MB左右,如果我们不需要做双系统,那么我们可以直接编译写入,这样原系统将替换为game-and-watch-retro-go程序,但是我们这次讲的是双系统,所以我们还需要修改以下5个文件,才能开始编译
1、 打开game-and-watch-retro-go/Core/Src/main.c
修改223行: uint32_tsave_address = flash_ptr - &__EXTFLASH_REAL__;
修改263行: uint32_tsave_address = flash_ptr - &__EXTFLASH_REAL__;
修改431行://MX_RTC_Init();
修改597行: PeriphClkInitStruct.RTCClockSelection= RCC_RTCCLKSOURCE_LSE;
2、 打开game-and-watch-retro-go/Core/Src/system_stm32h7xx.c
修改267行:SCB->VTOR = FLASH_BANK2_BASE | VECT_TAB_OFFSET; /* Vector Table Relocationin Internal FLASH */
3、 打开game-and-watch-retro-go/Core/Inc/gw_linker.h
在007行后面的第008行添加:
extern uint8_t __EXTFLASH_REAL__;
4、 打开game-and-watch-retro-go/STM32H7B0VBTx_FLASH.ld
修改075行:__EXTFLASH_START__ = 0x90100000;
在0075行后面的0076行添加
__EXTFLASH_REAL__ = 0x90000000;
修改088行:__EXTFLASH_LENGTH__ = DEFINED(__EXTFLASH_TOTAL_LENGTH__) ?__EXTFLASH_TOTAL_LENGTH__ - (__CONFIGFLASH_LENGTH__ + __SAVEFLASH_LENGTH__ +1024K) : 1024K - (__CONFIGFLASH_LENGTH__ + __SAVEFLASH_LENGTH__);
修改107行: FLASH (xr) : ORIGIN = 0x08100000, LENGTH = __FLASH_LENGTH__
5、 打开game-and-watch-retro-go/Core/Src/porting/odroid_system.c
在080行后面添加这两行
*((uint32_t*)0x2001FFF8) = 0x544F4F42; // "BOOT"
*((uint32_t*)0x2001FFFC) = 0x08100000; // vector table
好了,5个文件修改好了后,按照原来的路径覆盖掉,然后开始编译ROM文件,回到SSH命令行界面来:
cd game-and-watch-retro-go (进入cd game-and-watch-retro-go目录)
export ADAPTER=stlink
export OPENOCD="/home/pi/opt/xpack-openocd-0.10.0-15/bin/openocd"
make GCC_PATH=/home/pi/opt/xpack-arm-none-eabi-gcc-10.2.1-1.1/bin/ LARGE_FLASH=1
然后就是漫长的等待编译,程序会把ROM先用LZ4压缩,再打包
最后在game-and-watch-retro-go/build目录下得到这两个文件
build/gw_retro_go_intflash.bin
build/gw_retro_go_extflash.bin
把这两个文件保存到你的电脑里,顺便把你备份的原始固件也一起保存到电脑里
现在需要用到WINDOWS系统操作,把你的STLINK插到WINDOWS的USB口,建议插电脑的后置口,前置容易供电不足,导致刷写失败,就是我遇到过这个问题困扰了几天。
打开附件文件包里的en.stm32cubeprg-win32_v2-6-0.zip,安装stm32cubeprg程序,安装路径为C:\ProgramFiles (x86)\STMicroelectronics\STM32Cube\STM32CubeProgrammer\
然后再打开STM32CubeProgrammer External Loaders (2021-05-02),把里面的芯片资料文件放到C:\Program Files(x86)\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\ExternalLoader目录下。
打开附件程序包里的Stock Firmware Patcher这个程序,然后设置如下
Input file选择你的原始固件,Output设置一个保存路径,STM32路径设置你刚才安装的STM32Cube的安装路径,程序一般默认识别,不对的你自己设置一下。其他的按照我的设置即可,然后选择Patch进行创建带有按键菜单的固件,然后接上GW与STLINK编程器,点击UPLOAD,让新修改好的程序上传到GW内,如果识别不到出错,请断开GW电源与STLINK,并重新连接试试。提示DONE,表示上传成功。
这时候GW是在时钟界面
你按住方向键左键+GAME键+A键,能进入菜单说明成功
然后按B退出,先别急,你新做的ROM还没刷入呢。
打开C:\Program Files(x86)\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin 文件夹
把你刚才创建的两个带有ROM的固件放到这个目录下
gw_retro_go_intflash.bin
gw_retro_go_extflash.bin
然后进入CMD模式(WINDOWS10按住WINDOWS键+X键,选择运行,输入CMD回车)
进入STMCUBE程序目录
Cd C:\Program Files(x86)\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin
STM32_Programmer_CLI.exe -c port=SWD -wgw_retro_go_intflash.bin 0x08100000
回车,然后有进度提示完成后,接着输入
STM32_Programmer_CLI.exe -c port=SWD reset=HWrst -wgw_retro_go_extflash.bin 0x90100000 -el ".\ExternalLoader\MX25U12835F_GAME-AND-WATCH.stldr"–rst
回车,程序开始刷写,有进度条提示。
(这里的MX25U12835F_GAME-AND-WATCH.stldr是对应你更换的内存芯片型号)
刷写完成后,断开TYPE-C和STLINK,然后接上电池,按一下电源键,时钟界面是不是回来了,你按GAME还是可以选择原装系统的游戏,按住方向键左键+GAME键+A键,进入菜单自制菜单,在RETRO-GO上按A键,进入RETRO-GO,就可以玩FC和GBC之类的游戏了,这时候GAME键就是START,TIME就是select键,至此完成全部操作。
其实还可以玩LCD模拟器,就是模拟原始GAMEWATC爱吃游戏的,需要单独划分空间,我也没去搞了,有兴趣的可以去看看。对了,还有一个备份程序是windows版本的,感兴趣的,也可以去尝试一下
本教程内工具与电子档,提供百度网盘下载
更新------------
忘记把Drivers目录上传上来了,补上链接,另外上面的教程内的文档也更新了一下
=======================
新买了MX25U51245G这个芯片刷机,目前已经刷机成功
直接使用make GCC_PATH=/home/pi/opt/xpack-arm-none-eabi-gcc-10.2.1-1.1/bin/ LARGE_FLASH=1 就可以编译了(可以不用EXTFLASH_SIZE命令去指定芯片大小了),等于默认是创建64MB的文件,所以不是64MB的芯片的兄弟,这部分就别看了
8月18日更新无法保存的问题
无法保存是因为新版的双系统BUG,KB大神已经修复,修改下面几个文件即可
1.打开Core/Inc/gw_linker.h 文件
第8行添加:extern uint8_t __EXTFLASH_BASE__;
2.打开Core/Src/main.c 文件
第231行的 uint32_t save_address = flash_ptr - &__EXTFLASH_START__;
替换为:uint32_t save_address = flash_ptr - &__EXTFLASH_BASE__;
第254行的:uint32_t save_address = flash_ptr - &__EXTFLASH_START__;
替换为:uint32_t save_address = flash_ptr - &__EXTFLASH_BASE__;
打开 根目录下的 STM32H7B0VBTx_FLASH.ld
第77行的:__EXTFLASH_START__ = 0x90000000 + __EXTFLASH_OFFSET__;
替换为:__EXTFLASH_BASE__ = 0x90000000; /* Beginning of addressable extflash addresses */
__EXTFLASH_START__ = __EXTFLASH_BASE__ + __EXTFLASH_OFFSET__; /* Beginning of where we're going to store emulator and rom data */
第93行的:__SAVEFLASH_START__ = __EXTFLASH_START__ + __EXTFLASH_LENGTH__;
替换为:__EXTFLASH_END__ = __EXTFLASH_START__ + __EXTFLASH_LENGTH__;
__SAVEFLASH_START__ = __EXTFLASH_END__;
第95行的:__CONFIGFLASH_START__ = __SAVEFLASH_START__ + __SAVEFLASH_LENGTH__;
替换为:__CONFIGFLASH_START__ = __SAVEFLASH_END__;
修改后上传覆盖,清除缓存MAKE CLEAN,然后重新BUILD就可以了