Skip to content

Commit df424c4

Browse files
kilrahKilrah
andauthored
Lilygo T-Deck Plus support (#204)
* t-deck-plus test * SD init now reliable based on https://github.com/Xinyuan-LilyGO/T-Deck/blob/master/examples/SD/SD.ino * t-deck plus support done * Add assets * Update doc * Update doc * Update doc * Adjust screen constants * Remove fw def --------- Co-authored-by: Kilrah <[email protected]>
1 parent 76785a2 commit df424c4

File tree

9 files changed

+329
-0
lines changed

9 files changed

+329
-0
lines changed

components/retro-go/config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include "targets/rachel-esp32/config.h"
2727
#elif defined(RG_TARGET_NULLNANO)
2828
#include "targets/nullnano/config.h"
29+
#elif defined(RG_TARGET_T_DECK_PLUS)
30+
#include "targets/t-deck-plus/config.h"
2931
#else
3032
#warning "No target defined. Defaulting to ODROID-GO."
3133
#include "targets/odroid-go/config.h"

components/retro-go/rg_input.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ bool rg_input_read_gamepad_raw(uint32_t *out)
130130
uint32_t buttons = 0;
131131
#if defined(RG_TARGET_QTPY_GAMER) || defined(RG_TARGET_BYTEBOI_REV1)
132132
buttons = ~(rg_i2c_gpio_read_port(0) | rg_i2c_gpio_read_port(1) << 8);
133+
#elif defined(RG_TARGET_T_DECK_PLUS)
134+
uint8_t data[5];
135+
if (rg_i2c_read(T_DECK_KBD_ADDRESS, -1, &data, 5)) {
136+
buttons = ((data[0] << 25) | (data[1] << 18) | (data[2] << 11) | ((data[3] & 0xF8) << 4) | (data[4]));
137+
//RG_LOGI("buttons: %08lX", buttons);
138+
}
133139
#else
134140
uint8_t data[5];
135141
if (rg_i2c_read(0x20, -1, &data, 5))
@@ -282,6 +288,8 @@ void rg_input_init(void)
282288
rg_i2c_init();
283289
#if defined(RG_TARGET_QTPY_GAMER) || defined(RG_TARGET_BYTEBOI_REV1)
284290
rg_i2c_gpio_init();
291+
#elif defined(RG_TARGET_T_DECK_PLUS)
292+
rg_i2c_write_byte(T_DECK_KBD_ADDRESS, -1, T_DECK_KBD_MODE_RAW_CMD);
285293
#endif
286294
UPDATE_GLOBAL_MAP(keymap_i2c);
287295
#endif

components/retro-go/rg_system.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,11 @@ static void platform_init(void)
371371
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0)
372372
RG_PANIC("SDL Init failed!");
373373
#endif
374+
375+
#if defined(RG_CUSTOM_PLATFORM_INIT)
376+
RG_LOGI("Running platform-specific init...\n");
377+
RG_CUSTOM_PLATFORM_INIT();
378+
#endif
374379
}
375380

