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.
# 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.
# 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
-
Datei
tdeck_plus_lvgl_micropython_merged.binauf die MicroSD-Karte kopieren. -
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
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
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.")