Skip to content

T-Deck Plus get it now

Overview

LILYGO T-Deck Plus is a highly integrated multi-functional embedded development platform based on the ESP32-S3 chip. It integrates a 2.8-inch ST7789 LCD (320 × 240), trackball navigation module, physical keyboard (I²C), TF card, LoRa SX1262 wireless module, and ES7210 microphone array. Compared to the standard T-Deck, T-Deck Plus adds a GPS module (MIA-M10Q) with the Grove interface pins repurposed for GPS — the Grove interface is not available as a general-purpose connector on T-Deck Plus.

Notes:

  1. The Grove interface pins on T-Deck Plus are allocated to the GPS module and cannot be used as a general-purpose interface.
  2. T-Deck updated the TFT_eSPI ST7789 initialization sequence on 2024-07-26. If screen display is incorrect, check whether the initialization sequence in the repo matches.
  3. The LoRa radio module shares the SPI bus with other peripherals. Only one SPI device can be selected at a time — ensure all other SPI device CS lines are high (inactive) before communicating with the SX1262.
  4. When powered by battery, GPIO10 must be set HIGH. This requirement can be ignored when the board is powered via USB.

Quick Start

Example Support

ExamplePlatformIO/ArduinoESP-IDFDescription
T-Deck ExamplesKeyboard, Microphone, GPS, Touchpad, Unit Test
examples
├─Keyboard_ESP32C3       # ESP32C3 keyboard I2C slave
├─Keyboard_T_Deck_Master # T-Deck read from keyboard
├─Microphone             # Noise detection
├─Touchpad               # Read touch coordinates
├─GPSShield              # GPS Shield example
└─UnitTest               # Factory hardware unit testing

If microphone is enabled, the middle trackball button (GPIO0) is not available.

PlatformIO

  1. Install Visual Studio Code and Python
  2. Search for and install the PlatformIO IDE extension in VS Code
  3. After restarting VS Code, click FileOpen Folder → select the T-Deck directory
  4. Open platformio.ini, uncomment the example line you want to use (only one active at a time)
  5. Click to compile, connect via USB, click to upload

Arduino

  1. Install Arduino IDE
  2. Copy all folders from T-Deck/lib to your Arduino libraries folder
  3. In ToolsBoard, configure:
Arduino IDE SettingValue
BoardESP32S3 Dev Module
USB CDC On BootEnable
CPU Frequency240 MHz
USB DFU On BootDisable
Flash ModeQIO 80 MHz
Flash Size16MB(128Mb)
USB Firmware MSC On BootDisable
PSRAMOPI PSRAM
Partition Scheme16M Flash(3MB APP/9.9MB FATFS)
USB ModeHardware CDC and JTAG
Upload ModeUART0/Hardware CDC
Upload Speed921600
  1. Click Upload. If upload fails, hold the trackball BOOT button, insert USB, then click Upload. Press RST to exit download mode.

The ESP32C3 programming interface is the 6-pin header near the RST button (top to bottom: 3V3, GND, RST, BOOT, RX, TX).

Development Platforms

  1. Visual Studio Code
  2. Arduino IDE
  3. PlatformIO
  4. MicroPython

Video

Key Features

  • ESP32-S3FN16R8 dual-core LX7 @ 240 MHz, Wi-Fi + Bluetooth 5.0 LE
  • SX1262 LoRa (433–915 MHz, optional)
  • MIA-M10Q GNSS module (GPS, added vs. standard T-Deck)
  • 2.8-inch ST7789 LCD (320 × 240), trackball navigation (no touch screen)
  • Physical keyboard (I²C)
  • ES7210 audio codec + MSM381A3729H9CP microphone array
  • 2000 mAh lithium polymer battery
  • 16 MB Flash + 8 MB PSRAM + TF card slot

Product Parameters

FeatureSpecification
MCUESP32-S3FN16R8 @ Dual-core LX7, 240 MHz
Flash16 MB
PSRAM8 MB
Wi-Fi2.4 GHz 802.11 b/g/n
BluetoothBluetooth 5.0 LE
LoRaSX1262, 433–915 MHz (optional)
GPSMIA-M10Q GNSS
Display2.8-inch ST7789 LCD, 320 × 240
InputTrackball + physical keyboard (I²C)
AudioES7210 codec + microphone array
Battery2000 mAh lithium polymer
StorageTF card expansion
USB1 × Type-C
Dimensions100 × 68 × 11 mm

Pin Diagram

T-Deck Plus pin diagram

Pin Mapping

SignalGPIO
Power Enable10
I2S WS5
I2S BCK7
I2S DOUT6
I2C SDA18
I2C SCL8
Battery ADC4
Touch INT16
Keyboard INT46
SD CS39
TFT CS12
LoRa CS9
TFT DC11
TFT Backlight42
SPI MOSI41
SPI MISO38
SPI SCK40
Trackball G013
Trackball G022
Trackball G0315
Trackball G041
ES7210 MCLK48
ES7210 LRCK21
ES7210 SCK47
ES7210 DIN14
LoRa BUSY13
LoRa RST17
LoRa DIO145
BOOT0
GPS TX43
GPS RX44

Peripheral Initialization

The following snippets show the minimum setup for each peripheral using the pin definitions above. Copy the #define block from Pin Mapping into your sketch, then use the relevant snippet.

Before any SPI transaction — pull all other CS lines HIGH first:

cpp
digitalWrite(BOARD_SDCARD_CS, HIGH);
digitalWrite(BOARD_TFT_CS,    HIGH);
digitalWrite(RADIO_CS_PIN,    HIGH);

Power Enable (battery-powered builds)

cpp
// Must be set HIGH when running on battery; safe to call on USB too.
pinMode(BOARD_POWERON, OUTPUT);
digitalWrite(BOARD_POWERON, HIGH);

