# ๐ŸŽฎ ESP32-S3 GNUBoy - LEGO GameBoy Emulator **GameBoy/GameBoy Color Emulator fรผr Waveshare ESP32-S3-Touch-LCD-2** --- ## ๐Ÿ“‹ Projekt-รœbersicht Dieses Projekt ist ein **kompletter GameBoy Emulator** fรผr das Waveshare ESP32-S3-Touch-LCD-2 Board. ### โœจ Features - โœ… **GameBoy & GameBoy Color Emulation** (GNUBoy Core) - โœ… **ST7789 Display** (2.0", 240x320, optimiert) - โœ… **NFC ROM-Auswahl** (PN532, einfach Tag scannen!) - โœ… **Potentiometer Controls** (Volume & Brightness) - โœ… **Link Cable 2-Player** (Tetris, Pokemon, etc.) - โœ… **SD Card ROM Loading** (alle deine ROMs) - โœ… **I2S Audio** (MAX98357A, klarer Sound) - โœ… **8 GameBoy Buttons** (Original Layout) --- ## ๐Ÿ› ๏ธ Hardware ### Hauptkomponenten | Component | Model | Notes | |-----------|-------|-------| | **MCU Board** | Waveshare ESP32-S3-Touch-LCD-2 | 16MB Flash, 8MB PSRAM | | **Display** | ST7789 2.0" | 240x320, integriert | | **Audio** | MAX98357A | I2S Amplifier | | **NFC Reader** | PN532 | I2C mode | | **Storage** | MicroSD Card | FAT32, via SPI | ### Pin-Belegung Siehe `main/hardware_config.h` fรผr **alle** Pin-Definitionen! **Wichtigste Pins:** ``` Display (ST7789): - MOSI: GPIO 11 - SCLK: GPIO 12 - CS: GPIO 10 - DC: GPIO 8 - RST: GPIO 14 - BL: GPIO 9 Audio (I2S): - BCLK: GPIO 41 - LRC: GPIO 42 - DIN: GPIO 40 NFC (PN532): - SCL: GPIO 16 - SDA: GPIO 15 Buttons: - UP: GPIO 1 - DOWN: GPIO 2 - LEFT: GPIO 42 - RIGHT: GPIO 41 - A: GPIO 21 - B: GPIO 47 - START: GPIO 48 - SELECT:GPIO 45 Link Cable: - SCLK: GPIO 17 - SOUT: GPIO 18 - SIN: GPIO 38 ``` --- ## ๐Ÿ“ฆ Projekt-Struktur ``` esp32-s3-gnuboy/ โ”œโ”€โ”€ CMakeLists.txt # Root CMake โ”œโ”€โ”€ sdkconfig.defaults # ESP-IDF config โ”œโ”€โ”€ partitions.csv # Flash partitions โ”œโ”€โ”€ README.md # Diese Datei โ”‚ โ”œโ”€โ”€ main/ โ”‚ โ”œโ”€โ”€ CMakeLists.txt โ”‚ โ”œโ”€โ”€ main.c # Hauptprogramm โ”‚ โ””โ”€โ”€ hardware_config.h # Pin-Definitionen โ”‚ โ””โ”€โ”€ components/ โ”œโ”€โ”€ gnuboy/ # GNUBoy Emulator Core โ”‚ โ”œโ”€โ”€ CMakeLists.txt โ”‚ โ”œโ”€โ”€ include/gnuboy.h โ”‚ โ””โ”€โ”€ gnuboy_placeholder.c โ”‚ โ”œโ”€โ”€ st7789/ # Display Driver โ”‚ โ”œโ”€โ”€ CMakeLists.txt โ”‚ โ”œโ”€โ”€ include/st7789.h โ”‚ โ””โ”€โ”€ st7789.c โ”‚ โ”œโ”€โ”€ nfc_manager/ # NFC ROM Selection โ”‚ โ”œโ”€โ”€ CMakeLists.txt โ”‚ โ”œโ”€โ”€ include/nfc_manager.h โ”‚ โ””โ”€โ”€ nfc_manager.c โ”‚ โ””โ”€โ”€ link_cable/ # 2-Player Support โ”œโ”€โ”€ CMakeLists.txt โ”œโ”€โ”€ include/link_cable.h โ””โ”€โ”€ link_cable.c ``` --- ## ๐Ÿš€ Build & Flash ### Voraussetzungen 1. **ESP-IDF v4.4** installiert 2. **Python 3.10** (NICHT 3.12!) 3. **Git** ### Installation ```bash # 1. Repository klonen git clone cd esp32-s3-gnuboy # 2. ESP-IDF aktivieren source ~/esp-idf/export.sh # 3. Target setzen idf.py set-target esp32s3 # 4. (Optional) Konfiguration anpassen idf.py menuconfig # 5. Bauen idf.py build # 6. Flashen idf.py -p /dev/ttyUSB0 flash # 7. Monitor idf.py monitor ``` ### Troubleshooting **Python 3.12 Fehler?** ```bash # Python 3.10 installieren: sudo apt-get install python3.10 python3.10-venv cd ~/esp-idf python3.10 ./install.sh esp32s3 ``` **Build Fehler?** ```bash # Clean & rebuild: idf.py fullclean idf.py build ``` --- ## ๐ŸŽฎ Benutzung ### ROMs laden 1. **SD-Karte formatieren** (FAT32) 2. **Verzeichnis erstellen:** `/roms/gb/` 3. **ROMs kopieren** (.gb oder .gbc Dateien) 4. **SD-Karte einlegen** ### NFC ROM-Auswahl 1. **NFC Tags programmieren** mit ROM-Namen 2. **Tag scannen** โ†’ ROM startet automatisch! 3. **Mapping-File:** `/sd/nfc_roms.json` Beispiel `nfc_roms.json`: ```json { "mappings": [ { "tag_uid": "04:12:34:56:78:9A:B0", "rom_path": "/roms/gb/tetris.gb" }, { "tag_uid": "04:AB:CD:EF:12:34:56", "rom_path": "/roms/gb/pokemon_red.gb" } ] } ``` ### Link Cable 2-Player 1. **Zwei GameBoys bauen** 2. **Link Cable verbinden:** - SCLK โ†” SCLK - SOUT โ†” SIN (gekreuzt!) - SIN โ†” SOUT (gekreuzt!) - GND โ†” GND 3. **Gleiches ROM laden** auf beiden 4. **Im Spiel:** 2-Player Mode wรคhlen 5. **Spielen!** ๐ŸŽฎ๐Ÿ”—๐ŸŽฎ ### Buttons ``` GameBoy Layout: โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ†โ†’โ†‘โ†“ B A SELECT START ``` - **D-Pad:** Bewegung - **A/B:** Aktion - **START:** Menรผ/Start - **SELECT:** Auswahl ### Potentiometer - **Links:** Volume (0-100%) - **Rechts:** Brightness (10-100%) --- ## ๐Ÿ”ง Entwicklung ### Nรคchste Schritte **Aktueller Status:** - โœ… Projekt-Struktur fertig - โœ… CMake Build System - โœ… Pin-Konfiguration - โœ… Component-Grundstruktur - โณ GNUBoy Core Integration - โณ ST7789 Driver fertigstellen - โณ NFC Implementation - โณ Link Cable Implementation **TODO:** 1. **GNUBoy Core integrieren:** - Quellcode von esplay-gb portieren - Fรผr ESP32-S3 anpassen - Serial/Link Interface implementieren 2. **ST7789 Driver fertigstellen:** - Init-Sequenz ergรคnzen - Framebuffer-Rendering optimieren - GameBoyโ†’Display Mapping 3. **NFC Manager implementieren:** - PN532 I2C Treiber - Tag UID auslesen - JSON Mapping parsen 4. **Link Cable fertigstellen:** - GPIO Bit-Transfer - Master/Slave Negotiation - GNUBoy Serial Hook 5. **Audio implementieren:** - I2S Konfiguration - GameBoyโ†’I2S Buffer - Volume Control ### Code-Richtlinien - **Zentralisierte Konfiguration:** Alle Pins in `hardware_config.h` - **ESP-IDF Stil:** ESP_LOG statt printf - **Fehlerbehandlung:** Immer ESP_ERROR_CHECK nutzen - **Dokumentation:** Doxygen-Kommentare --- ## ๐Ÿ“ Lizenz - **GNUBoy:** GPL v2.0 - **Projekt-spezifischer Code:** MIT (oder nach Wahl) --- ## ๐Ÿ™ Credits - **GNUBoy:** Original GameBoy Emulator - **esplay-gb:** ESP32 Port von pebri86 - **Waveshare:** Hardware Board - **Stefan:** LEGO GameBoy Projekt! ๐ŸŽฎ --- ## ๐Ÿ“ž Support Bei Fragen oder Problemen: 1. Hardware-Config prรผfen (`hardware_config.h`) 2. Serial Monitor checken (`idf.py monitor`) 3. Build-Log lesen 4. Pin-Konflikte รผberprรผfen --- ## ๐ŸŽฏ Vision **Ziel:** Der ultimative LEGO GameBoy Emulator! - Zwei baugleiche Gerรคte - Link Cable Multiplayer - NFC ROM-Auswahl - Professionelle Qualitรคt - Open Source **Let's build it!** ๐Ÿš€๐ŸŽฎ --- *Erstellt fรผr Stefan's LEGO GameBoy Projekt* *Hardware: Waveshare ESP32-S3-Touch-LCD-2* *Mit Liebe zum Detail gebaut! โค๏ธ*