DSpico烧录卡固件编译折腾记录

发布于 23 天前  304 次阅读


我入手的那张DSpico烧录卡里的固件不支持在未破解的NDSi和3DS上运行,就打算自己编译一份支持这个功能的固件试试。

前几天根据官方文档尝试编译,步骤复杂了点,但还是能比较快地编译出来。

趁还没有忘记当时是怎么操作的,还是按照惯例写一篇文章进行记录。

1.环境准备

1.1.准备网络环境

编译DSpico固件时,免不了会访问GitHub等海外站点。在内地操作的场合,要么开一台海外VPS进行操作,要么就想办法让编译环境能完整访问国际互联网。

1.2.部署编译环境

DSpico固件需要在Linux环境下编译。需要准备一台Linux虚拟机或者在WSL环境下操作。

我的Arch小平板性能不是很好,所以还是根据老习惯部署一台Debian 13虚拟机进行操作。

1.3.安装依赖包

首先添加.NET 9.0的软件源。下面命令通过wget下载的包适用于Debian 13。如果用的是不一样的发行版或版本,可以参考微软写的文档(https://learn.microsoft.com/zh-cn/dotnet/core/install/linux)下载对应的包。

wget https://packages.microsoft.com/config/debian/13/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

添加完毕后,按照惯例更新一下。

sudo apt update && sudo apt upgrade -y

然后安装如下依赖。

sudo apt install git cmake gcc-arm-none-eabi build-essential dotnet-sdk-9.0 -y

1.4.安装BlocksDS SDK

编译DSpico固件时需要用到BlockDS SDK。安装这个SDK前,需要先安装Wonderful Toolchain工具链。

这个工具链目前还只支持安装在/opt/wonderful目录,所以需要先创建这个目录,并把目录所有者设置为当前用户。

sudo mkdir /opt/wonderful
sudo chown -R "$USER" /opt/wonderful

下载Wonderful Toolchain工具链的二进制包,解压到/opt/wonderful目录下,解压完成后删除压缩包。

wget https://wonderful.asie.pl/bootstrap/wf-bootstrap-x86_64.tar.gz
tar -xzf wf-bootstrap-x86_64.tar.gz -C /opt/wonderful/ && rm wf-bootstrap-x86_64.tar.gz

用Wonderful Toolchain工具链的包管理器更新一下wf-tools包。

/opt/wonderful/bin/wf-pacman -Syu wf-tools

更新完成后,可以在当前用户配置文件中注册一个wf-env命令,执行这个命令后,Wonderful Toolchain工具链将会自动将其组件临时添加到环境变量中。

echo "alias wf-env='source /opt/wonderful/bin/wf-env'" >> ~/.profile

用户配置文件修改完成后,最好先登出一下再重新登录,从而让修改后的用户配置文件生效。

exit

重新登录后,就可以安装BlocksDS SDK了。先用注册的wf-env命令添加环境变量,再在wf-pacman包管理器中启用blocksds仓库,然后进行安装。安装完成后重新添加一遍环境变量,把装好的BlocksDS SDK也添加进去。

wf-env
wf-config repo enable blocksds
wf-pacman -Syu
wf-pacman -S blocksds-toolchain blocksds-nflib blocksds-nitroengine
wf-env

2.编译步骤

编译DSpico固件之前,要按照顺序依次编译DSpico引导加载程序LNH-team/dspico-bootloader、NDS ROM的加密工具Gericom/DSRomEncryptor、Wfruxxed漏洞补丁LNH-team/dspico-wrfuxxed,并用以上编译好的工具生成固件编译所以来的几个文件,最后再编译固件。

总之就是挺复杂的。还好dspico-dldi可以直接从Release下载,可以减少点工作量。

2.1.新建文件夹

因为要陆续编译好几个仓库,所以最好在家目录下创建一个dspico目录,要编译的GitHub仓库全部克隆到这个目录下,显得稍微整齐一点。

mkdir ~/dspico
cd ~/dspico

2.2.下载DSpico DLDI

因为Release页面可以直接下载,所以就不手动编译了。

wget https://github.com/LNH-team/dspico-dldi/releases/download/v1.0.1/DSpico.dldi

2.3.编译DSpico Bootloader

先克隆LNH-team/dspico-bootloader仓库,用于生成固件的BOOTLOADER.nds引导加载程序。

更新一下包含的子模块,编译。

git clone https://github.com/LNH-team/dspico-bootloader.git
cd dspico-bootloader
git submodule update --init
make

编译完成后,回到~/dspico目录,给生成的BOOTLOADER.nds文件打个补丁。

打补丁的工具是BlocksDS SDK里的dlditool工具,理论上也能把它添加进环境变量,但我编译的时候图省事,直接用它的绝对路径了。

cd ~/dspico
/opt/wonderful/thirdparty/blocksds/core/tools/dlditool/dlditool DSpico.dldi dspico-bootloader/BOOTLOADER.nds

2.4.编译DSRomEncryptor

接下来需要编译DSRomEncryptor工具,给BOOTLOADER.nds按照NDS标准进行加密,让它变得更逼真一些。

克隆Gericom/DSRomEncryptor仓库,编译走起。

git clone https://github.com/Gericom/DSRomEncryptor.git
cd DSRomEncryptor
dotnet build

编译完成后,还是回到~/dspico目录。

cd ~/dspico

DSRomEncryptor工具加密NDS ROM文件时,需要用到NDS和NDSi的BIOS文件。这些都能在互联网档案馆里找到。

wget -O DSRomEncryptor/DSRomEncryptor/bin/Debug/net9.0/biosnds7.rom https://archive.org/download/dsi-nands.-7z/NDS_Bios.zip/NDS_Bios7.bin
wget -O DSRomEncryptor/DSRomEncryptor/bin/Debug/net9.0/biosdsi7.rom https://archive.org/download/dsi-nands.-7z/DSi_Bios.zip/NDS_Bios7i.bin

2个BIOS文件准备好后,用DSRomEncryptor工具生成加密后的default.nds文件。

DSRomEncryptor/DSRomEncryptor/bin/Debug/net9.0/DSRomEncryptor dspico-bootloader/BOOTLOADER.nds default.nds

2.5.编译DSpico Wrfuxxed

DSpico通过利用NDSi无线网络测试卡带的漏洞,实现未破解NDSi或3DS环境下的正常加载。当前编译的仓库就是这个漏洞的利用工具。

克隆LNH-team/dspico-wrfuxxed仓库,再一次编译。

git clone https://github.com/LNH-team/dspico-wrfuxxed.git
cd dspico-wrfuxxed
make

编译完成后依旧是回到~/dspico目录,给生成的uartBufv060.bin文件打个补丁。

cd ~/dspico
/opt/wonderful/thirdparty/blocksds/core/tools/dlditool/dlditool DSpico.dldi dspico-wrfuxxed/uartBufv060.bin

2.6.编译DSpico Firmware

终于可以开始编译固件了。先克隆LNH-team/dspico-firmware仓库。

git clone https://github.com/LNH-team/dspico-firmware.git

要实现未破解NDSi或3DS环境下的正常加载,就需要准备NDSi无线网络测试卡带的ROM文件,ROM文件的SHA-1哈希值还必须是2d65fb7a0c62a4f08954b98c95f42b804fccfd26

依然是在什么都有的互联网档案馆上面找。

wget -O dspico-firmware/roms/dsimode.nds https://archive.org/download/wrfu_0.60_fixed/wrfu.srl

把前几步准备好的default.ndsuartBufv060.bin这2个文件分别复制到对应的目录中。

cp default.nds dspico-firmware/roms
cp dspico-wrfuxxed/uartBufv060.bin dspico-firmware/data

进入LNH-team/dspico-firmware仓库目录,更新包含的子模块。

cd dspico-firmware
git submodule update --init
cd pico-sdk
git submodule update --init
cd ..

修改CMakeLists.txt文件,去掉DSPICO_ENABLE_WRFUXXED选项前的注释,编译出来的固件就能在未破解NDSi或3DS环境下正常加载了。

sed -i 's/#DSPICO_ENABLE_WRFUXXED/DSPICO_ENABLE_WRFUXXED/g' CMakeLists.txt

最后,开始编译。

bash compile.sh

编译完成后,可以在仓库目录下的build目录下找到DSpico.uf2固件文件。

把DSpico烧录卡里插着的TF卡(如果有的话)移除,将TF卡槽旁边的MicroUSB调试接口连到电脑上,将DSpico.uf2固件文件复制到新出现的那个分区里,固件就会自动刷写。

3.个人吐槽

其实固件编译时还有其他几个选项。

ENABLE_R4_MODE:让DSpico官方支持模拟Wood 1.62固件,但要求TF卡容量不超过4GB,不是很实用。

ENABLE_PREVENT_DSI_AUTOBOOT:让DSpico在DSi环境下启动时,不自动跳过菜单直接进入DSpico内核。感觉实用性一般,除非是一定要通过NDSi菜单启动烧录卡。

虽然编译过程确实复杂了些,但是只要成功编译一次,后面版本更新后再重新编译就会简单很多。