5.7 KiB
5.7 KiB
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
-O3Flag 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
preswappedFunktion (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
.zipgeladen 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:
#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
- Component-Ordner in
components/erstellen CMakeLists.txterstellen:idf_component_register( SRCS "meine_component.c" INCLUDE_DIRS "include" REQUIRES "esp_timer" )- In
main/CMakeLists.txtals Abhängigkeit hinzufügen:idf_component_register( SRCS "main.c" INCLUDE_DIRS "include" REQUIRES "st7789" "peanut-gb" "meine_component" ) - In
main.ceinbinden:#include "meine_component.h"
📝 Hinweise
- Alle Components werden mit dem ESP-IDF Build-System kompiliert
- Components können Optimierungs-Flags in ihrer
CMakeLists.txtsetzen - Performance-kritische Components sollten
-O3verwenden - DMA-Buffer müssen mit
MALLOC_CAP_DMAallokiert werden - PSRAM-Buffer sollten
MALLOC_CAP_SPIRAMverwenden