Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
86f8a7c
feat: add LilyGO T-Deck support + CI build + web flasher
Jul 6, 2026
56b45f2
ci: deploy web flasher to gh-pages from any branch
Jul 6, 2026
51b7696
fix: source IDF env in CI container
Jul 6, 2026
d67604d
fix: add missing ciFiles element in flasher
Jul 6, 2026
66b9e3a
feat: add serial monitor with auto-connect after flashing
Jul 6, 2026
1447a90
fix: use IDF flash_files key in flasher_args.json
Jul 6, 2026
4a48751
feat: add debug build variant with USB-Serial-JTAG console
Jul 6, 2026
2e40009
fix: change panic to reboot + longer INT WDT for debug build
Jul 6, 2026
3a4624c
fix: add TinyUSB back to debug config (PHY init required for USB-JTAG)
Jul 6, 2026
bb716c7
fix: stop esptool-js patching bootloader header (ets_loader.c 78 boot…
3rdIteration Jul 6, 2026
1c79e68
fix: tdeck backlight turned off for all valid brightness levels
3rdIteration Jul 6, 2026
f601a74
refactor: simplify tdeck backlight to plain GPIO on/off for debugging
3rdIteration Jul 6, 2026
91178cd
feat: reinstate tdeck stepped backlight with corrected level mapping
3rdIteration Jul 6, 2026
ab4399a
fix: treat tdeck trackball as edge-triggered scroll, not buttons
3rdIteration Jul 6, 2026
b15b49f
fix: physical keyboard handling in mnemonic entry + trackball sensiti…
3rdIteration Jul 6, 2026
be9e8a2
feat: qwerty on-screen keyboards for devices with a physical keyboard
3rdIteration Jul 6, 2026
e056c0f
feat: blind passphrase confirmation + PIN entry via physical keyboard
3rdIteration Jul 6, 2026
693a985
fix: parseable firmware version, TDECK board type, SYM-mode PIN digits
3rdIteration Jul 7, 2026
e4c56a9
feat: keyboard backlight tracks the screen backlight
3rdIteration Jul 7, 2026
70194c6
fix: tdeck battery meter accuracy and usb/charging detection
3rdIteration Jul 7, 2026
c825f30
fix: show tdeck battery voltage in device info screen
3rdIteration Jul 7, 2026
12e940b
fix: disable BGR color order for T-Deck (use RGB instead)
Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Build T-Deck

on:
push:
branches: [ '**' ]
pull_request:
branches: [ master ]

jobs:
build:
strategy:
matrix:
variant:
- { name: tdeck, config: sdkconfig_display_tdeck.defaults }
- { name: tdeck-debug, config: sdkconfig_display_tdeck_debug.defaults }
runs-on: ubuntu-latest
container: espressif/idf:v5.5.4
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
# Full history + tags so git describe produces a parseable
# firmware version (companion apps reject e.g. "1")
fetch-depth: 0

- name: Build ${{ matrix.variant.name }} firmware
shell: bash
run: |
. /opt/esp/idf/export.sh
git config --global --add safe.directory "$GITHUB_WORKSPACE"
echo "Firmware version: $(git describe --tags --always --dirty)"
cp configs/${{ matrix.variant.config }} sdkconfig.defaults
idf.py -B build_${{ matrix.variant.name }} set-target esp32s3
idf.py -B build_${{ matrix.variant.name }} build

- name: Stage firmware artifacts
run: |
mkdir -p firmware-${{ matrix.variant.name }}/bootloader firmware-${{ matrix.variant.name }}/partition_table
cp build_${{ matrix.variant.name }}/bootloader/bootloader.bin firmware-${{ matrix.variant.name }}/bootloader/
cp build_${{ matrix.variant.name }}/partition_table/partition-table.bin firmware-${{ matrix.variant.name }}/partition_table/
cp build_${{ matrix.variant.name }}/ota_data_initial.bin firmware-${{ matrix.variant.name }}/ 2>/dev/null || true
cp build_${{ matrix.variant.name }}/jade.bin firmware-${{ matrix.variant.name }}/ 2>/dev/null || true
cp build_${{ matrix.variant.name }}/flasher_args.json firmware-${{ matrix.variant.name }}/ 2>/dev/null || true
Comment on lines +38 to +43
echo "Firmware staged:"
find firmware-${{ matrix.variant.name }} -type f | sort

- name: Upload firmware artifact
uses: actions/upload-artifact@v4
with:
name: firmware-${{ matrix.variant.name }}
path: firmware-${{ matrix.variant.name }}/
retention-days: 90

deploy:
if: github.event_name == 'push'
needs: build
Comment on lines +54 to +56
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4

- name: Download normal firmware artifact
uses: actions/download-artifact@v4
with:
name: firmware-tdeck
path: flasher/firmware/tdeck/

- name: Download debug firmware artifact
uses: actions/download-artifact@v4
with:
name: firmware-tdeck-debug
path: flasher/firmware/tdeck-debug/

- name: Deploy to gh-pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: flasher/
destination_dir: .
keep_files: false
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ dist/
jade_client.egg-info/
docs/_build/
**/nvs_flash.bin
flasher/firmware/
84 changes: 84 additions & 0 deletions configs/sdkconfig_display_tdeck.defaults
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# display tdeck
CONFIG_APP_REPRODUCIBLE_BUILD=y
CONFIG_BF20A6_SUPPORT=n
CONFIG_BF3005_SUPPORT=n
CONFIG_BOARD_TYPE_TDECK=y
CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y
CONFIG_BOOTLOADER_WDT_ENABLE=n
CONFIG_BT_ENABLED=y
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=517
CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=11
CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=5632
CONFIG_BT_NIMBLE_LOG_LEVEL_NONE=y
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y
CONFIG_BT_NIMBLE_NVS_PERSIST=y
CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n
CONFIG_BT_NIMBLE_ROLE_CENTRAL=n
CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
CONFIG_BT_NIMBLE_SM_LEGACY=n
CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="j"
CONFIG_BUTTON_LONG_PRESS_HOLD_SERIAL_TIME_MS=100
CONFIG_BUTTON_LONG_PRESS_TIME_MS=500
CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=y
CONFIG_COMPILER_WARN_WRITE_STRINGS=y
CONFIG_DEBUG_MODE=y
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
CONFIG_ESP_CONSOLE_NONE=y
CONFIG_ESP_CONSOLE_SECONDARY_NONE=y
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
CONFIG_ESP_ERR_TO_NAME_LOOKUP=n
CONFIG_ESP_MAIN_TASK_STACK_SIZE=12288
CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=n
CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=n
CONFIG_ESP_SYSTEM_BBPLL_RECALIB=n
CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y
CONFIG_ESP_TASK_WDT_EN=n
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=n
CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=n
CONFIG_ESP_WIFI_IRAM_OPT=n
CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=n
CONFIG_ESP_WIFI_NVS_ENABLED=n
CONFIG_ESP_WIFI_RX_IRAM_OPT=n
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_VFS_FSTAT_BLKSIZE=4096
CONFIG_FATFS_VOLUME_COUNT=1
CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3
CONFIG_GC0308_SUPPORT=n
CONFIG_GC032A_SUPPORT=n
CONFIG_GC2145_SUPPORT=n
CONFIG_IDF_TARGET="esp32s3"
CONFIG_LIBC_NEWLIB_NANO_FORMAT=y
CONFIG_LOG_DEFAULT_LEVEL_NONE=y
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
CONFIG_NT99141_SUPPORT=n
CONFIG_OV2640_SUPPORT=n
CONFIG_OV3660_SUPPORT=n
CONFIG_OV5640_SUPPORT=n
CONFIG_OV7670_SUPPORT=n
CONFIG_OV7725_SUPPORT=n
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitionss3.csv"
CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=n
CONFIG_SC030IOT_SUPPORT=n
CONFIG_SPIRAM=y
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=256
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
CONFIG_SPIRAM_MEMTEST=n
CONFIG_SPIRAM_MODE_OCT=y
CONFIG_SPIRAM_RODATA=y
CONFIG_SPIRAM_SPEED_80M=y
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
CONFIG_SPI_FLASH_VERIFY_WRITE=y
CONFIG_SPI_MASTER_ISR_IN_IRAM=n
CONFIG_SPI_SLAVE_ISR_IN_IRAM=n
CONFIG_TINYUSB_CDC_ENABLED=y
CONFIG_TINYUSB_CDC_RX_BUFSIZE=64
87 changes: 87 additions & 0 deletions configs/sdkconfig_display_tdeck_debug.defaults
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# display tdeck (debug: USB-Serial-JTAG console)
CONFIG_APP_REPRODUCIBLE_BUILD=y
CONFIG_BF20A6_SUPPORT=n
CONFIG_BF3005_SUPPORT=n
CONFIG_BOARD_TYPE_TDECK=y
CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
CONFIG_BOOTLOADER_WDT_ENABLE=n
CONFIG_BT_ENABLED=y
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=517
CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=11
CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=5632
CONFIG_BT_NIMBLE_LOG_LEVEL_NONE=y
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y
CONFIG_BT_NIMBLE_NVS_PERSIST=y
CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n
CONFIG_BT_NIMBLE_ROLE_CENTRAL=n
CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
CONFIG_BT_NIMBLE_SM_LEGACY=n
CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="j"
CONFIG_BUTTON_LONG_PRESS_HOLD_SERIAL_TIME_MS=100
CONFIG_BUTTON_LONG_PRESS_TIME_MS=500
CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=y
CONFIG_COMPILER_WARN_WRITE_STRINGS=y
CONFIG_DEBUG_MODE=y
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
CONFIG_ESP_ERR_TO_NAME_LOOKUP=n
CONFIG_ESP_MAIN_TASK_STACK_SIZE=12288
CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=n
CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=n
CONFIG_ESP_SYSTEM_BBPLL_RECALIB=n
CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y
CONFIG_ESP_INT_WDT_TIMEOUT_MS=10000
CONFIG_ESP_TASK_WDT_EN=n
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=n
CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=n
CONFIG_ESP_WIFI_IRAM_OPT=n
CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=n
CONFIG_ESP_WIFI_NVS_ENABLED=n
CONFIG_ESP_WIFI_RX_IRAM_OPT=n
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_VFS_FSTAT_BLKSIZE=4096
CONFIG_FATFS_VOLUME_COUNT=1
CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3
CONFIG_GC0308_SUPPORT=n
CONFIG_GC032A_SUPPORT=n
CONFIG_GC2145_SUPPORT=n
CONFIG_IDF_TARGET="esp32s3"
CONFIG_JADE_USE_USB_JTAG_SERIAL=y
CONFIG_LIBC_NEWLIB_NANO_FORMAT=y
CONFIG_LIBC_STDIN_LINE_ENDING_LF=y
CONFIG_LIBC_STDOUT_LINE_ENDING_LF=y
CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
CONFIG_NT99141_SUPPORT=n
CONFIG_OV2640_SUPPORT=n
CONFIG_OV3660_SUPPORT=n
CONFIG_OV5640_SUPPORT=n
CONFIG_OV7670_SUPPORT=n
CONFIG_OV7725_SUPPORT=n
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitionss3.csv"
CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=n
CONFIG_SC030IOT_SUPPORT=n
CONFIG_SPIRAM=y
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=256
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
CONFIG_SPIRAM_MEMTEST=n
CONFIG_SPIRAM_MODE_OCT=y
CONFIG_SPIRAM_RODATA=y
CONFIG_SPIRAM_SPEED_80M=y
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
CONFIG_SPI_FLASH_VERIFY_WRITE=y
CONFIG_TINYUSB_CDC_ENABLED=y
CONFIG_TINYUSB_CDC_RX_BUFSIZE=64
CONFIG_SPI_MASTER_ISR_IN_IRAM=n
CONFIG_SPI_SLAVE_ISR_IN_IRAM=n
4 changes: 4 additions & 0 deletions flasher/branding/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading