Emulating PSX Memory Card (or controller) using a Raspberry Pi Pico

PicoMemcard

PicoMemcard allows you to build your own supercharged PSX Memory Card that can be connected to your computer via USB in order to transfer saves directly to/from your PSX. You can use it to repurpose broken/counterfit Memory Cards creating a better one using only a Raspberry Pi Pico.

Features

  • Able to simulate faithfully PSX Memory Card
  • USB conection to import/export saves
  • Allows to copy saves to/from any other memory card (using original PSX file manager)
  • Allows to play burned CDs (thanks to FreePSXBoot)
  • Cheaper than an original memory card

Bills of materials

  • Raspberry Pi Pico (around ~5$)
  • One of:
    • Custom PicoMemcard PCB (currently work in progress)
    • Broken/Counterfit/Original PSX Memory Card (counterfit ones can be found on Aliexpress for less than 1$)
    • PSX/PS2 Controller Cable
    • Nothing, if you are a mad man and feel like soldering cables directly to your PSX (would not recommend).

Basically anything that will allow you to interface with the memory card slot pins will do. If you have a broken contoller you can cut of the cable and use that since controllers and memory cards share the same bus. Of course, plugging your memory card into the controller slot will prevent you from using 2 controllers at the same time.

In total building a PicoMemcard wil cost you less than buying an used original Memory Card!

Video

PicoMemcard

Wiring

The wiriting diagram below shows how to wire the Pico and a counterfit memory card from Aliexpress. For the other cases (wiring directly to the PSX or using a controller cable) the pins on the Pico are the same, the pinout of the PSX/controller can be found on psx-spx. The image shows the bottom side of the memory card with the cover removed.

Wiring Diagram

The dashed line on the PCB of the memory card is where you should cut a groove deep enough to disconnect the original controller from the traces. The yellow squares above the line indicate where you should scrape away the proctective film in order to expose the copper traces and solder the wires onto them.

Finally the area at the bottom of the memory card is where you can cut a hole to feed the wires through connecting them to the Pico.

Installation

  1. Download the latest release.
  2. While pressing the 'BOOTSEL' button on your Raspberry Pi Pico, plug it into your computer.
  3. Drag and drop the PicoMemcard release onto your Raspberry Pi Pico.
  4. PicoMemcard should appear on your PC as a USB drive.
  5. Upload a memory card image to your PicoMemcard.

Transfering Data

As of the current release, uploading data to PicoMemcard requires some precise steps:

  • The image of the memory card to upload must be called exactly MEMCARD.MCR. Uploading anything else will not result in any errors but PicoMemcard will not save the uploaded data to flash. After rebooting the device the old data will still be present.
  • The image must be 128KB (131072 bytes) in size which is precisely the size of an original Memory Card.
  • After the image has been uploaded, the device must be safely ejected in order for the data to be actually imported correctly. This is a limitation of the current implementation (see Design section).

Inside docs/images you can find a two memory card images. One has a couple of saves on it so you can test if everything works correctly, the other is completely empty.

ATTENTION: I would recommend to never plug PicoMemcard both into the PC (via USB) and the PSX at the same time! Otherwise the 5V provided by USB would end up on the 3.3V rail of the PSX. I'm not really sure if this could cause actual damage but I would avoid risking it.

If you really need to have the Pico plugged into both the USB and PSX (e.g. for debugging purposes), disconnect the 3.3V line from the VBUS pin. In this way you can power on the Pico using a simple USB phone charger or by plugging it into your PC.

Future Development

As of now PicoMemcard is still in very early development stages and only tested it on a PSOne Pal model (SCPH-102, bios version 4.4). It should work on any PSX model. If you want to try it on your PSX any feedback would be much appreciated.

I've tried to make the project as accessible as possible by using the least amount of hardware but this comes with a few limitations, in particular regarding the flash storage of the Pico. In the future I want to add the possibility to use a microSD card by adding a microSD SPI module, this would improve on the following:

  • The very limited storage preventing from having multiple memory card images at the same time and being able to switch them using a button on the Pico.
  • The complex codebase using multiple filesystems (see Design section).
  • The brief downtime periods PicoMemcard may have while writing new data to flash memory, appearing as if the Memory Card was briefly disconnected.
  • The need to perform save ejection as a way to signal the Pico to transfer the data from the virtual FAT disk to the flash filesystem (see Design section).

