# 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