376381
rg_app_t *rg_system_reinit(int sampleRate, const rg_handlers_t *handlers, void *_unused)
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
// Target definition
2+
#define RG_TARGET_NAME "T-DECK-PLUS"
3+
4+
// Storage
5+
#define RG_STORAGE_ROOT "/sd"
6+
#define RG_STORAGE_SDSPI_HOST SPI2_HOST
7+
#define RG_STORAGE_SDSPI_SPEED SDMMC_FREQ_DEFAULT
8+
9+
// Audio
10+
#define RG_AUDIO_USE_INT_DAC 0 // 0 = Disable, 1 = GPIO25, 2 = GPIO26, 3 = Both
11+
#define RG_AUDIO_USE_EXT_DAC 1 // 0 = Disable, 1 = Enable
12+
13+
// Board-specific
14+
#define T_DECK_BOARD_POWER GPIO_NUM_10
15+
#define T_DECK_RADIO_CS GPIO_NUM_9
16+
#define T_DECK_KBD_ADDRESS 0x55
17+
#define T_DECK_KBD_MODE_RAW_CMD 0x03
18+
19+
#define RG_CUSTOM_PLATFORM_INIT() \
20+
gpio_set_direction(T_DECK_BOARD_POWER, GPIO_MODE_OUTPUT); \
21+
gpio_set_level(T_DECK_BOARD_POWER, 1); \
22+
gpio_set_direction(RG_GPIO_SDSPI_CS, GPIO_MODE_OUTPUT); \
23+
gpio_set_direction(T_DECK_RADIO_CS, GPIO_MODE_OUTPUT); \
24+
gpio_set_direction(RG_GPIO_LCD_CS, GPIO_MODE_OUTPUT); \
25+
gpio_set_level(RG_GPIO_SDSPI_CS, 1); \
26+
gpio_set_level(T_DECK_RADIO_CS, 1); \
27+
gpio_set_level(RG_GPIO_LCD_CS, 1); \
28+
gpio_set_pull_mode(RG_GPIO_SDSPI_MISO, GPIO_PULLUP_ONLY); \
29+
rg_task_delay(50);
30+
31+
// Video
32+
#define RG_SCREEN_DRIVER 0 // 0 = ILI9341
33+
#define RG_SCREEN_HOST SPI2_HOST
34+
#define RG_SCREEN_SPEED SPI_MASTER_FREQ_80M
35+
#define RG_SCREEN_BACKLIGHT 1
36+
#define RG_SCREEN_WIDTH 320
37+
#define RG_SCREEN_HEIGHT 240
38+
#define RG_SCREEN_ROTATE 0
39+
#define RG_SCREEN_VISIBLE_AREA {0, 0, 0, 0}
40+
#define RG_SCREEN_SAFE_AREA {0, 0, 0, 0}
41+
42+
#define RG_SCREEN_INIT() \
43+
ILI9341_CMD(0xCF, 0x00, 0xc3, 0x30); \
44+
ILI9341_CMD(0xED, 0x64, 0x03, 0x12, 0x81); \
45+
ILI9341_CMD(0xE8, 0x85, 0x00, 0x78); \
46+
ILI9341_CMD(0xCB, 0x39, 0x2c, 0x00, 0x34, 0x02); \
47+
ILI9341_CMD(0xF7, 0x20); \
48+
ILI9341_CMD(0xEA, 0x00, 0x00); \
49+
ILI9341_CMD(0xC0, 0x1B); /* Power control //VRH[5:0] */ \
50+
ILI9341_CMD(0xC1, 0x12); /* Power control //SAP[2:0];BT[3:0] */ \
51+
ILI9341_CMD(0xC5, 0x32, 0x3C); /* VCM control */ \
52+
ILI9341_CMD(0xC7, 0x91); /* VCM control2 */ \
53+
ILI9341_CMD(0x36, (0x40 | 0x80 | 0x08)); /* Memory Access Control */ \
54+
ILI9341_CMD(0xB1, 0x00, 0x10); /* Frame Rate Control (1B=70, 1F=61, 10=119) */ \
55+
ILI9341_CMD(0xB6, 0x0A, 0xA2); /* Display Function Control */ \
56+
ILI9341_CMD(0xF6, 0x01, 0x30); \
57+
ILI9341_CMD(0xF2, 0x00); /* 3Gamma Function Disable */ \
58+
ILI9341_CMD(0x26, 0x01); /* Gamma curve selected */ \
59+
ILI9341_CMD(0xE0, 0xD0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x32, 0x44, 0x42, 0x06, 0x0e, 0x12, 0x14, 0x17); \
60+
ILI9341_CMD(0xE1, 0xD0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x31, 0x54, 0x47, 0x0E, 0x1C, 0x17, 0x1b, 0x1e); \
61+
62+
// Input
63+
#define RG_GAMEPAD_I2C_MAP { \
64+
{RG_KEY_UP, (1<<18)},\
65+
{RG_KEY_RIGHT, (1<<17)},\
66+
{RG_KEY_DOWN, (1<<20)},\
67+
{RG_KEY_LEFT, (1<<19)},\
68+
{RG_KEY_SELECT, (1<<7)}, \
69+
{RG_KEY_START, (1<<30)},\
70+
{RG_KEY_OPTION, (1<<31)},\
71+
{RG_KEY_A, (1<<1)}, \
72+
{RG_KEY_B, (1<<3)}, \
73+
{RG_KEY_X, (1<<0)}, \
74+
{RG_KEY_Y, (1<<21)},\
75+
{RG_KEY_L, (1<<24)},\
76+
{RG_KEY_R, (1<<14)},\
77+
}
78+
79+
#define RG_GAMEPAD_GPIO_MAP { \
80+
{RG_KEY_MENU, GPIO_NUM_0, GPIO_PULLUP_ONLY, 0},\
81+
}
82+
83+
#define RG_RECOVERY_BTN RG_KEY_MENU
84+
85+
// Battery
86+
#define RG_BATTERY_DRIVER 1
87+
#define RG_BATTERY_ADC_UNIT ADC_UNIT_1
88+
#define RG_BATTERY_ADC_CHANNEL ADC1_CHANNEL_3
89+
#define RG_BATTERY_CALC_PERCENT(raw) (((raw) * 2.f - 3500.f) / (4200.f - 3500.f) * 100.f)
90+
#define RG_BATTERY_CALC_VOLTAGE(raw) ((raw) * 2.f * 0.001f)
91+
92+
// I2C BUS
93+
#define RG_GPIO_I2C_SDA GPIO_NUM_18
94+
#define RG_GPIO_I2C_SCL GPIO_NUM_8
95+
96+
// SPI Display
97+
#define RG_GPIO_LCD_MISO GPIO_NUM_38
98+
#define RG_GPIO_LCD_MOSI GPIO_NUM_41
99+
#define RG_GPIO_LCD_CLK GPIO_NUM_40
100+
#define RG_GPIO_LCD_CS GPIO_NUM_12
101+
#define RG_GPIO_LCD_DC GPIO_NUM_11
102+
#define RG_GPIO_LCD_BCKL GPIO_NUM_42
103+
104+
// SPI SD Card
105+
#define RG_GPIO_SDSPI_MISO GPIO_NUM_38
106+
#define RG_GPIO_SDSPI_MOSI GPIO_NUM_41
107+
#define RG_GPIO_SDSPI_CLK GPIO_NUM_40
108+
#define RG_GPIO_SDSPI_CS GPIO_NUM_39
109+
110+
// External I2S DAC
111+
#define RG_GPIO_SND_I2S_BCK 7
112+
#define RG_GPIO_SND_I2S_WS 5
113+
#define RG_GPIO_SND_I2S_DATA 6
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Lilygo T-Deck Plus
2+
- Status: Fully supported?
3+
- Ref: https://github.com/Xinyuan-LilyGO/T-Deck
4+
5+
Unfortunately the keyboard on this device as shipped can only provide the ASCII code of the last pressed key, no realtime status or press/release events. Fortunately it's driven by an ESP32-C3 that can be reprogrammed via a header on the board.
6+
A modified version that can be switched to providing the realtime state of each key is provided as `t-deck-plus_keyboard_raw_mode.bin` in this folder and can be flashed at 0x0, see the Ref link above for pinout information.
7+
8+
The modified keyboard firmware has been PR'd to the original repo, source available here (https://github.com/Xinyuan-LilyGO/T-Deck/pull/87)
9+
10+
See below image for the provided keyboard layout. It can be modified as desired in the target config, except for the 3 N/A keys (retro-go uses a 32bit value to store key states, but the keyboard has 35).
11+
12+
# Hardware
13+
- Module: ESP32-S3
14+
- Display: 320x240
15+
- Built-in battery
16+
- I2S DAC
17+
18+
# Images
19+
20+
![t-deck-plus_key_layout.png](t-deck-plus_key_layout.png)
3.36 MB
Loading
Binary file not shown.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import os
2+
3+
os.environ["IDF_TARGET"] = "esp32s3"
4+
os.environ["FW_FORMAT"] = "none"
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#
2+
# Serial flasher config
3+
#
4+
CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0"
5+
CONFIG_ESPTOOLPY_BAUD_115200B=n
6+
CONFIG_ESPTOOLPY_BAUD_230400B=n
7+
CONFIG_ESPTOOLPY_BAUD_921600B=y
8+
CONFIG_ESPTOOLPY_BAUD_2MB=n
9+
CONFIG_ESPTOOLPY_BAUD=921600
10+
CONFIG_ESPTOOLPY_COMPRESSED=y
11+
CONFIG_ESPTOOLPY_FLASHMODE="dio"
12+
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
13+
CONFIG_ESPTOOLPY_FLASHFREQ_40M=n
14+
CONFIG_ESPTOOLPY_FLASHFREQ_26M=n
15+
CONFIG_ESPTOOLPY_FLASHFREQ_20M=n
16+
CONFIG_ESPTOOLPY_FLASHFREQ="80m"
17+
CONFIG_ESPTOOLPY_FLASHSIZE_1MB=n
18+
CONFIG_ESPTOOLPY_FLASHSIZE_2MB=n
19+
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=n
20+
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=n
21+
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
22+
CONFIG_ESPTOOLPY_FLASHSIZE="16MB"
23+
CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
24+
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
25+
26+
#
27+
# Compiler options
28+
#
29+
CONFIG_COMPILER_OPTIMIZATION_DEFAULT=n
30+
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
31+
# IMPORTANT: ENABLE=y adds almost 50K to the executable, can't fit in our current 2.5MB goal...
32+
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=n
33+
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y
34+
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=n
35+
CONFIG_COMPILER_CXX_EXCEPTIONS=n
36+
CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
37+
CONFIG_COMPILER_STACK_CHECK_MODE_NORM=n
38+
CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=n
39+
CONFIG_COMPILER_STACK_CHECK_MODE_ALL=n
40+
CONFIG_COMPILER_STACK_CHECK=n
41+
42+
#
43+
# SPI configuration
44+
#
45+
CONFIG_SPI_MASTER_IN_IRAM=y
46+
CONFIG_SPI_MASTER_ISR_IN_IRAM=y
47+
48+
#
49+
# ESP32-specific
50+
#
51+
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_40=n
52+
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=n
53+
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y
54+
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240
55+
CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=n
56+
CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y
57+
CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT=n
58+
CONFIG_ESP_SYSTEM_PANIC_GDBSTUB=n
59+
CONFIG_ESP_DEBUG_OCDAWARE=n
60+
CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
61+
CONFIG_ESP_INT_WDT=y
62+
CONFIG_ESP_TASK_WDT=n
63+
CONFIG_NEWLIB_NANO_FORMAT=y
64+
65+
#
66+
# SPI RAM config
67+
#
68+
CONFIG_ESP32S3_SPIRAM_SUPPORT=y
69+
CONFIG_SPIRAM=y
70+
CONFIG_SPIRAM_BOOT_INIT=y
71+
CONFIG_SPIRAM_IGNORE_NOTFOUND=n
72+
CONFIG_SPIRAM_USE_MEMMAP=n
73+
CONFIG_SPIRAM_USE_CAPS_ALLOC=y
74+
CONFIG_SPIRAM_USE_MALLOC=y
75+
CONFIG_SPIRAM_TYPE_AUTO=y
76+
CONFIG_SPIRAM_TYPE_ESPPSRAM32=n
77+
CONFIG_SPIRAM_TYPE_ESPPSRAM64=n
78+
CONFIG_SPIRAM_SIZE=-1
79+
CONFIG_SPIRAM_SPEED_40M=n
80+
CONFIG_SPIRAM_SPEED_80M=y
81+
CONFIG_SPIRAM_MEMTEST=y
82+
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=32768
83+
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
84+
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
85+
# CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y
86+
CONFIG_SPIRAM_MODE_OCT=y
87+
CONFIG_SPIRAM_CLK_IO=30
88+
CONFIG_SPIRAM_CS_IO=26
89+
90+
#
91+
# FAT Filesystem support
92+
#
93+
CONFIG_FATFS_CODEPAGE_437=y
94+
CONFIG_FATFS_CODEPAGE=437
95+
CONFIG_FATFS_LFN_NONE=n
96+
CONFIG_FATFS_LFN_HEAP=y
97+
CONFIG_FATFS_LFN_STACK=n
98+
CONFIG_FATFS_MAX_LFN=255
99+
CONFIG_FATFS_USE_FASTSEEK=y
100+
101+
#
102+
# FreeRTOS
103+
#
104+
CONFIG_FREERTOS_HZ=100
105+
CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE=n
106+
CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL=y
107+
CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=n
108+
CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
109+
CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE=n
110+
CONFIG_FREERTOS_ASSERT_DISABLE=n
111+
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024
112+
CONFIG_FREERTOS_USE_TRACE_FACILITY=n
113+
CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=n
114+
CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=n
115+
116+
#
117+
# Log output
118+
#
119+
CONFIG_LOG_DEFAULT_LEVEL_NONE=n
120+
CONFIG_LOG_DEFAULT_LEVEL_ERROR=n
121+
CONFIG_LOG_DEFAULT_LEVEL_WARN=y
122+
CONFIG_LOG_DEFAULT_LEVEL_INFO=n
123+
CONFIG_LOG_DEFAULT_LEVEL_DEBUG=n
124+
CONFIG_LOG_DEFAULT_LEVEL_VERBOSE=n
125+
CONFIG_LOG_DEFAULT_LEVEL=2
126+
CONFIG_LOG_COLORS=y
127+
128+
#
129+
# Misc
130+
#
131+
CONFIG_APP_BUILD_BOOTLOADER=n
132+
133+
#
134+
# HTTP Server
135+
#
136+
CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024
137+
CONFIG_HTTPD_MAX_URI_LEN=1024
138+
139+
#
140+
# TLS
141+
#
142+
# Not ideal but I don't want to deal with CAs right now :(
143+
CONFIG_ESP_TLS_INSECURE=y
144+
CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y
145+
146+
#
147+
# SPI Flash driver
148+
#
149+
CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n
150+
151+
#
152+
# Wi-Fi
153+
#
154+
CONFIG_ESP_WIFI_NVS_ENABLED=n
155+
156+
#
157+
# Ethernet
158+
#
159+
CONFIG_ETH_USE_ESP32_EMAC=n
160+
CONFIG_ETH_USE_SPI_ETHERNET=n
161+
CONFIG_ETH_USE_OPENETH=n
162+
163+
#
164+
# Silence deprecations because I have no intention of fixing them right now
165+
#
166+
CONFIG_ADC_SUPPRESS_DEPRECATE_WARN=y
167+
CONFIG_I2S_SUPPRESS_DEPRECATE_WARN=y
168+
169+
#
170+
# Partition table
171+
#
172+
# CONFIG_PARTITION_TABLE_SINGLE_APP is not set
173+
# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set
174+
# CONFIG_PARTITION_TABLE_TWO_OTA is not set
175+
CONFIG_PARTITION_TABLE_CUSTOM=y
176+
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="../partitions.csv"
177+
CONFIG_PARTITION_TABLE_FILENAME="../partitions.csv"

0 commit comments

Comments
 (0)