lego-esp32s3-gameboy/components/README_COMPONENTS.md

5.7 KiB
Raw Permalink Blame History

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:

#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:

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:

// 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

  • 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:

#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:

// 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:

// 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:
    idf_component_register(
        SRCS "meine_component.c"
        INCLUDE_DIRS "include"
        REQUIRES "esp_timer"
    )
    
  3. In main/CMakeLists.txt als Abhängigkeit hinzufügen:
    idf_component_register(
        SRCS "main.c"
        INCLUDE_DIRS "include"
        REQUIRES "st7789" "peanut-gb" "meine_component"
    )
    
  4. In main.c einbinden:
    #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