lego-esp32s3-gameboy/README.md

452 lines
10 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🎮 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)
---
## 🚀 Schnellstart - Build & Flash
### Voraussetzungen
- **ESP-IDF v4.4** installiert
- **Python 3.10** (NICHT 3.12!)
- **Git**
- **pyenv** (für Python-Version Management)
### ⚙️ Installation & Build
#### 1⃣ Original GNUBoy Repository klonen
```bash
# Erstelle Arbeitsverzeichnis
mkdir -p ~/Arduino/gameboy
cd ~/Arduino/gameboy
# Clone das Original MCH2022 GNUBoy Projekt
git clone -b v4.4 --recursive https://github.com/badgeteam/mch2022-esp32-app-gnuboy.git gnuboy
cd gnuboy
```
#### 2⃣ Unser angepasstes Projekt darüber kopieren
```bash
# Clone unser LEGO GameBoy Projekt
cd ~/Arduino/gameboy
git clone https://git.hacker-net.de/Hacker-Software/lego-esp32s3-gameboy.git
# Kopiere alle Dateien über das Original-Projekt
cp -r lego-esp32s3-gameboy/* gnuboy/
cd gnuboy
```
#### 3⃣ ESP-IDF v4.4 Setup
```bash
# Abhängigkeiten installieren
sudo apt install python3-gevent python3-virtualenv git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 curl
sudo apt-get install -y \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
curl \
llvm \
libncurses5-dev \
libncursesw5-dev \
xz-utils \
tk-dev \
libffi-dev \
liblzma-dev \
python3-openssl \
git
# pyenv installieren (falls noch nicht vorhanden)
curl https://pyenv.run | bash
# Zu ~/.bashrc hinzufügen:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
# Python 3.10 installieren und aktivieren
pyenv install 3.10.13
pyenv local 3.10.13
# ESP-IDF v4.4 installieren
git clone -b v4.4 --recursive https://github.com/espressif/esp-idf.git ~/esp-idf
cd ~/esp-idf
./install.sh esp32s3
source ./export.sh
```
#### 4⃣ **WICHTIG: Fix-Scripts ausführen!**
⚠️ **Vor dem Kompilieren müssen zwingend diese beiden Scripts ausgeführt werden:**
```bash
cd ~/Arduino/gameboy/gnuboy
# 1. PSRAM-Kompatibilität für ESP-IDF v4.4 herstellen
chmod +x fix_psram.sh
./fix_psram.sh
# 2. Komponenten-Abhängigkeiten fixen (Potentiometer, NFC, JSON)
chmod +x fix_poti_manager_nfc_json.sh
./fix_poti_manager_nfc_json.sh
```
**Was machen diese Scripts?**
- `fix_psram.sh`: Ersetzt `esp_psram` mit `esp_hw_support` (ESP-IDF v4.4 API-Änderung)
- `fix_poti_manager_nfc_json.sh`:
- Fügt fehlende Komponenten-Abhängigkeiten hinzu (json, fatfs, st7789)
- Kopiert `hardware_config.h` an die richtigen Stellen
- Passt ADC-API für Potentiometer an (entfernt deprecated `esp_adc_cal`)
#### 5⃣ Projekt konfigurieren & bauen
```bash
cd ~/Arduino/gameboy/gnuboy
# ESP-IDF Environment laden
source ~/esp-idf/export.sh
# Target setzen
idf.py set-target esp32s3
# (Optional) Konfiguration anpassen, wird schon durch script fix_psram.sh gemacht
idf.py menuconfig
# → Component config → ESP32S3-Specific → PSRAM auf "Octal Mode" setzen
# Projekt bauen
idf.py build
```
#### 6⃣ Flashen
```bash
# USB-Port finden (meist /dev/ttyUSB0 oder /dev/ttyACM0)
ls /dev/ttyUSB* /dev/ttyACM*
# Flashen (ggf. BOOT-Button beim Verbinden gedrückt halten)
idf.py -p /dev/ttyUSB0 flash
# Mit Monitor (zum Debuggen)
idf.py -p /dev/ttyUSB0 flash monitor
# Monitor beenden: Ctrl + ]
#Einfach nur monitor
#idf.py -p /dev/ttyUSB0 monitor
```
### 🐛 Troubleshooting
#### Python 3.12 Fehler?
```bash
# Python 3.10 installieren:
siehe anfang 3⃣ ESP-IDF v4.4 Setup
```
#### Build Fehler?
```bash
# Clean & rebuild:
idf.py fullclean
idf.py build
```
#### PSRAM nicht erkannt?
```bash
# Octal PSRAM aktivieren:
idf.py menuconfig
# → Component config → ESP32S3-Specific
# → [*] Support for external, SPI-connected RAM
# → SPI RAM config → Mode: Octal Mode PSRAM
```
#### Board kommt nicht in Flash-Modus?
```
1. BOOT-Button gedrückt halten
2. RESET-Button kurz drücken
3. BOOT-Button loslassen
4. Flash-Befehl ausführen
```
---
## 🛠️ 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 35
- LRC: GPIO 36
- DIN: GPIO 37
**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
├── fix_psram.sh # ⚠️ WICHTIG: Vor Build ausführen!
├── fix_poti_manager_nfc_json.sh # ⚠️ WICHTIG: Vor Build ausführen!
├── main/
│ ├── CMakeLists.txt
│ ├── main.c # Hauptprogramm
│ └── include/
│ └── 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
└── potentiometer_manager/ # Volume/Brightness Control
├── CMakeLists.txt
├── include/potentiometer_manager.h
└── potentiometer_manager.c
```
---
## 🎮 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
- NFC Tags programmieren mit ROM-Namen
- Tag scannen → ROM startet automatisch!
- 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
- Zwei GameBoys bauen
- Link Cable verbinden:
- SCLK ↔ SCLK
- SOUT ↔ SIN (gekreuzt!)
- SIN ↔ SOUT (gekreuzt!)
- GND ↔ GND
- Gleiches ROM laden auf beiden
- Im Spiel: 2-Player Mode wählen
- 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
### Aktueller Status
- ✅ Projekt-Struktur fertig
- ✅ CMake Build System
- ✅ Pin-Konfiguration
- ✅ Component-Grundstruktur
- ✅ ESP-IDF v4.4 Kompatibilität
- ✅ PSRAM Support (8MB Octal)
- ⏳ 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
- **MCH2022 Badge Team:** ESP32 GNUBoy App
- **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
5. Fix-Scripts ausgeführt? (`fix_psram.sh` & `fix_poti_manager_nfc_json.sh`)
---
## 🎯 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! ❤️*