Split heap gate into separate free-memory (50KB) and largest-block (20KB) thresholds based on field measurements. Enable wolfSSL single-precision ECC to use fixed 256-bit arrays instead of heap-allocated fast-math bignums, reducing TLS handshake memory footprint. Reclaim ~7KB by right-sizing ESP timer task stacks and move WiFi code out of IRAM to free ~25-30KB for heap. Add memory audit landmarks for font and EPUB allocations.
214 lines
8.6 KiB
INI
214 lines
8.6 KiB
INI
[platformio]
|
|
default_envs = default
|
|
build_cache_dir = .cache
|
|
extra_configs = platformio.local.ini
|
|
|
|
[crosspoint]
|
|
version = 1.4.1
|
|
|
|
[base]
|
|
platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.37/platform-espressif32.zip
|
|
board = esp32-c3-devkitm-1
|
|
framework = arduino
|
|
monitor_speed = 115200
|
|
upload_speed = 921600
|
|
check_tool = cppcheck
|
|
; missingInclude (project headers) is suppressed alongside missingIncludeSystem: on a
|
|
; fresh CI checkout cppcheck has no resolved include paths, so it reports every
|
|
; project header as missing (~470 information-level lines) and fails the job.
|
|
check_flags = --enable=all --suppress=missingIncludeSystem --suppress=missingInclude --suppress=unusedFunction --suppress=unmatchedSuppression --suppress=*:*/.pio/* --inline-suppr
|
|
check_skip_packages = yes
|
|
|
|
board_upload.flash_size = 16MB
|
|
board_upload.maximum_size = 16777216
|
|
board_upload.offset_address = 0x10000
|
|
|
|
build_flags =
|
|
-DARDUINO_USB_MODE=1
|
|
-DARDUINO_USB_CDC_ON_BOOT=1
|
|
-DEINK_DISPLAY_SINGLE_BUFFER_MODE=1
|
|
-DDISABLE_FS_H_WARNING=1
|
|
-DDESTRUCTOR_CLOSES_FILE=1
|
|
# https://libexpat.github.io/doc/api/latest/#XML_GE
|
|
-DXML_GE=0
|
|
-DXML_CONTEXT_BYTES=1024
|
|
-std=gnu++2a
|
|
# Enable UTF-8 long file names in SdFat
|
|
-DUSE_UTF8_LONG_NAMES=1
|
|
# Increase PNG scanline buffer to support up to 2048px wide images
|
|
# Default is (320*4+1)*2=2562, we need more for larger images
|
|
-DPNG_MAX_BUFFERED_PIXELS=16416
|
|
-DFREEINK_DEVICE_X4=1
|
|
-DFREEINK_DEVICE_X3=1
|
|
-DFREEINK_NET_WOLFSSL=1
|
|
-DWOLFSSL_USER_SETTINGS
|
|
-DWOLFSSL_OPTIONS_H
|
|
-DWOLFSSL_CLIENT_EXAMPLE
|
|
-DWOLFSSL_TLS13
|
|
# MEMFIX-PORT: single-precision ECC (sp_c32.c). Without it every P-256 operation
|
|
# (TLS 1.3 key_share keygen, ECDHE, ECDSA cert verify) runs on fast-math bignums
|
|
# that WOLFSSL_SMALL_STACK heap-allocates at FP_MAX_BITS size -- tens of KB of
|
|
# temporaries, which OOMs (MP_MEM) at the ~50KB free heap a reading session
|
|
# leaves. SP uses fixed 256-bit arrays: a few KB, and several times faster.
|
|
# SP_SMALL trades the large precomputed point tables for smaller flash.
|
|
-DWOLFSSL_HAVE_SP_ECC
|
|
-DWOLFSSL_SP_SMALL
|
|
-DHAVE_TLS_EXTENSIONS
|
|
-DHAVE_SUPPORTED_CURVES
|
|
-DHAVE_HKDF
|
|
-DHAVE_FFDHE_2048
|
|
-DHAVE_CURVE25519
|
|
-DWC_RSA_PSS
|
|
-DHAVE_SNI
|
|
-Wno-bidi-chars
|
|
-Wl,--wrap=panic_print_backtrace,--wrap=panic_abort,--wrap=bootloader_common_check_efuse_blk_validity
|
|
-fno-exceptions
|
|
# FreeInk panel profiles: compile both X3 (792x528/UC8253) and X4 (800x480/SSD1677);
|
|
# the firmware picks the active one at runtime via HalDisplay setDisplayX3().
|
|
-DFREEINK_DEVICE_X3=1
|
|
-DFREEINK_DEVICE_X4=1
|
|
# BLE HID page-turner host (BleKeyboardHost). NimBLE role/bond config is baked into
|
|
# the prebuilt arduino-esp32 framework's sdkconfig.h, so we don't redefine it here
|
|
# (doing so only warns and has no effect). The host only compiles when
|
|
# FREEINK_CAP_BLE_HID_HOST is set on the env (below); with the capability off,
|
|
# BleKeyboardHost links stubs and pulls in zero NimBLE code.
|
|
-DFREEINK_BLE_HID_SHOW_UNNAMED_DEVICES=0
|
|
|
|
build_unflags =
|
|
-std=gnu++11
|
|
-fexceptions
|
|
|
|
; Board configuration
|
|
board_build.flash_mode = dio
|
|
board_build.flash_size = 16MB
|
|
board_build.partitions = partitions.csv
|
|
|
|
; Shrink the NimBLE footprint for a 1-connection HID host moving 3-6 byte reports.
|
|
; Field-measured: begin() costs ~52 KB with these trims vs ~68 KB with the prebuilt
|
|
; framework defaults — and that 15 KB is the difference between the stack landing
|
|
; above the reader's render shed floor (stable coexistence) and below it (a
|
|
; guaranteed shed/restart flap). Rebuilds the Arduino core libs on first build
|
|
; (slower once, cached after; needs the CMake pin in platformio.local.ini on macOS).
|
|
custom_sdkconfig =
|
|
CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=n
|
|
CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n
|
|
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
|
|
CONFIG_BT_NIMBLE_MAX_CCCDS=2
|
|
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=23
|
|
CONFIG_BT_NIMBLE_MSYS_1_BLOCK_COUNT=6
|
|
CONFIG_BT_NIMBLE_MSYS_2_BLOCK_COUNT=6 ; was 24 x 320 B
|
|
CONFIG_BT_NIMBLE_ACL_BUF_COUNT=6 ; was 24 x 255 B
|
|
CONFIG_BT_NIMBLE_HCI_EVT_HI_BUF_COUNT=12 ; was 30 x 70 B; only scan bursts need many
|
|
; IDF 5.5 sizes the HCI transport pools under TRANSPORT_* names; pin both spellings.
|
|
CONFIG_BT_NIMBLE_TRANSPORT_ACL_FROM_LL_COUNT=6
|
|
CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=12
|
|
CONFIG_BT_NIMBLE_ATT_MAX_PREP_ENTRIES=4 ; was 64; a HID host never does prepared writes
|
|
CONFIG_BT_CTRL_BLE_MAX_ACT=3 ; was 6; need conn + scan + initiate only
|
|
CONFIG_BT_CTRL_BLE_ADV_REPORT_FLOW_CTRL_NUM=50 ; was 100; pairing-time scan only
|
|
CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=10 ; was 30
|
|
; MEMFIX-PORT: task stack right-sizing (~7 KB); NOTE develop has no
|
|
; custom_sdkconfig block — port via sdkconfig.defaults or equivalent.
|
|
; Task stack right-sizing from measured high-water marks (heap block map +
|
|
; per-task stack audit, July 2026): esp_timer used ~0.8 KB of 8 KB across
|
|
; every capture incl. BLE sessions; the FreeRTOS timer service used ~0.5 KB
|
|
; of 4 KB. Neither runs TLS or app code. ~7 KB back to the heap.
|
|
CONFIG_ESP_TIMER_TASK_STACK_SIZE=4096
|
|
CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2560
|
|
; Move the WiFi stack's non-critical hot paths out of IRAM into flash.
|
|
; On the C3, IRAM and DRAM share one SRAM pool, so the ~25-30 KB this
|
|
; frees lands directly in the heap — paid for with lower WiFi throughput
|
|
; during transfers (occasional sync/OTA use, not streaming: acceptable).
|
|
; IRAM cost is static, so the heap gain applies even with WiFi off.
|
|
CONFIG_ESP_WIFI_IRAM_OPT=n
|
|
CONFIG_ESP_WIFI_RX_IRAM_OPT=n
|
|
; Keep the Arduino wrappers for the removed cloud components (below) out of
|
|
; the core source list; all other bundled libraries default to enabled.
|
|
CONFIG_ARDUINO_SELECTIVE_COMPILATION=y
|
|
CONFIG_ARDUINO_SELECTIVE_RainMaker=n
|
|
CONFIG_ARDUINO_SELECTIVE_Insights=n
|
|
|
|
; Drop unused cloud components from the core rebuild. esp_insights/rainmaker
|
|
; require embedded server certs the lib builder can't generate
|
|
; ("https_server.crt.S not found"); this firmware uses none of them.
|
|
custom_component_remove =
|
|
espressif/esp_insights
|
|
espressif/esp_rainmaker
|
|
espressif/esp_diagnostics
|
|
espressif/esp_diag_data_store
|
|
espressif/esp_schedule
|
|
espressif/esp_rcp_update
|
|
espressif/esp_secure_cert_mgr
|
|
espressif/cbor
|
|
|
|
extra_scripts =
|
|
pre:scripts/patch_wolfssl.py
|
|
pre:scripts/build_html.py
|
|
pre:scripts/gen_i18n.py
|
|
pre:scripts/git_branch.py
|
|
pre:scripts/patch_jpegdec.py
|
|
post:scripts/register_unit_tests_target.py
|
|
|
|
; Libraries
|
|
lib_deps =
|
|
BatteryMonitor=symlink://freeink-sdk/libs/hardware/BatteryMonitor
|
|
InputManager=symlink://freeink-sdk/libs/hardware/InputManager
|
|
EInkDisplay=symlink://freeink-sdk/libs/display/FreeInkDisplay
|
|
SDCardManager=symlink://freeink-sdk/libs/hardware/SDCardManager
|
|
; FreeInk HAL support libs the above depend on (BoardConfig pin maps, etc.).
|
|
BoardConfig=symlink://freeink-sdk/libs/hardware/BoardConfig
|
|
PowerManager=symlink://freeink-sdk/libs/hardware/PowerManager
|
|
Rtc=symlink://freeink-sdk/libs/hardware/Rtc
|
|
Imu=symlink://freeink-sdk/libs/hardware/Imu
|
|
SecureNet=symlink://freeink-sdk/libs/network/SecureNet
|
|
FreeInkUI=symlink://freeink-sdk/libs/ui/FreeInkUI
|
|
Icons=symlink://freeink-sdk/libs/assets/Icons
|
|
BleKeyboardHost=symlink://freeink-sdk/libs/network/BleKeyboardHost
|
|
h2zero/NimBLE-Arduino @ ^2.3.8
|
|
bblanchon/ArduinoJson @ 7.4.2
|
|
ricmoo/QRCode @ 0.0.1
|
|
bitbank2/PNGdec @ 1.1.6
|
|
https://github.com/bitbank2/JPEGDEC.git#86282979224c8a32fd51e091ed5a35b0c699a52b
|
|
links2004/WebSockets @ 2.7.3
|
|
wolfssl/Arduino-wolfSSL @ 5.7.2
|
|
|
|
lib_ignore =
|
|
BLE
|
|
|
|
[env:default]
|
|
extends = base
|
|
build_flags =
|
|
${base.build_flags}
|
|
; CROSSPOINT_VERSION is set by scripts/git_branch.py (includes branch + short SHA)
|
|
-DENABLE_SERIAL_LOG
|
|
-DLOG_LEVEL=2 ; Set log level to debug for development builds
|
|
-DFREEINK_CAP_BLE_HID_HOST=1 ; BLE HID page-turner host (NimBLE)
|
|
-DFREEINK_BLE_HID_SCAN_DEBUG=1 ; verbose BLE scan lifecycle/advertisement logs for bring-up
|
|
-DFREEINK_BLE_HID_REPORT_DEBUG=1 ; raw HID report hex dumps + report-map hints (bring-up)
|
|
|
|
|
|
[env:gh_release]
|
|
extends = base
|
|
build_flags =
|
|
${base.build_flags}
|
|
-DCROSSPOINT_VERSION=\"${crosspoint.version}\"
|
|
-DENABLE_SERIAL_LOG
|
|
-DLOG_LEVEL=1 ; Set log level to info for release builds
|
|
-DFREEINK_CAP_BLE_HID_HOST=1 ; BLE HID page-turner host (NimBLE)
|
|
|
|
[env:gh_release_rc]
|
|
extends = base
|
|
build_flags =
|
|
${base.build_flags}
|
|
-DCROSSPOINT_VERSION=\"${crosspoint.version}-rc+${sysenv.CROSSPOINT_RC_HASH}\"
|
|
-DENABLE_SERIAL_LOG
|
|
-DLOG_LEVEL=1 ; Set log level to info for release candidate builds
|
|
-DFREEINK_CAP_BLE_HID_HOST=1 ; BLE HID page-turner host (NimBLE)
|
|
|
|
[env:slim]
|
|
extends = base
|
|
build_flags =
|
|
${base.build_flags}
|
|
-DCROSSPOINT_VERSION=\"${crosspoint.version}-slim\"
|
|
; serial output is disabled in slim builds to save space
|
|
-UENABLE_SERIAL_LOG
|