Design

For people interested in underestanding how PicoMemcard works I provide a more extensive explanation in this post.

Thanks To

  • psx-spx and Martin "NO$PSX" Korth - Playstation Specifications and documented Memory Card protocol and filesystem.
  • Andrew J. McCubbin - Additional information about Memory Card and Controller comunication with PSX.
  • littlefs - Filesystem designed to work on NOR flash used by many microcontrollers, including the Raspberry Pi Pico.
  • ChaN FatFS - FAT filesystem implementation for embeeded devices.
  • Scoppy - Use your Raspberry Pi Pico as an oscilloscope, very cheap and accurate. Without this I would have not been able to debug many issues.
  • PulseView - Used to import, visualize and manipulate the data from Scoppy on a PC.
Owner
Daniele Giuliani
Hi! I’m just a guy with a passion for computers, videogames and rock climbing.
Daniele Giuliani
Comments
  • With RP2040 zero,ps1 not detect

    With RP2040 zero,ps1 not detect

    With RP2040 zero, the .mcr file can be recognized through usb after writing the program. However, it cannot be detected by ps1 9002. It has been checked 3.3v power supply and the data line connection are not abnormal.

  • Where to find SD Card Modules

    Where to find SD Card Modules

    I meant to fit some cases for the variations of files offered here but I'm running into some problems. I bought two different kinds of boards and they each have their own set of issues. The Adafruit module is well built but also a bit thick & pricey. While fitting with the basic Pico Pi (longer version) it seems like it may be impossible to fit in the case comfortably. The board itself is about 1.76mm without the card slot. About 3.70mm (height wise) altogether and 23mm in length. The other board is around 3.50mm thick but with a little over a whopping 42mm in length.

    What I'm looking for is what board you would generally recommend so I that if I were to share a case here that everyone would have a perfect fit. I'm also a bit confused with the wiring of the board I got if this is what were to be recommended. Or at least for testing.

    I have a few of the 2040-Zeros on the way but it seems they were outsourced from China so it's going to take a little bit longer. I plan on making a case for both models, small and large with and without the SD module. Looking forward to shortening up the case to at least the regular size of an official memory card when my Zeros get here.

  • Initial SD card support.

    Initial SD card support.

    This is very much still a work in progress.

    Reading is tested and works fine, syncing not tested yet.

    This will probably need to go into a separate branch. I'd like to re-add the ability to read/write via USB and also bank switching, but this is a start for now.

    Anyways hope this is somewhat helpful anyways!

    Edit: All works the same as before, just throw MEMCARD.MCR on an SD card formatted as FAT32 and connected to SPI0, and it'll serve that up to the PS1.

  • Randomly disconnecting

    Randomly disconnecting

    I noticed this happening during the Saga Frontier load menu. It will read the data then disappear. If you choose your save quickly you can get it to load. I've tried it on two Phat models with the same result. https://imgur.com/a/tmWFf1v

  • blinking green light on psx

    blinking green light on psx

    I build my own picomemcard+ thanks to your project, but i can not get it to work on my playstation. I can write the pico+ firmware to the raspberry, and after a half minute or so the sd card folder opens. It is a 4GB micro sd fat32 formated with 0.MCR and 1.MCR on it. If i plug it into the playstation there is only a blinking green light and no card is recognized... Am i doing something wrong?

  • Display the specific FS error using LED blink codes (with the correct branch)

    Display the specific FS error using LED blink codes (with the correct branch)

    My Pico just kept blinking no matter what (tried flashing different firmware versions, erasing the "built-in" memory card file & replacing it with an empty one several times) and I wanted to know why it was failing, so I implemented simple blink error codes:

    • 1 flash = FS mount error
    • 2 flashes = Memory card file open error
    • 3 flashes = Memory card file read error
    • 4 flashes = Memory card file is empty
    • 5 flashes = Memory card file contains data, but its size is incorrect

    Turns out my Pico is failing with 4 flashes, so it cannot read the file properly as it thinks it contains 0 bytes. Not sure why that is happening, as the file I uploaded is exactly 131072 bytes (I used the empty memory card example which is provided in this repo).

    I figured it might be useful to others for diagnosing such issues.


    This is a follow-up to my previous pull request, where I unknowingly requested to push to the main branch instead of the development one. Also made a slight change to the commit by request, and added more error codes which may be useful.

  • Not detected by Playstation 2 - SCPH-39003

    Not detected by Playstation 2 - SCPH-39003

    Hi,

    Tested this today with my original fat playstation 1, worked perfectly (using the breakout board I talked about on the Reddit thread that I'd made a while back).

    When trying it with my Playstation 2 (SCPH-39003), it wasn't detected at all. Not sure what the issue there is, but I'll try to debug it if I get time. I understand the primary purpose of this project is for use on the Playstation 1, but it'd be nice if it also worked in backwards compatibility mode on the PS2 also.

  • SSD1331 OLED screen support & bank switching

    SSD1331 OLED screen support & bank switching

    Hey,

    So as discussed this is kind of in support of what @Helder1981 is doing with his hardware project. The OLED screen at the minute must be an SSD1331 module - and I have used some MIT and BSD licensed pieces of code for the OLED in here with the relevant licenses displayed where necessary.

    In the future it should be possible to adapt this to use other displays.

    Also adds bank switching support, via buttons attached to GPIOs 2 and 3.

  • VBUS connected to 3.3v

    VBUS connected to 3.3v

    Hey,

    Just setting this up, and I've noticed you say to connect VBUS on the pico to 3.3v on the PS2, which creates the danger that when plugging in the pico to usb, you'd be connecting that to 5v.

    You can just connect the 3.3v memory card pin to 3.3v on the pico, and it'll power it just fine. That'll also allow you to safely have the board plugged into the PC for debugging at the same time.

  • Picomemcard+ can't figure why I get a green blinking led

    Picomemcard+ can't figure why I get a green blinking led

    I updated my raspberry pi pico from a picomemcard to a picomemcard+ image. While On the picomemcard image, everything worked fine. When I updated it to the picomemcard+ , my pc recognizes the pi as a usb drive. On my psx though, no save files apprear or recognizes that I have inserted a memory card. I got the sample mcr file (which worked fine in the picomemcard) named as 0.mcr, as well the blank save file, named 1.mcr. I am using the exact micro sd module,as the one pictured on the github page. I solder cs to pin 22, sck to 24, mosi to 25, miso to 21, vcc to 39,gnd to 23 . I used both a 1 and 16 gb cards, formated to fat32 with 512 allocation space. What else should I do?

  • Display the specific FS error using LED blink codes

    Display the specific FS error using LED blink codes

    My Pico just kept blinking no matter what (tried flashing different firmware versions, erasing the "built-in" memory card file & replacing it with an empty one several times) and I wanted to know why it was failing, so I implemented simple blink error codes:

    1 flash = FS mount error 2 flashes = File open error 3 flashes = File read error

    Turns out my Pico is failing with 3 flashes, so it cannot read the file properly, meaning the file on the internal FS is smaller than expected. Not sure why that is happening, as the file I uploaded is exactly 131072 bytes (I used the empty memory card example which is provided in this repo).

    I figured it might be useful to others for diagnosing such issues.

  • Strange issue with Toy Story 2 Game

    Strange issue with Toy Story 2 Game

    Hi, I'm using the RP2040-Zero Version v1.0.2 with Toy Story 2 [ITA ver SLES-02407] and when I try to load the save from PicoMemcard+ the game fails to load. After various attemps the game succed to load and I can finally continue the game normally (So the game save is not corrupted). Seems the game use a strange way to manage the memory card because even if I try to switch the MC image with the controller, the game behave randomally glitching at the moment of save. Like sometimes only half MC loaded or corrupting randomally the image, owerwriting a save even of another game.

    The MC works great with other games...

    I've attached the save file to test, maybe someone can try and confirms this strange behavior...

    P.S: I'm using the latest release of xstation if it matters.

    Test MC.zip

  • Image Swtitching Hardware Button

    Image Swtitching Hardware Button

    As mentioned by @Androxilogin since on PS2 memory card and controller bus are separate PicoMemcard cannot detect controller input therefore memory card switching is not functional. Additional hardware buttons are required for memory card switching, which likely requires the availability of two GPIO inputs (for two buttons) and software support.

  • Missing Driver for PicoMemcard CDC

    Missing Driver for PicoMemcard CDC

    I am using windows 7 x64 and raspberry pi pico

    After loaded PicoMemcard+.uf2, my windows ask for the driver of PicoMemcard CDC

    USB\VID_CAFE&PID_4003&REV_0100&MI_00

    Please advise the correct driver for it.

  • LED Not working on RP2040-Zero when building from source

    LED Not working on RP2040-Zero when building from source

    I can not get the LED to function as expected on the Waveshare RP2040 Zero when I build the code myself. I currently have the board wired up only to the PS1 pins, no SD card pins wired. The expected behavior is a flashing red LED when connected to the PS1 indicating it can't read the SD card image. I've confirmed that the current release image available does work as intended, and to my knowledge there are no changes between that and the current release branch.

    I'm building from the smc+/release branch, with the only change being the following:

    $ git diff
    diff --git a/inc/config.h b/inc/config.h
    index 218120d..f2780f0 100644
    --- a/inc/config.h
    +++ b/inc/config.h
    @@ -10,8 +10,8 @@
     #define MC_RECONNECT_TIME      1000                            // time (in ms) the memory card stays disconnected when simulating reconnection
     
     /* Board targeted by build */
    -#define PICO
    -//#define RP2040ZERO
    +//#define PICO
    +#define RP2040ZERO
     
     /* PSX Interface Pinout */
     #ifdef PICO
    

    Which should set the target board appropriately. My build process is:

    export PICO_SDK_PATH=~/pico/pico-sdk/
    mkdir build && cd build
    cmake ..
    cmake --build . --target all -j 10
    

    Building on Ubuntu. No warnings except for a couple at the very end, all part of the SD submodule.

  • QTPY RP2040 Support, adjustments to better support multiple boards

    QTPY RP2040 Support, adjustments to better support multiple boards

    This is my first pull request and my first time doing anything in C. Please feel free to point out any mistakes, and sorry for hacking away at your code.

    The Adafruit QTPY RP2040 is tested and working with these changes, with the exception of the LED. I can't for the life of me figure out why it's not working. I want to make sure that the current code is still working on the RP2040 Zero, and I have one due in later this week.

    Also made other changes so that the target board can be set with -DPICO_BOARD=. This is the same flag used by pico-sdk to set default pins and other tidbits per board. More info about that and the various board names here.

    TODOs include fixing the LED, confirming nothing is broke on Pico or Waveshare_RP2040_Zero, and making a nice svg pinout picture. I don't know how to do that, but I do have a crude text layout.

    PS CARD                            SD CARD
    Inputs on left                Pins on right
    
    And DET, optional.          And power input
                     ________________
                    / QT          PY \
                CLK o GP29       5V  o
                SEL o GP28       GND o GND
                CMD o GP27       3.3 o 3.3V
                DAT o GP26       GP3 o MOSI / SI
                ACK o GP24       GP4 o MISO / SO
                    o GP25       GP6 o SCK / CLK 
                DET o_GP20_______GP5_o SS / CS 
    
    
                 LED   GP12
               LED PWR GP11
    

    I also couldn't find where the DET pin was used in the code. In the future I'd like to add the option to use buttons on the GPIO to change MC images since the PS2 doesn't currently support the controller button combo, to my knowledge. The qtpy 2040 is a bit short on pins so having an extra one free would be nice.

    Thanks!

A FAT filesystem with SPI driver for SD card on Raspberry Pi Pico
A FAT filesystem with SPI driver for SD card on Raspberry Pi Pico

no-OS-FatFS-SD-SPI-RPi-Pico Simple library for SD Cards on the Pico At the heart of this library is ChaN's FatFs - Generic FAT Filesystem Module. It a

Sep 26, 2022
Tetris on a Raspberry Pi Pico mounted on a Pimoroni Pico Explorer

PicoTetris Classic Tetris game running on a Raspberry Pi Pico microcontroller. Pico C port by Richard Birkby Original JavaScript implementation - Jake

Sep 3, 2022
Breakout game for Raspberry Pi Pico with Pimoroni Pico Display pack
Breakout game for Raspberry Pi Pico with Pimoroni Pico Display pack

breakout_rpi_pico Breakout game for Raspberry Pi Pico with Pimoroni Pico Display pack Prebuilt binary (breakout.uf2) is here. To build your own binary

Jan 17, 2022
Pico-uart-bridge - Raspberry Pi Pico UART-USB bridge

Raspberry Pi Pico USB-UART Bridge This program bridges the Raspberry Pi Pico HW UARTs to two independent USB CDC serial devices in order to behave lik

Oct 2, 2022
Digital rain animation gif with glow squeezed into a raspberry pi pico and pimoroni pico-display
Digital rain animation gif with glow squeezed into a raspberry pi pico and pimoroni pico-display

pico-display-matrix Digital rain animation gif with glow squeezed into a raspberry pi pico and pimoroni pico-display or how to actually use all Flash

Sep 10, 2022
Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5"

Raspberry-PI-PICO-display-RPI35 Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5" Con ayuda de la libreria https://github.com/khoih-pr

Nov 10, 2021
Windows kernel-mode driver emulating well-known USB game controllers.

Windows kernel-mode driver emulating well-known USB game controllers.

Oct 2, 2022
An in-progress matching decompilation of Final Fantasy VII For the PSX.

FFVII An in-progress decompilation of the original US release of Final Fantasy VII on the PSX. Building (Linux) Install build dependencies The build p

Sep 9, 2022
Macos-arm64-emulation - A guide for emulating macOS arm64e on an x86-based host.

macos-arm64-emulation Use the following guide to download and configure all of the necessary tools and files for emulating the macOS arm64e kernel. Th

Sep 27, 2022
A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control.
A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control.

N.A.G.E.K.I. A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control. 中文版

Sep 20, 2022
A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control.
A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control.

N.A.G.E.K.I. PLEASE CHECK Main Project A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Us

Dec 30, 2021
Web Server based on the Raspberry Pico using an ESP8266 with AT firmware for WiFi
Web Server based on the Raspberry Pico using an ESP8266 with AT firmware for WiFi

PicoWebServer This program runs on a Raspberry Pico RP2040 to provide a web server when connected to an Espressif ESP8266. This allows the Pico to be

Sep 1, 2022
Open source PCB for arcade sticks using Raspberry Pi Pico.
Open source PCB for arcade sticks using Raspberry Pi Pico.

Pico Fighting Board Open source PCB for arcade sticks using Raspberry Pi Pico. Introduction They say imitation is the highest form of flattery. If tha

Sep 22, 2022
USB host implementation using PIO of raspberry pi pico (RP2040).

Pico-PIO-USB USB host implementation using PIO of raspberry pi pico (RP2040). You can add additional USB port to RP2040. ?? This library is WIP. API m

Sep 23, 2022
This is a set of utilities that allow you to read, write or erase SPI flash chips using a Raspberry Pi Pico (RP2040) chip.

Pico SPI Utilities This is a set of utilities that allow you to read, write or erase SPI flash chips using a Raspberry Pi Pico (RP2040) chip. While th

Aug 7, 2022
A multi-bank MRAM based memory card for Roland instruments
A multi-bank MRAM based memory card for Roland instruments

Roland compatible multi-bank MRAM memory card (click to enlarge) This is a replacement memory card for old Roland instruments of the late 80s and earl

Aug 3, 2022
custom esp8266 controller for driving the pwm led controller

room8266 custom esp8266 controller for driving the pwm led controller designed to drive this: https://github.com/austinscreations/PWM-LED-Controller t

Nov 1, 2021
Raspberry Pi Pico (RP2040) and Micro-ROS (ROS 2) Integration

The Pico is an amazing microcontroller and I couldn't wait for ROS 2 support or Arduino Core, so here is my approach. Once the Arduino Core for RP2040 is out it will be easier to use micro_ros_arduino.

Jun 19, 2022
built-in CMSIS-DAP debugger tailored especially for the RP2040 “Raspberry Pi Pico”

RP2040 has two ARM Cortex-M0+ cores, and the second core normally remains dormant. pico-debug runs on one core in a RP2040 and provides a USB CMSIS-DAP interface to debug the other core. No hardware is added; it is as if there were a virtual debug pod built-in.

Sep 29, 2022