FW-RemoteStation ist die Zephyr-RTOS-Firmware für das FM-Transceiver-Board der OE5XRX Remote Station. Sie betreibt einen STM32U575 als USB-Bridge mit SA818-FM-Transceiver-Anbindung (Audio via UAC2, Steuerung via CDC-ACM, Firmware-Update via DFU).
Das Target native_sim/native/64 ermöglicht automatisierte Tests von Logik, Audio-Pfaden und
Protokollen auf dem Entwicklungsrechner — noch bevor echte Hardware erforderlich ist.
- Klare Trennung von Hardware-abhängigem Treiber-Code und anwendungsnaher Logik
- High-Level-Tests via Simulation (
native_sim) ohne physische Hardware - Reproduzierbare Builds und Tests mit Twister
- Zweistufige Sprachpolitik: Treiber in
drivers/folgen dem C-first-Zephyr-Idiom (C-ABI — die Implementierung darf.cppsein, erzwungen wird kein Sprachwechsel); modernes C++20 ohne Heap-Allokation für Nicht-Treiber-Code (App, Modul-Layer, USB, Simulation) - Fokus auf Offenheit, Wartbarkeit und Langzeitbetrieb
| Target | Beschreibung |
|---|---|
fm_board |
STM32U575-basiertes FM-Transceiver-Board (echte Hardware) |
native_sim/native/64 |
Host-Simulation auf Linux x86-64 (primär für Entwicklung, Tests und CI) |
.
├── app/
│ ├── src/ Firmware-Quellcode (C++20)
│ │ └── sim_audio/ Simulation-Audio-Quellen (WAV, Sinus)
│ ├── boards/ Board-spezifische Overlays und Konfigurationen
│ └── sample.yaml Twister-Integration
│
├── boards/oe5xrx/
│ └── fm_board/ Custom Zephyr Board (STM32U575)
│
├── drivers/
│ └── radio/
│ └── sa818/ SA818-Treiber (Core, AT, Audio, Audio-Stream, Shell) — C-ABI
│
├── subsys/
│ └── module/ Generischer Modul-Layer (Capability-Framework)
│ └── devices/ Geräte-spezifische Capability-Implementierungen
│
├── include/
│ └── oe5xrx/
│ └── module/ Öffentliche Header (iface.h, geräteunabhängig)
│
├── dts/
│ └── bindings/ Devicetree-Bindings für OE5XRX-spezifische Nodes
│
├── tests/
│ ├── sim_shell/ Systemtests (pytest + Twister, stdin/stdout-Shell)
│ ├── etl/ ETL-Integrations- und Verhaltensnachweise
│ └── usb_audio/ USB-Audio-Tests
│
├── .github/
│ └── workflows/ CI-Workflows (GitHub Actions)
├── west.yml
└── README.md
- Zephyr RTOS (via west, wird durch
west updatebezogen) - ETL (Embedded Template Library)
20.48.0(via west, Pfadmodules/lib/etl) - Python >= 3.10 (für Twister und pytest)
- Zephyr SDK oder GNU Arm Embedded Toolchain
- Linux Host (erforderlich für
native_sim)
west init -m https://github.com/OE5XRX/FW-RemoteStation
cd FW-RemoteStation
west update
west zephyr-export
west build -b fm_board app
west build -b native_sim/native/64 app
./build/zephyr/zephyr.exe
Die Simulation bildet die gesamte Firmware-Logik auf dem Linux-Host ab:
- UART-Shell über stdin/stdout
- ADC-Emulation
- EEPROM-Simulation
- WAV-Playback
- Sinusgenerator für Audio-Tests
Beispiel-Befehle in der Shell:
fm> wav sine 1000 1.0 8000
fm> adc_read
fm> wav stop
west twister -T app --integration -v
west twister -T tests/sim_shell -p native_sim/native/64 -v
west twister -T tests/etl -p native_sim/native/64 -v
Die realen Test-Verzeichnisse sind tests/etl, tests/sim_shell und tests/usb_audio.
Unter tests/sim_shell/pytest/ treibt eine pytest-Testsuite die Firmware-Shell über
stdin/stdout an. Der enthaltene SA818Simulator implementiert das AT-Protokoll in Python und
ermöglicht vollständige Protokoll- und Capability-Tests ohne physische Hardware.
Jeder Pull Request und jeder Push auf main muss zwei CI-Jobs bestehen:
clang_format— prüft alle C/C++-Dateien (.c/.h/.cc/.hh/.cpp/.hpp) unterapp/,boards/,tests/mit clang-format-18; schlägt fehl, sobald eine Abweichung festgestellt wird.build_and_tests— bautnative_simund führt Twister aufapp --integration,tests/sim_shellundtests/etlaus.
Der Code folgt einer bewussten Zwei-Ebenen-Regel, die sich nach der Schicht richtet, nicht nach der Dateiendung:
- Treiber-Schicht (
drivers/): C-first Zephyr-Idiom — Zephyr-Gerätemodell (struct device, API-Structs), Devicetree-Makros,extern "C"-Header, Ergebnis-Enums. Kein erzwungenes C++ in der Treiber-ABI. - Nicht-Treiber-Code (App, Modul-Layer, USB, Simulation): Modernes C++20 mit ETL —
OOP, RAII,
constexpr, Namespaces, Werttypen; ETL-Container statt heap-gebundenerstd::-Äquivalente.
- Keine dynamische Speicherallokation:
new,delete,malloc,free,std::vector,std::string,std::list,std::map,std::functionund alle intern allokierenden Typen sind verboten. - Keine Ausnahmen (Exceptions): Das Projekt wird mit deaktivierten Exceptions gebaut. Fehlerbehandlung erfolgt ausschließlich über Rückgabe-/Statustypen.
- Kein RTTI: Kein
dynamic_cast, keintypeid.
Neue Funktionalität wird zuerst auf native_sim implementiert und getestet.
Hardware-spezifischer Code muss sauber gekapselt sein, damit die Logik-Schicht ohne
echte Hardware testbar bleibt.
Code, der ausschließlich auf echter Hardware testbar ist, ist ein Entwurfsproblem — die Kapselung muss dann zuerst verbessert werden.
Alle Abhängigkeiten werden über west.yml gepinnt (ETL 20.48.0). Die Firmware bleibt
bewusst schlank: Sie beschreibt sich selbst (Identität und Capabilities als maschinenlesbares
JSON) und führt Befehle aus — keine Plattform-Logik, keine Persistenz, kein Zugriffsmodell
in der Firmware.
Dieses Projekt steht unter der GNU Lesser General Public License v3.0 oder neuer (LGPL-3.0-or-later).
Änderungen und Verbesserungen am Code sollen der Community wieder zur Verfügung stehen. Kommerzielle Nutzung ist erlaubt; proprietäre Forks des Codes sind unerwünscht.
Aktiv in Entwicklung. Schwerpunkte: Simulation, Tests, CI-Stabilität.
Beiträge sind willkommen. Der verbindliche Coding-Standard, die Architektur-Übersicht,
Build- und Test-Workflow sowie die Commit- und PR-Regeln sind vollständig in
CONTRIBUTING.md beschrieben.
Für Fragen oder vor größeren Umbauten bitte zuerst ein Issue eröffnen.
Rufzeichen: OE5XRX