This project is currently in the concept and planning stage. The goal is to develop a modular embedded firmware platform inspired by ESP-IDF’s menuconfig system, providing developers with the ability to selectively enable or disable firmware components based on project requirements. The platform is designed to support multiple communication stacks, such as MQTT, LwM2M, LoRa, NFC, and Modbus, with underlying connectivity layers like LTE, Wi-Fi, and serial interfaces. The base firmware is built upon a scalable RTOS abstraction layer, supporting FreeRTOS, Zephyr, or ThreadX, allowing for cross-platform flexibility and clean task management.
This system is ideal for IoT edge devices where resource constraints require fine-grained control over which protocols and subsystems are included. Developers can easily navigate configuration options through a terminal-based menu system and compile only the features they need, saving memory and speeding up development time.
At the heart of the framework is a component-oriented architecture, where each protocol or driver is encapsulated as an independent module with clear dependencies and version control. These modules can be toggled through a menuconfig style CLI interface, powered by Kconfig or a custom YAML/JSON schema parser.
Key design goals include:
🔌 Pluggable protocols (MQTT, LwM2M, LoRa, NFC, HTTP/S, CoAP)
📡 Multi-stack networking (Wi-Fi, Ethernet, Cellular LTE, BLE)
🧵 Real-time OS abstraction (FreeRTOS/Zephyr/ThreadX support)
💬 Multiple serial communication interfaces (Modbus RTU/TCP, UART, I2C, SPI)
🧰 Tooling integration with CMake, Ninja, and Python-based build scripts
🧪 Unit testing support with Unity or CMock in CI pipelines
The base module manages system initialisation, task scheduling, and runtime diagnostics. It wraps the chosen RTOS (FreeRTOS, Zephyr, or ThreadX) in a uniform interface, allowing the same firmware to run on multiple hardware platforms. Key base features include:
RTOS task wrapper API
Tick-based or timer-based task scheduling
Power management and sleep hooks
Logging and diagnostic hooks (with UART/USB output)
Configuration storage (NVS/EEPROM/Flash)
Developers can define their board-specific startup code in a board_init() function, and register their modules using module_register() calls with dependency injection.
The framework’s configuration system mimics the familiar menuconfig workflow. It reads module definitions and dependencies from metadata files (YAML, JSON, or Kconfig format) and generates:
A config.h file with #define flags
A build.mk or CMakeLists.txt with conditional includes
A persistent .config file that can be shared or versioned
Users can select which protocols, communication stacks, and drivers they want, and the build system auto-resolves dependencies (e.g., enabling MQTT might auto-enable TCP/IP and TLS modules).
The framework plans to supports the following modules:
Connectivity:
Wi-Fi (STA/AP)
LTE (PPP or AT command modem)
LoRa
BLE
Ethernet
Protocols:
MQTT (TLS + clean session support)
LwM2M (OMA lightweight M2M)
HTTP/HTTPS client/server
Modbus RTU & TCP
CoAP, WebSockets, and MQTT-SN (roadmap)
Interfaces:
NFC/RFID (ISO14443, MIFARE)
UART, SPI, I2C device drivers
GPIO events, PWM, ADC input
Each module includes its own config file, initialization routine, and optionally a CLI/debug interface.
This project is currently in the early concept phase. The architecture and system design decisions, module boundaries, RTOS abstraction strategy, and tooling approach are actively being explored and refined. At this stage, no functional code has been written, but the overall vision, configuration model, and integration strategy are starting to take shape.
If you're interested in collaborating, offering feedback, or following progress during this design phase, feel free to connect or follow the GitHub repository for future updates.