Lilygo T-Deck Plus: LVGL-MicroPython Firmware Build & Hardware Setup

Anleitung zum Erstellen einer custom lvgl_micropython Firmware für das Lilygo T-Deck Plus (ESP32-S3, 16MB Flash, 8MB Octal PSRAM, ST7789 Display, GT911 Touch, L76K GPS, SX1262 LoRa, Trackpad) inklusive Launcher-Vorbereitung.


1. Repository klonen & kompilieren

Wichtig: Keine Submodule händisch initialisieren! Das make.py-Skript übernimmt die Abhängigkeiten automatisch.

BASH
# Repository frisch klonen
git clone https://github.com/lvgl-micropython/lvgl_micropython
cd lvgl_micropython

# Build-Befehl für das T-Deck Plus ausführen
python3 make.py esp32 \
    BOARD=ESP32_GENERIC_S3 \
    BOARD_VARIANT=SPIRAM_OCT \
    DISPLAY=st7789 \
    INDEV=gt911 \
    --flash-size=16

2. Merged Firmware für SD-Launcher erstellen

Launcher (wie M5Launcher, SD-Launcher, ESP32 App Launcher) benötigen ein einzelnes Binary-Image ab Offset 0x0000 inklusive Bootloader und Partitionstabelle.

BASH
# Zusammenfügen der Binaries mit esptool.py
esptool.py --chip esp32s3 merge_bin \
  -o tdeck_plus_lvgl_micropython_merged.bin \
  --flash_mode dio \
  --flash_size 16MB \
  0x0000 build-ESP32_GENERIC_S3-SPIRAM_OCT/bootloader/bootloader.bin \
  0x8000 build-ESP32_GENERIC_S3-SPIRAM_OCT/partition_table/partition-table.bin \
  0x10000 build-ESP32_GENERIC_S3-SPIRAM_OCT/micropython.bin

3. Flashen & Launcher-Nutzung

Option A: Über SD-Card Launcher

  1. Datei tdeck_plus_lvgl_micropython_merged.bin auf die MicroSD-Karte kopieren.

  2. Im Launcher-Menü auf dem T-Deck Plus auswählen und flashen/starten.

Option B: Direktes Flashen via USB/esptool (falls kein Launcher genutzt wird)

Bash

TXT
esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 write_flash 0x0000 tdeck_plus_lvgl_micropython_merged.bin

4. Hardware-Initialisierung in MicroPython (main.py)

Legt die Stromversorgung an (Power-Pins für Main und GPS), initialisiert den I2C-Bus für Touch/Trackpad, startet LVGL, den L76K GPS UART und den SX1262 LoRa-Modul-Reset.

Python

TXT
import machine
import time
import lvgl as lv

# -----------------------------------------------------------------------------
# 1. Power Management (T-Deck Plus)
# -----------------------------------------------------------------------------
# Hauptplatine einschalten (GPIO 10)
power_pin = machine.Pin(10, machine.Pin.OUT)
power_pin.value(1)

# L76K GPS-Modul einschalten (GPIO 4 - Speziell für T-Deck Plus!)
gps_power = machine.Pin(4, machine.Pin.OUT)
gps_power.value(1)

# Display Backlight einschalten (GPIO 42)
backlight = machine.Pin(42, machine.Pin.OUT)
backlight.value(1)

# -----------------------------------------------------------------------------
# 2. LVGL & ST7789 Display Driver (320x240)
# -----------------------------------------------------------------------------
lv.init()

try:
    import display_driver
    display = display_driver.st7789(
        miso=38, mosi=41, clk=40, cs=12, dc=11, rst=-1,
        width=320, height=240, rot=display_driver.ROTATION_90
    )
except Exception as e:
    print("Display Init Info/Error:", e)

# -----------------------------------------------------------------------------
# 3. Gemeinsamer I2C Bus (GT911 Touch + Tastatur / Trackpad)
# -----------------------------------------------------------------------------
i2c = machine.I2C(0, sda=machine.Pin(18), scl=machine.Pin(8), freq=400000)

try:
    import indev_driver
    touch = indev_driver.gt911(i2c=i2c, touch_int=16)
except Exception as e:
    print("Touch Init Info/Error:", e)

# -----------------------------------------------------------------------------
# 4. GPS-Modul L76K (UART)
# -----------------------------------------------------------------------------
gps_uart = machine.UART(1, baudrate=9600, tx=machine.Pin(43), rx=machine.Pin(44))

def read_gps_line():
    if gps_uart.any():
        line = gps_uart.readline()
        if line:
            return line.decode('utf-8', 'ignore').strip()
    return None

# -----------------------------------------------------------------------------
# 5. SX1262 LoRa Chip (SPI)
# -----------------------------------------------------------------------------
lora_cs = machine.Pin(9, machine.Pin.OUT, value=1)
lora_reset = machine.Pin(17, machine.Pin.OUT)
lora_busy = machine.Pin(13, machine.Pin.IN)

def reset_lora():
    lora_reset.value(0)
    time.sleep_ms(20)
    lora_reset.value(1)
    time.sleep_ms(20)

reset_lora()

# -----------------------------------------------------------------------------
# 6. Funktion zur Rückkehr zum SD-Launcher
# -----------------------------------------------------------------------------
def reboot_to_launcher():
    import esp32
    try:
        esp32.Partition.mark_app_valid_cancel_rollback()
        p = esp32.Partition(esp32.Partition.TYPE_APP, subtype=0x10) # OTA_0
        p.set_boot()
    except Exception as e:
        print("Reboot to Launcher Error:", e)
    machine.reset()

# -----------------------------------------------------------------------------
# 7. LVGL Test-UI
# -----------------------------------------------------------------------------
scr = lv.scr_act()
label = lv.label(scr)
label.set_text("T-Deck Plus Ready!")
label.center()

print("T-Deck Plus erfolgreich initialisiert.")