1.Game and Watch 破解刷机教程
2.SWD协议分析(附SWD离线下载源码)
Game and Watch 破解刷机教程
本教程适用于任天堂新版Game&Watch Mario/Zelda版本。进行刷机操作有风险,若机器在刷机过程中发生硬件损坏或机器无法正常使用,我们概不负责。
更新日期://
根据评论区用户@alexzhong 的建议,在下载编译固件所需的麒麟短链接源码gcc工具链时,请确保下载x版本的工具链,而非arm版本。否则,可能会在编译过程中遇到错误。
准备工具:
- 十字螺丝刀一把
- Y字螺丝刀一把
- stlink(推荐淘宝盗版stlink v2,价格在元以内)
- Game&Watch Zelda/Mario 版本 MXUFM2I-G(用于扩展内存大小,可选)
- 一台装有Ubuntu的电脑(或使用具有USB直通功能的虚拟机如VMware)
认识Game&Watch硬件:
- Game&Watch主控为stmh7b0vbt6,配备Mhz Cortex-M7内核与kb内部flash存储。
- 外部Flash采用mxu系列的1.8v spi nor flash,Zelda版本为4MB大小,Mario版本为1MB大小,springmvc官方源码通过OctoSpi接口连接主控。
- 电池与喇叭与Switch Joycon同款,以降低成本。
- 主板供电为1.8v,debug接口的VDD也是1.8v,请勿接至3.3v供电,以防硬件烧毁。
硬件接口定义:
- Zelda版本:连接SWCLK, GND, SWDIO三根线。
- Mario版本:同样连接SWCLK, GND, SWDIO三根线,但需注意不要连接VDD。
更多硬件信息参考:github.com/ghidraninja/...
破解加密和备份原机固件:
- Game&Watch固件经过加密,尽管硬件开放性高,但固件本身仍需破解。
硬件准备:
- 断开电池连接,将SWDIO, SWCLK, GND线连接至stlink对应端口。
- 将stlink连接到Ubuntu系统(或VMware)。vb例子源码
- 使用Game&Watch的typec电源。
系统软件准备:
- 自行编译安装OpenOCD,由于版本和自带库问题,可能无法使用apt自动安装。
- 确保git submodule更新完整,可能需要反复尝试。
- 下载并解压arm gnu toolchain。
备份和破解流程:
- 下载脚本仓库。
- 配置脚本环境。
- 运行脚本备份外部flash。
- 确保flash备份后,开始向flash中写入内容。
- 备份内部flash,确保机器处于蓝屏模式,完成所有文件备份。
- 机器在完成脚本4解锁和脚本5恢复后,linux svn源码变为解密状态,可刷入其他固件。
错误代码分析:
- 运行中可能出现各种问题,查看logs目录下的n_openocd.log以获取详细错误信息。
- 确保脚本有读取usb设备的权限,运行sudo命令以获得权限。
- 连接器与设备不兼容时,可尝试更新stlink v2的固件。
编译并刷入retro_go固件:
- Game&Watch无扩展存储,所有游戏rom均在固件内。
- 支持运行的游戏平台包括:GBC、GB、GBA、NES、SNES、N、protobuf源码调试MD、SMS、SCS-1、SFC、PCE、GG、PS、PSX、SCE、PS2、PS3、PS4、Xbox、Xbox、XboxOne、Wii、WiiU、DS、3DS、PSVita、NDS、3DS、WiiU、Switch等。
- 准备游戏rom,确保容量不超过flash大小。
- 编译前,确保所有破解流程要求的软件已安装完毕。
- 下载固件源码,配置运行环境。
- 将游戏rom放入rom目录,编译固件。
- 编译完成后,自行刷机。
SWD协议分析(附SWD离线下载源码)
SWD协议分析内容
SWD协议的基本信息比特序,即数据传输顺序为最低有效位优先,先传输低位数据,后传输高位数据。例如,对OK的ACK响应数据为0b,先传输低位1,再传输高位0。
SWD的传输闲置状态为空闲周期,主机通过将SWDCLK时钟拉低来代表空闲时期。
ARM SWD采用单条双向数据连接线(SWDIO),为了防止主机与设备间的竞争,在传输方向变化时需要线路周转,此期间主机与设备均不驱动数据线,数据线状态不确定。周转时间长度由DLCR寄存器的TURNROUND位控制,默认为一个时钟周期。
在数据传输过程中,SWD使用偶校验,传输数据中为1的个数为偶数则结果为0,否则为1。
数据基本传输流程包括数据传输方向和开始条件。ORUNDETECT标志位代表超时检测模式,该模式允许长时间高吞吐量连接,上电后默认禁用。数据传输步骤包括写请求和读请求,写请求在ACK阶段和数据传输阶段有一个周转期,读请求在数据传输阶段后存在周转期。
数据包请求后始终为转换时间,此时主机和目标均不驱动线路。ACK响应包含转换时间,仅在发生READ事务或接受WAIT或FAULT确认时需要。DATA传输包含转换时间,仅在READ事务中存在。
数据传输完毕后,主机需进行操作。SWD寄存器介绍包括SW-DP状态机、SW-DP寄存器和SW-AP寄存器。状态机有内部ID代码,目标读取前状态机不工作。APnDP值决定访问这些寄存器。
AHB-AP具有位AHB-DP寄存器,地址宽度为6位,最多达字节或字节。
SWD协议的操作包括成功写入和读取操作。写入操作在主机接收到OK的ACK响应后立即开始数据传输,无需周转期。读取操作在数据传输完毕后存在周转期。
从JTAG切换到SWD操作涉及位JTAG到SWD选择序列,包括读取芯片ID、清除错误标志位和使能AP调试。读取MCU任意寄存器需发送两次读操作或一次读操作后发送一次读RDBUFF寄存器操作。写入MCU任意寄存器需参考相关文档。
具体操作流程和更多细节可参阅相关文档资料和源码。附件包含ARM调试接口架构规范和DAPProg源码。