A feature-rich Dreamcast controller emulator built on the Raspberry Pi RP2350 microcontroller with advanced display support, SD card functionality, and conflict-free pin assignments.
- Full Dreamcast Controller Emulation - Standard HKT-7700 and Arcade HKT-7300 modes
- Maple Bus Communication - Native Dreamcast protocol support
- VMU Memory Card Emulation - Complete save game functionality
- Multi-Display Support - SSD1306, SSD1309, and SSD1331 OLEDs
- SD Card Integration - VMU save/load with external storage
- RP2350 Optimization - Enhanced performance and memory utilization
- Automatic Display Detection - Seamless switching between display types
- Font Rendering System - Custom bitmap font with putString/putLetter functions
- Conflict-Free Pin Assignment - Optimized layout eliminates hardware conflicts
- Enhanced Menu System - Configuration and settings interface
- Real-time Status Display - System information and diagnostics
- Raspberry Pi RP2350 (recommended) or RP2040
- USB programming capability
- 3.3V/5V power supply
- SSD1331 - 96x64 Color OLED (SPI)
- SSD1306 - 128x64 Monochrome OLED (I2C)
- SSD1309 - 128x64 Monochrome OLED (I2C)
- SD Card Module - For VMU save/load functionality
- SPI interface compatible
- Digital Buttons - A, B, X, Y, Start, D-pad (8 directions)
- Analog Inputs - Left/Right triggers, Analog stick (X/Y)
- Arcade Mode - Additional C and Z buttons (HKT-7300)
| Pin | Function | Description |
|---|---|---|
| GP0 | Button A | Primary action button |
| GP1 | Button B | Secondary action button |
| GP4 | Button X | Tertiary action button |
| GP5 | Button Y | Quaternary action button |
| GP6 | D-pad Up | Directional pad up |
| GP7 | D-pad Down | Directional pad down |
| GP8 | D-pad Left | Directional pad left |
| GP9 | D-pad Right | Directional pad right |
| GP10 | Start | Start/menu button |
| Pin | Function | Description |
|---|---|---|
| GP11 | MAPLE_A | Maple bus data line A |
| GP12 | MAPLE_B | Maple bus data line B |
| Pin | Function | Description |
|---|---|---|
| GP16 | SD_MISO | SD card data input |
| GP17 | SD_CS | SD card chip select |
| GP18 | SD_SCK | SD card SPI clock |
| GP19 | SD_MOSI | SD card data output |
| Pin | Function | Description |
|---|---|---|
| GP14 | SCK | SPI clock |
| GP15 | MOSI | SPI data output |
| GP20 | DC | Data/Command select |
| GP21 | RST | Display reset |
| Pin | Function | Description |
|---|---|---|
| GP12 | SDA | I2C data (shared with Maple when idle) |
| GP13 | SCL | I2C clock |
| Pin | Function | Description |
|---|---|---|
| GP22 | OLED_PIN | Display type detection |
| GP23 | PAGE_BUTTON | VMU page control |
| Pin | Function | Description |
|---|---|---|
| GP26 | ADC0 | Analog stick X-axis |
| GP27 | ADC1 | Analog stick Y-axis |
| GP28 | ADC2 | Left trigger (L) |
| GP29 | ADC3 | Right trigger (R) |
| Pin | Function | Description |
|---|---|---|
| GP24 | Button C | Additional arcade button |
| GP25 | Button Z | Additional arcade button |
| Pin | Function | Description |
|---|---|---|
| 5V | Power In | USB or external 5V supply |
| 3V3 | Power Out | 3.3V for peripherals |
| GND | Ground | Multiple ground connections |
| Pin | Status | Notes |
|---|---|---|
| GP2 | Available | Future expansion |
| GP3 | Available | Future expansion |
| GP13 | Available | When not using I2C displays |
# Install Pico SDK
git clone https://github.com/raspberrypi/pico-sdk.git
export PICO_SDK_PATH=/path/to/pico-sdk
# Install build tools
sudo apt install cmake gcc-arm-none-eabi ninja-build# Clone repository
git clone [repository-url]
cd MaplePad-alter
# Create build directory
mkdir build && cd build
# Configure build
cmake ..
# Build firmware
ninja maplepad
# Output files:
# - maplepad.elf (main executable)
# - maplepad.uf2 (drag-and-drop programming)
# - maplepad.hex (Intel HEX format)
# - maplepad.bin (binary format)# Method 1: UF2 (Recommended)
# 1. Hold BOOTSEL button and connect USB
# 2. Copy maplepad.uf2 to USB drive
# 3. Device automatically reboots
# Method 2: picotool
picotool load maplepad.uf2
picotool rebootThe system automatically detects the connected display type via GP22:
- Low (0V) - SSD1306/SSD1309 monochrome displays
- High (3.3V) - SSD1331 color display
Set in maple.h:
#define HKT7700 0 // Standard controller (9 buttons)
#define HKT7300 1 // Arcade stick (11 buttons)- Automatic Detection - System detects SD card presence
- VMU Save/Load - Save VMU pages to SD card
- Menu Interface - Access via button combinations
- Connect to Dreamcast via Maple bus
- Power on - system initializes automatically
- Display shows status information
- Controller functions as standard Dreamcast pad
- Save to SD: Access SD menu, select save option
- Load from SD: Access SD menu, select load option
- Page Management: Use page button to cycle VMU pages
- Access configuration menu via button combinations
- Adjust display settings, calibration, and preferences
- View system information and diagnostics
- Missing Functions: Ensure all source files are included
- Pin Conflicts: Verify pin assignments match hardware
- SDK Version: Use compatible Pico SDK version
- No Display: Check power and pin connections
- SD Card Errors: Verify SPI connections and card format
- Controller Not Detected: Check Maple bus wiring
- Boot Failures: Check firmware programming
- Display Corruption: Verify display type detection
- Save/Load Errors: Check SD card functionality
MaplePad-alter/
โโโ src/
โ โโโ maple.c # Main controller logic
โ โโโ maple.h # Core definitions
โ โโโ display.c # Display abstraction layer
โ โโโ display.h # Display interface
โ โโโ sdcard.c # SD card implementation
โ โโโ sdcard.h # SD card interface
โ โโโ ssd1306.c/h # SSD1306 driver
โ โโโ ssd1309.c/h # SSD1309 driver
โ โโโ ssd1331.c/h # SSD1331 driver
โ โโโ font.c/h # Font rendering system
โ โโโ menu.c/h # Menu system
โโโ build/ # Build output
โโโ CMakeLists.txt # Build configuration
โโโ README.md # This file
- Follow existing code style and conventions
- Test thoroughly on hardware before submitting
- Document any new features or pin assignments
- Ensure backward compatibility when possible
- Include hardware configuration details
- Provide build environment information
- Describe steps to reproduce problems
- Include relevant log output or error messages
This project is licensed under Creative Commons Attribution 4.0 International License.
Share โ copy and redistribute the material in any medium or format
Adapt โ remix, transform, and build upon the material for any purpose, even commercially
Attribution โ You must give appropriate credit, provide a link to the license, and indicate if changes were made
- Charlie Cole - Original Pop'n Music Controller foundation
- Mackie Kannard-Smith (mackieks) - MaplePad development and enhancements
- Raspberry Pi Foundation - RP2040/RP2350 platform and SDK
- Community Contributors - Testing, feedback, and improvements
- Original MaplePad Repository
- Charlie Cole's Pop'n Music Controller
- Raspberry Pi Pico SDK
- Dreamcast Maple Bus Documentation
Built with โค๏ธ for the Dreamcast community