From 204f88ddfe6878c33b0952bc56af09e0465a0786 Mon Sep 17 00:00:00 2001 From: Carlos Valdes Date: Tue, 11 Aug 2026 22:15:05 +0200 Subject: [PATCH] fix(nrf54l15): restore the nrf54l15dk build (#11410) * fix(nrf54l15): restore the nrf54l15dk build Three unrelated faults stacked up, so the env has not built from a clean cache for some time. All three were diagnosed in July but never committed. Pin framework-zephyr to 3.40201.251021 (Zephyr 4.2.1). Seeed's platform script only maps their own seeed-xiao-* board ids to a package; any other board -- ours included -- falls back to whatever platform.json declares as the default, which is now Zephyr 4.4.0. Its west manifest pulls a CMSIS_6 whose cmsis_gcc.h calls the ACLE builtins __sxtb16/__sxtab16, and none of the GCC ARM toolchains PlatformIO ships (8.2.1/9.2.1/9.3.1) declare them in arm_acle.h. In C that is only an implicit-declaration warning; in C++ it is a hard error. So a fresh cache silently breaks the build even though nothing in the tree changed. Guard the MMC5983MA case in MagnetometerThread with __has_include. The switch arm constructs MMC5983MASensor unconditionally, so any env whose libdeps lack SparkFun_MMC5983MA_Arduino_Library fails with "expected type-specifier before 'MMC5983MASensor'". Add Print::availableForWrite() to the nrf54l15 Arduino shim. The shim declares flush() but not availableForWrite(), which StreamFrameWriter calls -- so it went unnoticed until that code landed. Verified: clean build of nrf54l15dk from an empty package cache, SUCCESS in 16:01, FLASH 39.04% (570804 B of 1428 KB), RAM 65.65%. The three had never been exercised together -- a previous run with only the pin applied got 17:30 in before hitting the other two. * review: collapse the pin rationale to one repo-local comment The block was pasted twice, and both copies pointed at a note that does not exist in this repository. Kept one, and only the part a reader here can act on: why the fallback happens, and why it is a C++ error rather than the warning the pure-C Zephyr core gets away with. --------- Co-authored-by: Jonathan Bennett --- src/motion/MagnetometerThread.h | 2 ++ src/platform/nrf54l15/Arduino.h | 1 + variants/nrf54l15/nrf54l15.ini | 13 +++++++++++++ 3 files changed, 16 insertions(+) diff --git a/src/motion/MagnetometerThread.h b/src/motion/MagnetometerThread.h index 1f558eb57..cf632867d 100644 --- a/src/motion/MagnetometerThread.h +++ b/src/motion/MagnetometerThread.h @@ -67,9 +67,11 @@ class MagnetometerThread : public concurrency::OSThread } switch (device.type) { +#if __has_include() case ScanI2C::DeviceType::MMC5983MA: sensor = new MMC5983MASensor(device); break; +#endif default: disable(); return; diff --git a/src/platform/nrf54l15/Arduino.h b/src/platform/nrf54l15/Arduino.h index b608c4856..c67628afa 100644 --- a/src/platform/nrf54l15/Arduino.h +++ b/src/platform/nrf54l15/Arduino.h @@ -297,6 +297,7 @@ class Print } virtual void flush() {} + virtual int availableForWrite() { return 0; } }; // ── Stream base class ──────────────────────────────────────────────────────── diff --git a/variants/nrf54l15/nrf54l15.ini b/variants/nrf54l15/nrf54l15.ini index 31adaee10..45e997271 100644 --- a/variants/nrf54l15/nrf54l15.ini +++ b/variants/nrf54l15/nrf54l15.ini @@ -1,5 +1,18 @@ [nrf54l15_base] platform = https://github.com/Seeed-Studio/platform-seeedboards.git +; Pin the Zephyr package explicitly. Seeed's platform script only maps their +; own "seeed-xiao-*" board ids to a framework-zephyr package; any other board +; -- nrf54l15dk included -- falls back to whatever platform.json declares as +; the default, which is now framework-zephyr-nrf54lm20 (Zephyr 4.4.0). Its +; west manifest pulls a CMSIS_6 whose cmsis_gcc.h calls the ACLE builtins +; __sxtb16/__sxtab16, and none of the GCC ARM toolchains PlatformIO ships +; (8.2.1/9.2.1/9.3.1) declare them in arm_acle.h. In C that is only an +; implicit-declaration warning, so the pure-C Zephyr core never notices; in +; C++ it is a hard error, and any .cpp pulling in zephyr/kernel.h hits it. +; Without the pin a fresh package cache breaks this build with nothing in the +; tree having changed. +platform_packages = + platformio/framework-zephyr-nrf54lm20@https://dl.registry.platformio.org/download/platformio/tool/framework-zephyr/3.40201.251021/framework-zephyr-3.40201.251021.tar.gz framework = zephyr extends = arduino_base