lego-esp32s3-gameboy/components/README_COMPONENTS.md

196 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Components Übersicht
Dieses Dokument beschreibt alle Components im ESP32-S3 GameBoy Projekt.
## 🎮 Aktiv genutzte Components
### 1. **peanut-gb** (GameBoy Emulator Core)
- **Pfad:** `components/peanut-gb/`
- **Typ:** Header-Only Emulator
- **Funktion:** Vollständiger GameBoy (DMG) Emulator
- **Optimierung:** Kompiliert mit `-O3` Flag für maximale Performance
- **Features:**
- CPU Emulation (Z80-ähnlicher Sharp LR35902)
- PPU (Picture Processing Unit) für Grafik
- APU (Audio Processing Unit) mit 4 Kanälen
- Memory Management & Cartridge Support
**Verwendung in main.c:**
```c
#include "peanut_gb.h"
gb_init(&gb, &gb_rom_read, ...); // Emulator initialisieren
gb_run_frame(&gb); // Ein Frame emulieren
```
### 2. **st7789** (Display-Treiber)
- **Pfad:** `components/st7789/`
- **Typ:** SPI Display-Treiber
- **Hardware:** ST7789V2 Controller (320×240, 2.0" TFT)
- **SPI-Frequenz:** 80 MHz
- **Features:**
- Hardware-Reset über GPIO
- PWM-Hintergrundbeleuchtung (0-100%)
- DMA-basierte SPI-Transfers
- Optimierte `preswapped` Funktion (BGR565)
**API-Funktionen:**
```c
st7789_init(); // Display initialisieren
st7789_set_backlight(80); // Helligkeit 80%
st7789_fill_screen(0xF800); // Rot
st7789_draw_buffer_preswapped(buffer, ...); // Framebuffer (SCHNELL!)
```
**Performance-Trick:**
Die `preswapped` Funktion spart ~33% CPU-Zeit, da kein Byte-Swapping nötig ist:
```c
// RGB565 → BGR565 Swap direkt beim Rendering
uint16_t c = gb_palette[pixel];
uint16_t swapped = (c >> 8) | (c << 8); // Einmal swappen
buffer[i] = swapped; // → st7789_draw_buffer_preswapped()
```
### 3. **minizip** & **zlib** (Kompression)
- **Pfad:** `components/minizip/`, `components/zlib/`
- **Funktion:** ZIP-Datei Unterstützung
- **Status:** Vorbereitet für zukünftige ROM-Kompression
- **Verwendung:** ROMs können als `.zip` geladen werden
---
## 🔮 Für zukünftige Features vorbereitet
### 4. **link_cable** (2-Player Link-Kabel)
- **Pfad:** `components/link_cable/`
- **Funktion:** GameBoy Link-Kabel Emulation über GPIO
- **Pins:** GPIO 15 (SCLK), GPIO 2 (SOUT), GPIO 17 (SIN)
- **Status:** Component vorhanden, noch nicht integriert
- **Zukünftige Nutzung:**
- 2-Player Modi (z.B. Tetris vs., Pokémon Tausch)
- Kommunikation via GPIO oder ESP-NOW
**Hardware-Vorbereitung:**
```c
#define LINK_GPIO_SCLK 15
#define LINK_GPIO_SOUT 2
#define LINK_GPIO_SIN 17
#define LINK_CLOCK_FREQ 8192 // GameBoy Link Cable: 8192 Hz
```
### 5. **nfc_manager** (NFC-Reader PN532)
- **Pfad:** `components/nfc_manager/`
- **Hardware:** PN532 NFC-Reader
- **Interface:** I2C (geteilt mit Touch-Controller)
- **I2C-Adresse:** 0x24 (Touch: 0x15)
- **Pins:** GPIO 5 (SDA), GPIO 6 (SCL) - SHARED BUS!
- **Status:** Component vorhanden, noch nicht integriert
- **Zukünftige Nutzung:**
- ROM-Auswahl via NFC-Tag
- Save-State auf NFC-Tag speichern
- Cheat-Codes via NFC
**I2C-Bus-Sharing:**
```c
// Touch Controller: 0x15 @ 400 kHz
// NFC Reader: 0x24 @ 100 kHz
// Beide auf I2C_NUM_0, GPIO 5/6
```
### 6. **potentiometer_manager** (ADC für Potis)
- **Pfad:** `components/potentiometer_manager/`
- **Hardware:** 2× Potentiometer
- **Pins:**
- GPIO 3 (ADC1_CH2): Volume
- GPIO 4 (ADC1_CH3): Brightness
- **ADC:** 12-bit (0-4095)
- **Status:** Component vorhanden, noch nicht integriert
- **Zukünftige Nutzung:**
- Volume-Kontrolle für Audio (0-100%)
- Brightness-Kontrolle für Display (0-100%)
**Geplante Integration:**
```c
// Im audio_task:
int volume = poti_read_volume(); // 0-100
master_vol_left = volume * 7 / 100; // NR50 Master Volume
// Im display_task:
int brightness = poti_read_brightness(); // 0-100
st7789_set_backlight(brightness);
```
---
## 🗑️ Nicht genutzte Components
Diese Components stammen vom ursprünglichen MCH2022-Badge Projekt und werden **NICHT** verwendet:
- **appfs** - App-Dateisystem (MCH2022 spezifisch)
- **bus-i2c** - I2C-Bus-Manager (direkte Treiber verwenden)
- **i2c-bme680** - BME680 Umweltsensor
- **i2c-bno055** - BNO055 IMU-Sensor
- **mch2022-bsp** - MCH2022 Board Support Package
- **mch2022-rp2040** - RP2040 Co-Prozessor
- **pax-codecs** - PAX Graphics Codecs
- **pax-graphics** - PAX Graphics Library
- **pax-keyboard** - PAX Keyboard
- **sdcard** - Alte SD-Karten Component (nutzen VFS direkt)
- **spi-ice40** - ICE40 FPGA
- **spi-ili9341** - ILI9341 Display (haben ST7789)
- **ws2812** - WS2812 RGB-LEDs
Diese Components können gelöscht werden, falls Speicherplatz benötigt wird.
---
## 📊 Component Abhängigkeiten
```
main
├─► peanut-gb (Emulator)
├─► st7789 (Display)
├─► minizip (ROM-Kompression, optional)
└─► zlib (Kompression-Backend)
Zukünftig:
├─► link_cable (2-Player)
├─► nfc_manager (NFC-Tags)
└─► potentiometer_manager (Volume/Brightness)
```
---
## 🔧 Neue Component hinzufügen
1. Component-Ordner in `components/` erstellen
2. `CMakeLists.txt` erstellen:
```cmake
idf_component_register(
SRCS "meine_component.c"
INCLUDE_DIRS "include"
REQUIRES "esp_timer"
)
```
3. In `main/CMakeLists.txt` als Abhängigkeit hinzufügen:
```cmake
idf_component_register(
SRCS "main.c"
INCLUDE_DIRS "include"
REQUIRES "st7789" "peanut-gb" "meine_component"
)
```
4. In `main.c` einbinden:
```c
#include "meine_component.h"
```
---
## 📝 Hinweise
- Alle Components werden mit dem ESP-IDF Build-System kompiliert
- Components können Optimierungs-Flags in ihrer `CMakeLists.txt` setzen
- Performance-kritische Components sollten `-O3` verwenden
- DMA-Buffer müssen mit `MALLOC_CAP_DMA` allokiert werden
- PSRAM-Buffer sollten `MALLOC_CAP_SPIRAM` verwenden