196 lines
5.7 KiB
Markdown
196 lines
5.7 KiB
Markdown
# 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
|