Skip to content

T-Deck get it now

Overview

LILYGO T-Deck is a highly integrated multi-functional embedded development platform based on the ESP32-S3 main control chip. It integrates a 2.8-inch ST7789 LCD (320 × 240), trackball navigation module, physical keyboard (I²C), TF card storage, LoRa SX1262 wireless module, and ES7210 microphone array. Suitable for IoT terminals, portable interactive devices, and low-power wireless communication projects.

Notes:

  1. T-Deck-Plus has allocated the Grove interface pins for GPS module use — the Grove interface on T-Deck-Plus cannot be used as a general-purpose interface.
  2. T-Deck updated the TFT_eSPI ST7789 initialization sequence on 2024-07-26. If you encounter incorrect screen display, check that 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

Available 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 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 BOOT button (trackball center), insert USB, then click Upload. After upload, click 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
  • 2.8-inch ST7789 LCD (320 × 240), no touch — trackball navigation
  • Physical keyboard (I²C communication)
  • 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 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);

// 320×240, no RST pin (-1), portrait
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() {
    // Deselect other SPI devices first
    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);

    // 915.0 MHz, +22 dBm, bandwidth 125 kHz, SF7, CR 4/5
    int state = radio.begin(915.0);
    if (state != RADIOLIB_ERR_NONE) {
        Serial.printf("LoRa init failed: %d\n", state);
    }
}

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);
}

// Poll or use interrupt — read one byte per keypress
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
// Trackball outputs quadrature pulses on four GPIOs.
// Attach interrupts to detect movement direction.
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. Still don't know how to set up the programming environment? A. Refer to the LilyGo-Document for additional setup instructions.

  • Q. Arduino IDE prompts to upgrade library files — should I? A. Do not upgrade. Different library versions may be incompatible; stay with the versions in the lib directory.

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

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

Version History

VersionRelease DateUpdate Description
V1.0Initial release