Display (ST7789 — Arduino_GFX)

cpp
#include <Arduino_GFX_Library.h>

Arduino_DataBus *bus = new Arduino_ESP32SPI(
    BOARD_TFT_DC, BOARD_TFT_CS,
    BOARD_SPI_SCK, BOARD_SPI_MOSI, BOARD_SPI_MISO);

Arduino_GFX *gfx = new Arduino_ST7789(bus, -1, 0, true, 320, 240);

void setup() {
    pinMode(BOARD_TFT_BACKLIGHT, OUTPUT);
    digitalWrite(BOARD_TFT_BACKLIGHT, HIGH);
    gfx->begin();
    gfx->fillScreen(BLACK);
}

Display (ST7789 — TFT_eSPI)

Requires User_Setup.h configured for T-Deck — see the 2024-07-26 commit for the correct initialization sequence.

cpp
#include <TFT_eSPI.h>

TFT_eSPI tft;

void setup() {
    pinMode(BOARD_TFT_BACKLIGHT, OUTPUT);
    digitalWrite(BOARD_TFT_BACKLIGHT, HIGH);
    tft.init();
    tft.setRotation(1);
    tft.fillScreen(TFT_BLACK);
}

LoRa (SX1262 — RadioLib)

cpp
#include <RadioLib.h>

SX1262 radio = new Module(
    RADIO_CS_PIN,   // CS
    RADIO_DIO1_PIN, // DIO1 / IRQ
    RADIO_RST_PIN,  // RST
    RADIO_BUSY_PIN  // BUSY
);

void setup() {
    pinMode(BOARD_SDCARD_CS, OUTPUT); digitalWrite(BOARD_SDCARD_CS, HIGH);
    pinMode(BOARD_TFT_CS,    OUTPUT); digitalWrite(BOARD_TFT_CS,    HIGH);

    SPI.begin(BOARD_SPI_SCK, BOARD_SPI_MISO, BOARD_SPI_MOSI);

    int state = radio.begin(915.0);
    if (state != RADIOLIB_ERR_NONE) {
        Serial.printf("LoRa init failed: %d\n", state);
    }
}

GPS (MIA-M10Q — TinyGPSPlus)

T-Deck Plus only. The Grove interface pins are repurposed for GPS — Grove cannot be used as a general-purpose connector.

cpp
#include <TinyGPSPlus.h>

TinyGPSPlus gps;

void setup() {
    // GPS communicates over UART (Serial1 on ESP32-S3)
    Serial1.begin(9600, SERIAL_8N1, BOARD_GPS_TX_PIN, BOARD_GPS_RX_PIN);
}

void loop() {
    while (Serial1.available()) {
        gps.encode(Serial1.read());
    }
    if (gps.location.isUpdated()) {
        Serial.printf("Lat: %.6f  Lng: %.6f\n",
            gps.location.lat(), gps.location.lng());
    }
}

Keyboard (I²C)

cpp
#include <Wire.h>

#define KEYBOARD_ADDR 0x55

void setup() {
    Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
    pinMode(BOARD_KEYBOARD_INT, INPUT_PULLUP);
}

void loop() {
    if (digitalRead(BOARD_KEYBOARD_INT) == LOW) {
        Wire.requestFrom(KEYBOARD_ADDR, 1);
        if (Wire.available()) {
            char key = Wire.read();
            Serial.printf("Key: %c\n", key);
        }
    }
}

Trackball

cpp
void setup() {
    pinMode(BOARD_TBOX_G01, INPUT);
    pinMode(BOARD_TBOX_G02, INPUT);
    pinMode(BOARD_TBOX_G03, INPUT);
    pinMode(BOARD_TBOX_G04, INPUT);
}

Microphone (ES7210 — I²S)

When the microphone is enabled, GPIO0 (BOOT / trackball center button) is not available.

cpp
#include <driver/i2s.h>

void setup() {
    i2s_config_t i2s_config = {
        .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
        .sample_rate = 16000,
        .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
        .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
        .communication_format = I2S_COMM_FORMAT_STAND_I2S,
        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
        .dma_buf_count = 4,
        .dma_buf_len = 256,
        .use_apll = false,
    };
    i2s_pin_config_t pin_config = {
        .mck_io_num   = BOARD_ES7210_MCLK,
        .bck_io_num   = BOARD_ES7210_SCK,
        .ws_io_num    = BOARD_ES7210_LRCK,
        .data_in_num  = BOARD_ES7210_DIN,
        .data_out_num = I2S_PIN_NO_CHANGE,
    };
    i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
    i2s_set_pin(I2S_NUM_0, &pin_config);
}

SD Card (SPI)

cpp
#include <SD.h>

void setup() {
    SPI.begin(BOARD_SPI_SCK, BOARD_SPI_MISO, BOARD_SPI_MOSI);
    if (!SD.begin(BOARD_SDCARD_CS)) {
        Serial.println("SD init failed");
    }
}

Dimension Diagram

Schematic

Datasheet

Software Development

Dependent Libraries

FAQ

  • Q. Can the Grove interface on T-Deck Plus be used? A. No. On T-Deck Plus, the Grove interface pins are allocated to the GPS module and cannot be used as a general-purpose interface.

  • Q. Does T-Deck Plus have a touch screen? A. No. It uses a trackball navigation module instead.

  • Q. Upload keeps failing? A. Hold the trackball center button (BOOT), insert USB, then click Upload. Press RST to exit download mode.

  • Q. Arduino IDE prompts to upgrade libraries — should I? A. Do not upgrade. Stay with the library versions in the lib directory.

Version History

VersionRelease DateUpdate Description
V1.0Initial release