Skip to content

Commit 0928a95

Browse files
authored
Merge pull request #8351 from jepler/dotclockframebuffer
Dotclockframebuffer
2 parents 54fe3b0 + 0196401 commit 0928a95

File tree

45 files changed

+1876
-42
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1876
-42
lines changed

locale/circuitpython.pot

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,6 +1228,7 @@ msgid "Invalid %q"
12281228
msgstr ""
12291229

12301230
#: ports/atmel-samd/common-hal/microcontroller/Pin.c
1231+
#: ports/espressif/common-hal/dotclockframebuffer/DotClockFramebuffer.c
12311232
#: ports/mimxrt10xx/common-hal/microcontroller/Pin.c
12321233
#: shared-bindings/microcontroller/Pin.c
12331234
msgid "Invalid %q pin"
@@ -1382,6 +1383,10 @@ msgstr ""
13821383
msgid "Must be a %q subclass."
13831384
msgstr ""
13841385

1386+
#: ports/espressif/common-hal/dotclockframebuffer/DotClockFramebuffer.c
1387+
msgid "Must provide 5/6/5 RGB pins"
1388+
msgstr ""
1389+
13851390
#: ports/mimxrt10xx/common-hal/busio/SPI.c shared-bindings/busio/SPI.c
13861391
msgid "Must provide MISO or MOSI pin"
13871392
msgstr ""

main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,10 @@ int __attribute__((used)) main(void) {
10421042
set_safe_mode(SAFE_MODE_NO_CIRCUITPY);
10431043
}
10441044

1045+
// We maybe can't initialize the heap until here, because on espressif port we need to be able to check for reserved psram in settings.toml
1046+
// (but it's OK if this is a no-op due to the heap being initialized in port_init())
1047+
set_safe_mode(port_heap_init(get_safe_mode()));
1048+
10451049
#if CIRCUITPY_ALARM
10461050
// Record which alarm woke us up, if any.
10471051
// common_hal_alarm_record_wake_alarm() should return a static, non-heap object
@@ -1171,6 +1175,13 @@ void gc_collect(void) {
11711175
MP_WEAK void port_gc_collect() {
11721176
}
11731177

1178+
// A port may initialize the heap in port_init but if it cannot (for instance
1179+
// in espressif it must be done after CIRCUITPY is mounted) then it must provde
1180+
// an implementation of this function.
1181+
MP_WEAK safe_mode_t port_heap_init(safe_mode_t safe_mode_in) {
1182+
return safe_mode_in;
1183+
}
1184+
11741185
void NORETURN nlr_jump_fail(void *val) {
11751186
reset_into_safe_mode(SAFE_MODE_NLR_JUMP_FAIL);
11761187
while (true) {

ports/espressif/CMakeLists.txt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,9 @@ set(ENV{IDF_PATH} ${CMAKE_SOURCE_DIR}/esp-idf)
66

77
# The component list here determines what options we get in menuconfig and what the ninja file
88
# can build.
9-
set(COMPONENTS esptool_py soc driver log main esp-tls mbedtls mdns esp_event esp_adc_cal esp_netif esp_wifi lwip ulp wpa_supplicant freertos bt usb)
9+
set(COMPONENTS esptool_py soc driver log main esp-tls mbedtls mdns esp_event esp_adc_cal esp_netif esp_wifi lwip ulp wpa_supplicant freertos bt usb esp32-camera esp_lcd)
1010

11-
if("${CIRCUITPY_ESPCAMERA}")
12-
message("Including esp32-camera")
13-
set(EXTRA_COMPONENT_DIRS "esp32-camera")
14-
list(APPEND COMPONENTS "esp32-camera")
15-
message("COMPONENTS = ${COMPONENTS}")
16-
endif()
11+
list(APPEND EXTRA_COMPONENT_DIRS "esp32-camera")
1712

1813
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
1914
project(circuitpython)

ports/espressif/Makefile

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,11 @@ ifneq ($(CIRCUITPY_BLEIO),0)
257257
SRC_C += common-hal/_bleio/ble_events.c
258258
endif
259259

260+
ifneq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),0)
261+
CFLAGS += -isystem esp-idf/components/esp_lcd/include
262+
CFLAGS += -isystem esp-idf/components/esp_lcd/interface
263+
endif
264+
260265
ifneq ($(CIRCUITPY_ESPCAMERA),0)
261266
SRC_CAMERA := \
262267
$(wildcard common-hal/espcamera/*.c) \
@@ -355,7 +360,7 @@ endif
355360
do-sdkconfig: $(BUILD)/esp-idf/config/sdkconfig.h
356361
QSTR_GLOBAL_REQUIREMENTS += $(BUILD)/esp-idf/config/sdkconfig.h
357362
$(BUILD)/esp-idf/config/sdkconfig.h: boards/$(BOARD)/sdkconfig CMakeLists.txt | $(BUILD)/esp-idf
358-
IDF_PATH=$(IDF_PATH) cmake -S . -B $(BUILD)/esp-idf -DSDKCONFIG=$(BUILD)/esp-idf/sdkconfig -DSDKCONFIG_DEFAULTS="$(SDKCONFIGS)" -DCMAKE_TOOLCHAIN_FILE=$(IDF_PATH)/tools/cmake/toolchain-$(IDF_TARGET).cmake -DIDF_TARGET=$(IDF_TARGET) -GNinja -DCIRCUITPY_ESPCAMERA=$(CIRCUITPY_ESPCAMERA)
363+
IDF_PATH=$(IDF_PATH) cmake -S . -B $(BUILD)/esp-idf -DSDKCONFIG=$(BUILD)/esp-idf/sdkconfig -DSDKCONFIG_DEFAULTS="$(SDKCONFIGS)" -DCMAKE_TOOLCHAIN_FILE=$(IDF_PATH)/tools/cmake/toolchain-$(IDF_TARGET).cmake -DIDF_TARGET=$(IDF_TARGET) -GNinja
359364

360365
# build a lib
361366
# Adding -d explain -j 1 -v to the ninja line will output debug info
@@ -393,6 +398,9 @@ endif
393398
ifneq ($(CIRCUITPY_ESPULP),0)
394399
ESP_IDF_COMPONENTS_LINK += ulp
395400
endif
401+
ifneq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),0)
402+
ESP_IDF_COMPONENTS_LINK += esp_lcd
403+
endif
396404

397405
ESP_IDF_COMPONENTS_EXPANDED = $(foreach component, $(ESP_IDF_COMPONENTS_LINK), $(BUILD)/esp-idf/esp-idf/$(component)/lib$(component).a)
398406

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include "supervisor/board.h"
28+
#include "mpconfigboard.h"
29+
#include "shared-bindings/microcontroller/Pin.h"
30+
31+
void board_init(void) {
32+
}
33+
34+
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
// Micropython setup
28+
29+
#define MICROPY_HW_BOARD_NAME "Adafruit-ESP32-S3-RGB-TFT-Experiment"
30+
#define MICROPY_HW_MCU_NAME "ESP32S3"
31+
32+
#define DEFAULT_I2C_BUS_SDA (&pin_GPIO8)
33+
#define DEFAULT_I2C_BUS_SCL (&pin_GPIO18)
34+
35+
// UART pins attached to the USB-serial converter chip
36+
#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO43)
37+
#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO44)
38+
39+
#define MICROPY_HW_NEOPIXEL (&pin_GPIO4) // also DBLTAP
40+
41+
#define DOUBLE_TAP_PIN (&pin_GPIO4) // also NEOPIXEL
42+
43+
// a 1024x768 16BPP framebuffer + some breathing room
44+
#define DEFAULT_RESERVED_PSRAM (1024 * 1024 * 2)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
USB_VID = 0x239A
2+
USB_PID = 0x8148
3+
USB_PRODUCT = "Adafruit-ESP32-S3-RGB-TFT-Experiment"
4+
USB_MANUFACTURER = "Adafruit"
5+
6+
IDF_TARGET = esp32s3
7+
8+
CIRCUITPY_ESP_FLASH_MODE = dio
9+
CIRCUITPY_ESP_FLASH_FREQ = 80m
10+
CIRCUITPY_ESP_FLASH_SIZE = 16MB
11+
12+
CIRCUITPY_DOTCLOCKFRAMEBUFFER = 1
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "py/objtuple.h"
2+
#include "shared-bindings/board/__init__.h"
3+
4+
STATIC const mp_rom_obj_tuple_t tft_r_pins = {
5+
{&mp_type_tuple},
6+
5,
7+
{
8+
MP_ROM_PTR(&pin_GPIO11),
9+
MP_ROM_PTR(&pin_GPIO10),
10+
MP_ROM_PTR(&pin_GPIO9),
11+
MP_ROM_PTR(&pin_GPIO46),
12+
MP_ROM_PTR(&pin_GPIO3),
13+
}
14+
};
15+
16+
STATIC const mp_rom_obj_tuple_t tft_g_pins = {
17+
{&mp_type_tuple},
18+
6,
19+
{
20+
MP_ROM_PTR(&pin_GPIO48),
21+
MP_ROM_PTR(&pin_GPIO47),
22+
MP_ROM_PTR(&pin_GPIO21),
23+
MP_ROM_PTR(&pin_GPIO14),
24+
MP_ROM_PTR(&pin_GPIO13),
25+
MP_ROM_PTR(&pin_GPIO12),
26+
}
27+
};
28+
29+
STATIC const mp_rom_obj_tuple_t tft_b_pins = {
30+
{&mp_type_tuple},
31+
5,
32+
{
33+
MP_ROM_PTR(&pin_GPIO40),
34+
MP_ROM_PTR(&pin_GPIO39),
35+
MP_ROM_PTR(&pin_GPIO38),
36+
MP_ROM_PTR(&pin_GPIO0),
37+
MP_ROM_PTR(&pin_GPIO45),
38+
}
39+
};
40+
41+
STATIC const mp_rom_map_elem_t tft_table[] = {
42+
{ MP_ROM_QSTR(MP_QSTR_de), MP_ROM_PTR(&pin_GPIO2) },
43+
{ MP_ROM_QSTR(MP_QSTR_vsync), MP_ROM_PTR(&pin_GPIO42) },
44+
{ MP_ROM_QSTR(MP_QSTR_hsync), MP_ROM_PTR(&pin_GPIO41) },
45+
{ MP_ROM_QSTR(MP_QSTR_dclk), MP_ROM_PTR(&pin_GPIO1) },
46+
{ MP_ROM_QSTR(MP_QSTR_red), MP_ROM_PTR(&tft_r_pins) },
47+
{ MP_ROM_QSTR(MP_QSTR_green), MP_ROM_PTR(&tft_g_pins) },
48+
{ MP_ROM_QSTR(MP_QSTR_blue), MP_ROM_PTR(&tft_b_pins) },
49+
};
50+
MP_DEFINE_CONST_DICT(tft_dict, tft_table);
51+
52+
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
53+
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
54+
55+
{ MP_ROM_QSTR(MP_QSTR_TFT), MP_ROM_PTR(&tft_dict) },
56+
57+
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(MICROPY_HW_NEOPIXEL) },
58+
59+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) },
60+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) },
61+
62+
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(DEFAULT_I2C_BUS_SDA) },
63+
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(DEFAULT_I2C_BUS_SCL) },
64+
65+
// I/O expander pin numbers
66+
{ MP_ROM_QSTR(MP_QSTR_TFT_SCK), MP_ROM_INT(0) },
67+
{ MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_INT(1) },
68+
{ MP_ROM_QSTR(MP_QSTR_TFT_RESET), MP_ROM_INT(2) },
69+
{ MP_ROM_QSTR(MP_QSTR_TP_IRQ), MP_ROM_INT(3) },
70+
{ MP_ROM_QSTR(MP_QSTR_BACKLIGHT), MP_ROM_INT(4) },
71+
{ MP_ROM_QSTR(MP_QSTR_BTN_UP), MP_ROM_INT(5) },
72+
{ MP_ROM_QSTR(MP_QSTR_BTN_DN), MP_ROM_INT(6) },
73+
{ MP_ROM_QSTR(MP_QSTR_TFT_MOSI), MP_ROM_INT(7) },
74+
75+
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
76+
{ MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) },
77+
};
78+
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
CONFIG_ESP32S3_SPIRAM_SUPPORT=y
2+
#
3+
# SPI RAM config
4+
#
5+
# CONFIG_SPIRAM_MODE_QUAD is not set
6+
CONFIG_SPIRAM_MODE_OCT=y
7+
CONFIG_SPIRAM_TYPE_AUTO=y
8+
# end of SPI RAM config
9+
10+
CONFIG_DEFAULT_PSRAM_CLK_IO=30
11+
#
12+
# PSRAM Clock and CS IO for ESP32S3
13+
#
14+
CONFIG_DEFAULT_PSRAM_CS_IO=26
15+
# end of PSRAM Clock and CS IO for ESP32S3
16+
17+
# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set
18+
# CONFIG_SPIRAM_RODATA is not set
19+
CONFIG_SPIRAM_SPEED_80M=y
20+
# CONFIG_SPIRAM_SPEED_40M is not set
21+
CONFIG_SPIRAM=y
22+
CONFIG_SPIRAM_BOOT_INIT=y
23+
# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set
24+
CONFIG_SPIRAM_USE_MEMMAP=y
25+
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
26+
# CONFIG_SPIRAM_USE_MALLOC is not set
27+
CONFIG_SPIRAM_MEMTEST=y
28+
#
29+
# LWIP
30+
#
31+
CONFIG_LWIP_LOCAL_HOSTNAME="matouch-tft"
32+
# end of LWIP
33+
#
34+
# CONFIG_ESP_CONSOLE_NONE is not set
35+
CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200
36+
CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_0=y
37+
CONFIG_ESP_CONSOLE_UART_CUSTOM=y
38+
CONFIG_ESP_CONSOLE_UART_NUM=0
39+
CONFIG_ESP_CONSOLE_UART_RX_GPIO=44
40+
CONFIG_ESP_CONSOLE_UART_TX_GPIO=43
41+
CONFIG_ESP_CONSOLE_UART=y
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include "supervisor/board.h"
28+
#include "mpconfigboard.h"
29+
#include "shared-bindings/microcontroller/Pin.h"
30+
31+
void board_init(void) {
32+
// Debug UART
33+
#ifdef DEBUG
34+
common_hal_never_reset_pin(&pin_GPIO43);
35+
common_hal_never_reset_pin(&pin_GPIO44);
36+
#endif
37+
}
38+
39+
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
// Micropython setup
28+
29+
#define MICROPY_HW_BOARD_NAME "ESP32-S3-DevKitC-1-N8R8-with-HACKTABLET"
30+
#define MICROPY_HW_MCU_NAME "ESP32S3"
31+
32+
#define MICROPY_HW_NEOPIXEL (&pin_GPIO48)
33+
34+
#define DEFAULT_UART_BUS_RX (&pin_GPIO44)
35+
#define DEFAULT_UART_BUS_TX (&pin_GPIO43)
36+
37+
// UART pins attached to the USB-serial converter chip
38+
#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO43)
39+
#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO44)
40+
41+
// a 800x480 16BPP framebuffer + some breathing room
42+
#define DEFAULT_RESERVED_PSRAM (800 * 800 * 2)

0 commit comments

Comments
 (0)