我入手的那张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.nds和uartBufv060.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菜单启动烧录卡。
虽然编译过程确实复杂了些,但是只要成功编译一次,后面版本更新后再重新编译就会简单很多。


0 Comments