nl_flash_w600.c: der Header-Kommentar behauptete, tls_spifls_*/tls_fls_* kämen ganz ohne Locking aus - tatsächlich ist nur das Pin-Switching für die >1MB-Region (ioclose/cs/ck-Switching in wm_internal_fls.c) unsynchronisiert, unser Mutex serialisiert ausschließlich ninlights eigene Tasks, nicht SDK-interne Flash-Nutzer wie den Parameter-Store oder fwup (für Plan 2 vorgemerkt). Auch der Kommentar auf nl_flash_region_base() war ungenau. nl_board.c: G95-Kommentar eindeutiger formuliert (aktuelle Tabelle CW=PB13/WW=PB15, alte Lampen ggf. PB16=WW/PB15=CW).
ninlight
Lokale Firmware für die alten Klyqa-Lampen mit WinnerMicro W600 (E27/E14/GU10 RGB+CW, E27/E14/GU10 CW, G95 Vintage) und das W600-EVK.
Voraussetzungen
- Docker Desktop (primärer Build-Pfad, erste Ausführung baut das Image
ninlight-build) - CMake ≥ 3.20, Ninja, host C compiler (für Host-Tests)
- uv (für die serielle Konsole)
- ARM GNU Toolchain mit newlib:
brew install --cask gcc-arm-embedded(nur Fallback für nativen Build)
Bauen
Docker (empfohlen – kein lokaler ARM-Compiler nötig):
tools/docker.sh cmake -S . -B build/evk -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake -DNINLIGHT_DEVICE=evk
tools/docker.sh cmake --build build/evk
tools/docker.sh tools/build_all.sh # alle 8 Geräte
Für die tägliche Entwicklung: nur das Gerät bauen, das du verwendest (z.B. tools/docker.sh cmake --build build/evk). Der emulierte Docker-Build ist langsam — build_all.sh ist nur für Releases gedacht.
Native Builds (mit lokal installierter ARM-Toolchain):
cmake -S . -B build/evk -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake -DNINLIGHT_DEVICE=evk
cmake --build build/evk
Geräte: evk, e27_rgb, e14_rgb, gu10_rgb, e27_cw, e14_cw, gu10_cw, g95_cw.
Lokale Einstellungen (Token, später WLAN): config.local.cmake.example → config.local.cmake.
Tests
Host-basierte Unit-Tests (laufen nativ auf dem Mac):
tools/test_host.sh
Flashen und Konsole
Verfügbare Ports anzeigen:
build/host-tools/wm_tool -l
Firmware flashen (Standard: App-Image):
tools/flash.sh <device> <port>
Das Skript druckt Bitte bei "please manually reset the device" die Reset-Taste drücken. — wenn wm_tool diese Nachricht zeigt, musst du die Reset-Taste am EVK drücken (Baud 460800). Für blank/erased Chips: tools/flash.sh <device> <port> full (flasht stattdessen das Vollbild mit secboot).
Serielle Konsole (115200 8N1, lokales Echo):
tools/monitor.sh /dev/cu.<port>
Verfügbare Befehle in der Konsole: help.
Werksreset
Gerät 5× hintereinander einschalten, jeweils kürzer als 5 Sekunden.
Hardwaretests
Manuelle Checkliste: docs/hardware-checklist.md.