Close
0%
0%

A custom DS flashable cartridge

It's about time for someone to make a repro for the DS, so here I am with this proof of concept

Public Chat
Similar projects worth following
The homebrew scene for retro consoles is known for their distribution methods, where usually the developers create reproductions of the original distribution media and insert their games inside.

Even though this has existed for a variety of systems (such as the Sega Mega Drive flashcart by krikzz) for a while, this sort of distribution hasn't existed for the Nintendo DS. It's true that the R4 and EZ-Flash have existed for a while, but these have a different goal than a reprogrammable cartridge would have.

A couple of months ago I stumbled across LNH-team's work; they had built the DSpico, a flash cartridge (like the R4 or EZ-Flash), but this time being open source. By making this open source, they enable people to create modifications of the cartridge in order to add or (in my case) remove features. This is what gave me the idea to build a reprogrammable cartridge that would work on the DS.

The rough idea

As I explained, the starting point for this project was the DSpico project itself. A repro cartridge only needs the internal memory and nothing more (no microSD). Meaning that in this case the hardware side of the project should be to remove both the microSD and microUSB ports from the cartridge, as well as adding a way to insert the ROM in the cartridge.

Also, on the software side, the DSpico's bootloader, which contains the code to open the microSD ROM launcher, should also be able to be replaced by the custom ROM we want to run, which thankfully they already include a guide on how to do that. Although I'll add some notes about this later in this post.

All in all, the rough idea is this: simplifying the hardware and replacing the software. So let me start the project progress.

Making the cartridge's hardware

original cartridge Screenshot of the original PCB designed by LNH-team

As previously said, I started off with this existing design; the steps to take were to first remove the microUSB port and also the microSD card slot. Additionally, I had to come up with a way to program the RP2040 with the firmware. In the end I came up with exposing some big pads in the back that could be easily connected to a USB breakout board. That way I wouldn't be depending on other boards as some reproduction boards require.

Even though having to make the contacts with separate cables can sound a bit tedious to make for larger productions. A friend of mine showed me this test burner tool that could be used to easily connect the board and program it. Conveniently, I placed the pads at a distance of 2.54mm so it would be easy to find adapters for that connection.

modified cartridge Screenshot of the modified PCB

Additionally, I removed the reset button in order to save me a few cents. In that place I left two holes (top right in the image above) that can be easily bridged in order to reset the RP2040 in case you want to reprogram it.

You can check the source KiCad files used for this board here: GerardGascon/fanzine-ds-hardware.

There's already a warning in the repository, but I'll repeat it here. In case you want to try to fit this inside an existing game's shell, the board lacks the two holes in the middle that make it fit inside a real shell, as well as being a tiny bit taller than an original PCB.
So the current design won't fit inside a real shell unless you do some sanding to the shell.

Making the cartridge's software

For this project, I wanted to make a reader for a fanzine that a friend of mine had made a couple of years ago. For that, I tried using various homebrew DS libraries, like libNDS and BlocksDS. For some reason (I suspect the initialization process of the DSpico), the programs kept crashing in both versions (even though they worked fine inside the ROM loader).

In the end, I ended up modifying the original DSpico's bootloader, which is made with libTWL (an extension of BlocksDS).

I suspect the main issue was due to the initialization code the bootloader executes, but a typical homebrew game doesn't. A potential solution to this issue could be updating the RP2040 firmware to avoid having to do that initialization process, but I could be wrong with that.

You can check the source code for this fanzine here: GerardGascon/fanzine-ds.

About the ROM Size

First off, the maximum flash memory size that the RP2040 can use is 16MB. But because memory is expensive and the DSpico doesn't need that much, the DSpico and, by extension, this flash cartridge both have only 2MB onboard. Which...

Read more »

DS Flashcart KiCad Design Files.zip

The KiCad files for making the PCB

x-zip-compressed - 4.16 MB - 07/12/2026 at 10:12

Download

  • 1 × RP2040 Integrated Circuits (ICs) / Microcontrollers
  • 1 × W25Q16JVUXIQ Integrated Circuits (ICs) / Memory
  • 1 × XYDBPCNANF-12MHZ Crystal
  • 1 × AP2112K-3.3TRG1 Power Management ICs / Linear Voltage Regulators and LDOs
  • 1 × R0402 10k Resistors (Fixed) / Thick Film Surface Mount

View all 14 components

  • 1
    Compile & encrypt the ROM

    Compile and encrypt the ROM for the cartridge following the compiling information in this repo.

  • 2
    Compile the RP2040 firmware

    Compile the firmware with your ROM following the guide here.

    IMPORTANT: The DSpico has a function to automatically reset if the microSD card isn't inserted when powered on. This behavior can be disabled by commenting this line present on main.cpp:

    initSd();
    
    // tryRebootToBootsel(); <-- Comment this
    
    pwr_initPowerSaving();
  • 3
    Fabricate the Flashcart

    Grab the files present in GerardGascon/fanzine-ds-hardware and export all the fabrication files from there.
    If you are using JLCPCB for the production, they have a guide here + a plugin that easily generates those files for you.

    ADVISE: If you want to test the software before fabricating the hardware, you can do so by just using an existing DSpico and later on fabricate the flashcart.

View all 3 instructions

Enjoy this project?

Share

Discussions

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates