perf(l2): bigger CPU instruction cache, TLS and BLE buffers in PSRAM

The framework libs are rebuilt for the L2's own ESP-IDF options
(solo/wio-tracker-l2/idf/sdkconfig): a 32 KB instruction cache and
64-byte data cache lines make frames ~35% faster (map 45 -> 30 ms,
settings ~36 -> 22 ms). mbedTLS and the NimBLE host allocate in PSRAM,
so internal RAM ends up with more free than before (103 KB, largest
block 57 KB; was 89.6 / 45).

Wio_Tracker_L2_idf_libs does the rebuild; it has to run before the
firmware env, also in CI. idf/arduino_tinyusb gives the rebuild the
TinyUSB options and the framework's prebuilt library, which it would
otherwise lose.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-10-01 09:23:50 +02:00
co-authored by Claude Opus 5.5
parent 2f3b95adb4
commit 38f5db5a61
7 changed files with 185 additions and 1 deletions
@@ -55,6 +55,12 @@ jobs:
echo "BUILD_VERSION=dev-$(git rev-parse --short HEAD)" >> $GITHUB_ENV
fi
# The L2 links framework libs rebuilt for its own ESP-IDF options
# (solo/wio-tracker-l2/idf/sdkconfig), which this env builds first.
- name: Rebuild framework libs
if: matrix.env == 'Wio_Tracker_L2_companion_solo_lvgl'
run: pio run -e Wio_Tracker_L2_idf_libs
- name: Build Firmware
env:
FIRMWARE_VERSION: ${{ env.BUILD_VERSION }}
+9
View File
@@ -31,3 +31,12 @@ graphify-out/
# local assistant notes
CLAUDE.md
# pioarduino's framework-lib rebuild (custom_sdkconfig, Wio_Tracker_L2_idf_libs)
# generates an ESP-IDF project in the repo root
/.dummy/
/CMakeLists.txt
/sdkconfig.defaults
/sdkconfig.*
/dependencies.lock
/managed_components/
+1 -1
View File
@@ -62,7 +62,7 @@ pio run -e <env> -t upload # build and flash ov
FIRMWARE_VERSION=v1.0.0 bash build.sh build-firmware <env> # release artifacts into out/
```
Environments are the `*_solo_dual` (OLED / e-ink) and `*_solo_lvgl` (touch) entries in `solo/<board>/platformio.ini`. Optional hardware (CardKB, joystick, GPIO, buzzer…) is enabled with [build flags](./docs/solo/developer/build-flags.md). Releasing: [RELEASE.md](./RELEASE.md).
Environments are the `*_solo_dual` (OLED / e-ink) and `*_solo_lvgl` (touch) entries in `solo/<board>/platformio.ini`. The Wio Tracker L2 needs `pio run -e Wio_Tracker_L2_idf_libs` once before its first build (it rebuilds the framework libs for its ESP-IDF options). Optional hardware (CardKB, joystick, GPIO, buzzer…) is enabled with [build flags](./docs/solo/developer/build-flags.md). Releasing: [RELEASE.md](./RELEASE.md).
This README is protected from upstream merges via `.gitattributes`; after cloning run once `git config merge.ours.driver true`.
@@ -0,0 +1,19 @@
# Stands in for esp32-arduino-lib-builder's arduino_tinyusb during the
# custom_sdkconfig rebuild: its options (Kconfig), and the framework's own
# prebuilt library and headers. No sources, so no archive replaces the
# prebuilt one.
if(CMAKE_BUILD_EARLY_EXPANSION) # the requirements scan: nothing to resolve yet
idf_component_register()
return()
endif()
foreach(dir ${EXTRA_COMPONENT_DIRS})
if(dir MATCHES "framework-arduinoespressif32$")
set(libs "${dir}-libs/${IDF_TARGET}")
endif()
endforeach()
if(NOT libs)
message(FATAL_ERROR "arduino_tinyusb: the Arduino framework isn't among EXTRA_COMPONENT_DIRS")
endif()
idf_component_register(INCLUDE_DIRS "${libs}/include/arduino_tinyusb/tinyusb/src"
"${libs}/include/arduino_tinyusb/include")
target_link_libraries(${COMPONENT_LIB} INTERFACE "${libs}/lib/libarduino_tinyusb.a")
@@ -0,0 +1,105 @@
# The TinyUSB options of the Arduino-ESP32 3.3.12 libs (their values), for
# the custom_sdkconfig rebuild: the component that declares them lives in
# esp32-arduino-lib-builder, so without this file they'd drop out of
# sdkconfig.h and the prebuilt libarduino_tinyusb.a would lose its USB serial.
menu "Arduino TinyUSB"
config TINYUSB_ENABLED
bool
default y
config TINYUSB_CDC_ENABLED
bool
default y
config TINYUSB_DESC_CDC_STRING
string
default "Espressif CDC Device"
config TINYUSB_CDC_RX_BUFSIZE
int
default 64
config TINYUSB_CDC_TX_BUFSIZE
int
default 64
config TINYUSB_CDC_MAX_PORTS
int
default 2
config TINYUSB_MSC_ENABLED
bool
default y
config TINYUSB_DESC_MSC_STRING
string
default "Espressif MSC Device"
config TINYUSB_MSC_BUFSIZE
int
default 4096
config TINYUSB_HID_ENABLED
bool
default y
config TINYUSB_DESC_HID_STRING
string
default "Espressif HID Device"
config TINYUSB_HID_BUFSIZE
int
default 64
config TINYUSB_MIDI_ENABLED
bool
default y
config TINYUSB_DESC_MIDI_STRING
string
default "Espressif MIDI Device"
config TINYUSB_MIDI_RX_BUFSIZE
int
default 64
config TINYUSB_MIDI_TX_BUFSIZE
int
default 64
config TINYUSB_AUDIO_ENABLED
bool
default y
config TINYUSB_DESC_AUDIO_STRING
string
default "Espressif AUDIO Device"
config TINYUSB_VIDEO_ENABLED
bool
default y
config TINYUSB_DESC_VIDEO_STRING
string
default "Espressif VIDEO Device"
config TINYUSB_VIDEO_STREAMING_BUFSIZE
int
default 64
config TINYUSB_VIDEO_STREAMING_IFS
int
default 1
config TINYUSB_DFU_RT_ENABLED
bool
default y
config TINYUSB_DESC_DFU_RT_STRING
string
default "Espressif DFU_RT Device"
config TINYUSB_DFU_ENABLED
bool
default y
config TINYUSB_DESC_DFU_STRING
string
default "Espressif DFU Device"
config TINYUSB_DFU_BUFSIZE
int
default 4096
config TINYUSB_VENDOR_ENABLED
bool
default y
config TINYUSB_DESC_VENDOR_STRING
string
default "Espressif VENDOR Device"
config TINYUSB_VENDOR_RX_BUFSIZE
int
default 64
config TINYUSB_VENDOR_TX_BUFSIZE
int
default 64
config TINYUSB_NCM_ENABLED
bool
default y
config TINYUSB_DEBUG_LEVEL
int
default 0
endmenu
+27
View File
@@ -0,0 +1,27 @@
# ESP-IDF options for the L2's LVGL firmware, over the Arduino framework's own
# (custom_sdkconfig in solo/wio-tracker-l2/platformio.ini; changing this file
# means rebuilding the framework libs: pio run -e Wio_Tracker_L2_idf_libs).
# The reason for all this: a 32 KB instruction cache (the framework ships
# 16 KB) and 64-byte data cache lines. LVGL runs from flash and draws into
# PSRAM; frames draw ~35% faster. Costs 16 KB internal RAM.
CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB=y
CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y
# ...won back, and more: TLS (map downloads, live tiles, OTA) and the BLE
# host keep their buffers in PSRAM.
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y
# What the framework's own build sets for octal-PSRAM boards, which a rebuild
# from its generic config would lose: PSRAM up before global constructors
# (MESH_IN_PSRAM needs it), WiFi TX buffers allocated as needed.
CONFIG_SPIRAM_BOOT_HW_INIT=y
CONFIG_SPIRAM_BOOT_INIT=y
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=y
# CONFIG_SPIRAM_MEMTEST is not set
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32
CONFIG_ESP_WIFI_RX_BA_WIN=6
CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4
+18
View File
@@ -48,6 +48,9 @@ platform = https://github.com/pioarduino/platform-espressif32/releases/download/
; a computer as a USB drive (ui-lvgl/LvglPort.h). A firmware that crashes
; early may need BOOT held over reset to flash.
build_unflags = -DARDUINO_USB_MODE=1
; Bigger CPU caches and other ESP-IDF options (idf/sdkconfig): the framework
; libs are rebuilt for them. Build Wio_Tracker_L2_idf_libs first (see there).
custom_sdkconfig = file://solo/wio-tracker-l2/idf/sdkconfig
build_flags =
${Wio_Tracker_L2.build_flags}
-D ARDUINO_USB_MODE=0
@@ -121,3 +124,18 @@ lib_deps =
Preferences
LittleFS
; Rebuilds the framework libs (ESP-IDF) with the custom_sdkconfig above; the
; firmware env above then links them. Run once before it, and again after a
; custom_sdkconfig change (pio run -e Wio_Tracker_L2_idf_libs). Needed because
; pioarduino's rebuild pass compiles the env's own sources without its include
; paths and libraries, which fails for ours; this env's only source is the
; stub sketch pioarduino puts in .dummy/. idf/ supplies the TinyUSB options.
[env:Wio_Tracker_L2_idf_libs]
platform = ${env:Wio_Tracker_L2_companion_solo_lvgl.platform}
board = seeed_wio_tracker_l2
framework = arduino
custom_sdkconfig = ${env:Wio_Tracker_L2_companion_solo_lvgl.custom_sdkconfig}
board_build.cmake_extra_args = -DEXTRA_COMPONENT_DIRS=${platformio.src_dir}/../.dummy;${platformio.packages_dir}/framework-arduinoespressif32;${platformio.src_dir}/../solo/wio-tracker-l2/idf
lib_deps =
lib_ldf_mode = off
build_src_filter = +<../.dummy/*>